Ich habe diese Stored Procedure geschrieben:Warum gibt SCOPE_IDENTITY() -1 zurück?
ALTER PROCEDURE [cairs].[sp_SaveR]
-- Add the parameters for the stored procedure here
@fname nvarchar(50),
@lname nvarchar(50),
@mname nchar(10),
@sigDate date
AS
BEGIN
SET NOCOUNT ON;
insert into tUser
(fname,
lname,
mname,
sigDate
)
values
(
@fname,
@lname,
@mname,
@sigDate)
select SCOPE_IDENTITY()
END
Dies ist der C# -Code ich um eine Verbindung herzustellen verwenden:
try
{
using (SqlConnection conn = new SqlConnection(cCon.getConn()))
{
using (SqlCommand cmd = conn.CreateCommand())
{
conn.Open();
cmd.CommandText = "sp_SaveR";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new SqlParameter("@fname", fName));
cmd.Parameters.Add(new SqlParameter("@lname", lName));
cmd.Parameters.Add(new SqlParameter("@mname", mName));
cmd.Parameters.Add(new SqlParameter("@sigDate", sigDate));
int userID = (int)cmd.ExecuteNonQuery();
}
}
}
catch (Exception ex)
{
throw(ex);
}
Mein userID
ist immer -1 Rückkehr, obwohl die Datensätze erfolgreich eingefügt werden in die DB-Tabelle. Warum passiert das?
'ExecuteNonQuery' scheint, wie die falsche Methode, die hier verwendet werden - sicherlich wollen, sind Sie die Ergebnisse der letzten Abfrage verbrauchen, so' ExecuteReader' (oder wahrscheinlicher , 'ExecuteScalar') erscheint angemessen. Auch nicht relevant für Ihr aktuelles Problem, aber Sie sollten das Präfix 'sp_' vermeiden - es ist von Microsoft für seine Systemprozeduren reserviert. –
Das ist, weil Sie den Rückgabewert von Ihrer Prozedur erhalten. Sie sollten eine OUTPUT-Variable verwenden. Als Randnotiz sollten Sie in Erwägung ziehen, das Präfix sp_ nicht zu verwenden (oder besser gar kein Präfix). http://sqlperformance.com/2012/10/t-sql-queries/sp_prefix –
danke euch beiden! Ich hatte keine Ahnung von der SP, ich dachte, es wäre die Norm für gespeicherte Verfahren benennen: -/ –