Hallo,
ich nutzte Visual Studio 2008. Ich habe eine sehr einfache stored procedure:
ALTER procedure [dbo].[stInsertProduct] (
@ProductGroupId as nvarchar(100),
@FriendlyName as nvarchar(100),
@ProductDescription as nvarchar(100)
)
as
begin
insert into Product (
fk_ProductGroupId,
FriendlyName,
ProductDescription
)
values (
@ProductGroupId,
@FriendlyName,
@ProductDescription
)
return scope_identity()
end
Über folgenden C# Code kann ich diese auch ausführen, allerdings kann ich die Id nicht speichern weil ich irgendwie gar nichts zurück bekomme. Von der Datenbank kommt aber 100% die Id zurück, weil ich es direkt im Studio getestet habe. Es liegt also irgendwie daran, dass ich die SP falsch aufrufe denke ich... hier der code:
SqlConnection Con = new SqlConnection(@"Data Source=XXX;Initial Catalog=XXXX;Integrated Security=SSPI");
Con.Open();
// SqlCommand vorbereiten
SqlCommand cmd = new SqlCommand();
cmd.Connection = Con;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = spName;
// Parameter-Auflistung füllen
cmd.Parameters.AddRange(parameters);
// SqlCommand ausführen
SqlDataReader dr = cmd.ExecuteReader();
DataSet ds = new DataSet();
DataTable dt = new DataTable("ReturnValues");
while (dr.Read())
dt.Rows.Add(dr[0]);
dr.Close();
Con.Close();
return new DataSet();
Habt ihr eine Ahnung warum das so ist?
Vielen Dank im Vorraus
MfG
Hallo mipa_acc,
schon mal statt:
// SqlCommand ausführen
SqlDataReader dr = cmd.ExecuteReader();
int neueId = (Int32)cmd.ExecuteScalar();
versucht?!
Greetz da kubi.
Edit:
DataSet ds = new DataSet();
DataTable dt = new DataTable("ReturnValues");
while (dr.Read())
{
dt.Rows.Add(dr[0]);
}
dr.Close();
Con.Close();
return new DataSet();
Zum Fehler:
Du initialisierst ein neues DataSet, danach initialisierst du eine neue DataTable.
Wofür das DataSet wenn du die Tabelle nicht zu deren Auflistung hinzufügst?
Du gibst nur ein leeres DataSet zurück, so wie es im Code aussieht.
Benutze doch beim DbCommand einen Output-Parameter, den Du nach Erledigung abfragst. Jürgen
Hallo,
habe nun alle Vorschläge probiert...
object id = cmd.ExecuteScalar();
ergibt null
in die while schleife geht er mir gleich gar nicht rein. Das hießt ja für mich, dass es nichts zu lesen gibt. Versteh ich einfach nicht 😦
Kann es sein, dass ich bei meiner StoredProcedure noch irgendetwas hinzufügen muss?
Noch irgendwelche andere Ideen? Bin ratlos
Hi,
habs nun so gelöst, dass ich meine SP umgebaut hab. Sie sieht nun so aus:
exec ('
create procedure stInsertProduct (
@ProductGroupId as nvarchar(100),
@FriendlyName as nvarchar(100),
@ProductDescription as nvarchar(100),
@NewId as int output
)
as
begin
insert into Product (
fk_ProductGroupId,
FriendlyName,
ProductDescription
)
values (
@ProductGroupId,
@FriendlyName,
@ProductDescription
)
SET @NewId = scope_identity()
return
end
')
Und mein Code so:
SqlConnection Con = new SqlConnection(@"Data Source=GAME-PC\LOCAL;Initial Catalog=Kelmendi;Integrated Security=SSPI");
Con.Open();
// SqlCommand vorbereiten
SqlCommand cmd = new SqlCommand();
cmd.Connection = Con;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = spName;
// Parameter-Auflistung füllen
cmd.Parameters.AddRange(parameters);
//Für die Rückgabe der ID
cmd.Parameters.Add(new SqlParameter("@NewId", SqlDbType.Int, 4, ParameterDirection.Output, false, 0, 50, "NewId", DataRowVersion.Default, null));
// SqlCommand ausführen
SqlDataReader dr = cmd.ExecuteReader();
Con.Close();
return (int)cmd.Parameters["@NewId"].Value;
Eventuell könntest du dir auch noch die Möglichkeiten anschauen, wie man eine SQL Abfrage bzw. eine SP ausführen kann, im speziellen denke ich an die ExecuteNonQuery Möglichkeit.
Lion1984
lg Lion
Hast du die SP nur da, um an die ID des letzten Eintrages zu kommen? Wenn du SQL 2005 oder höher verwendest, gibt es da bessere Möglichkeiten (OUTPUT).
"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)
So wie cih das sehe, willst Du nur die ID des eingefügten Eintrages auslesen.
Das geht wesentlich eleganter. Du musst in der gleichen Transaction
SELECT @@Identity
ausführen.Der Returnwert ist dann die ID innerhalb der Transaction die in der Datenbank eingefügt wurde.
Einfach ein INSERT OUTPUT Statement ab SQL 2005. Dann brauch man auch kein "gefrickel" mehr mit @@IDENTITY
"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)