2010-02-26 2 views
5

Ich habe Probleme, die Syntax für meine C# 2008 asp.net-Code korrekt zu bekommen. Ich brauche einen Rückgabewert zu erhalten (Select @@ Identity) von meiner gespeicherten ProzedurErhalten eines Rückgabewerts in C# asp.net aus einer gespeicherten Prozedur (Syntaxproblem)

Mein C# -Code ist:

 SqlConnection conn = new SqlConnection(strConn); 
     string sql = "usp_ClientProfile_Header"; 
     SqlCommand cmdHeader = new SqlCommand(sql, conn); 

     cmdHeader.CommandType = CommandType.StoredProcedure; 

     cmdHeader.Parameters.Add(new SqlParameter("@FirstName", SqlDbType.VarChar, 50)); 
     cmdHeader.Parameters["@FName"].Value = txtFName.Text.Trim(); 

     cmdHeader.Parameters.Add(new SqlParameter("@LastName", SqlDbType.VarChar, 50)); 
     cmdHeader.Parameters["@LName"].Value = txtLName.Text.Trim(); 

     cmdHeader.Parameters.Add(new SqlParameter("@EmailAddress", SqlDbType.VarChar, 100)); 
     cmdHeader.Parameters["@Email"].Value = txtEMail.Text.Trim(); 

     cmdHeader.Parameters.Add(new SqlParameter("@Address1", SqlDbType.VarChar, 255)); 
     cmdHeader.Parameters["@Address1"].Value = txtAddress1.Text.Trim(); 

     cmdHeader.Parameters.Add(new SqlParameter("@City", SqlDbType.VarChar, 50)); 
     cmdHeader.Parameters["@City"].Value = txtCity.Text.Trim(); 

     cmdHeader.Parameters.Add(new SqlParameter("@State", SqlDbType.VarChar, 50)); 
     cmdHeader.Parameters["@State"].Value = txtState.Text.Trim(); 

     cmdHeader.Parameters.Add(new SqlParameter("@ZipCode", SqlDbType.VarChar, 12)); 
     cmdHeader.Parameters["@Postal_Code"].Value = txtZip.Text.Trim(); 

Die nächste Zeile in meinem Code muss die "ParameterDirection.ReturnValue seine "Aber ich kann nicht scheinen, dass die Syntax korrekt ist.

Irgendwelche Ideen?

+0

Sie sagen, "Rückgabewert", was bedeutet: RETURN (@NewID) Syntax, aber Sie sagen, „select @@ Identität ", die eine Ergebnismenge zurückgibt, keinen Rückgabewert. Meine Antwort geht davon aus, dass Sie die RETURN-Syntax verwenden. Könnten Sie das klären? – AdaTheDev

+0

der Code in der gespeicherten Prozedur ist Select @@ Identität Leider kann der gespeicherte Proze nicht geändert werden. – user279521

+0

Pity-Proc kann nicht geändert werden. Bekanntlich möchte ich nur erwähnen, dass SCOPE_IDENTITY besser als @@ Identity verwendet werden sollte. Ich weiß, dass es in diesem Fall nicht anwendbar ist, nur Samen für andere ausgebend, die möglicherweise nicht http://msdn.microsoft.com/en-us/library/aa259185(SQL.80).aspx wissen –

Antwort

14

Um einen UCKGABEWERT zu erfassen (zurückgegeben von SQL mit der RETURN ({Nummer}) Syntax) verwenden:

cmdHeader.Parameters.Add("@ReturnValue", SqlDbType.Int, 4).Direction = ParameterDirection.ReturnValue; 

Außerdem sollten Sie wahrscheinlich SCOPE_IDENTITY() anstelle von @@ IDENTITY

verwenden

Edit:
So Ihre sproc wie etwas tun würde:

int newId = cmdHeader.Parameters[@ReturnValue].value; 

Edit 2:
Ok,

DECLARE @NewId INTEGER 
INSERT SomeTable(FieldA) VALUES ('Something') 
SELECT @NewId = SCOPE_IDENTITY() 
RETURN (@NewId) 

Und Ihre C# -Code dieser Wert wäre abrufen Die ursprüngliche Frage verwirrte das Problem, da der "Rückgabewert" etwas anderes ist als das, was Sie tatsächlich tun, das ein einzelnes Spaltenresultset zurückgibt.

Also, anstatt DO NICHT fügen Sie einen ReturnValue-Parameter überhaupt.Verwenden Sie einfach ExecuteScalar() wie unten ursprünglichen SqlCommand Setup mit:

int newId = Convert.ToInt32(cmdHeader.ExecuteScalar()); 
+0

Wie weise ich den Rückgabewert einer Variablen zu? – user279521

+0

@ user279521, Antwort aktualisiert – AdaTheDev

+0

NO !. Mein Proc-Code ist "Select @@ Identity" Dieser Proc kann nicht geändert werden. – user279521

0

Die Richtung wird auf einen SqlParameter Objekt, für Ihr Beispiel sollte es sein, so etwas wie:

cmdHeader.Parameters["@Postal_Code"].Direction = ParameterDirection.ReturnValue; 
+0

Für einen Rückgabewert muss ich eine CmdHeader.Parameters.Add (neue SqlParameter ("@ Postal_Code", SqlDbType.VarChar) tun , 12)); auch? – user279521

+0

Ja, der Rückgabeparameter muss neben den anderen Parametern zur Parametersammlung 'SqlCommand' hinzugefügt werden. – STW

3
SqlParameter parameterReturnValue = new SqlParameter("ReturnValue", SqlDbType.Int, 4); 
parameterReturnValue.Direction = ParameterDirection.ReturnValue; 
cmdHeader.Parameters.Add(parameterReturnValue); 

//Execute your command 
cmdHeader.ExecuteNonQuery(); 

//Get the return value 
int returnvalue = (int)myCommand.Parameters["ReturnValue"].Value; 
+1

der Code lief einwandfrei, aber kein Rückgabewert; – user279521

+0

müssen Sie Ihren ReturnValue in Ihrer gespeicherten Prozedur zuweisen. es könnte @ReturnValue sein oder was auch immer du wählst. Sie können diese Anweisung (in meinem Fall ReturnValue) verwenden: SET ReturnValue = 'Ihr Ergebnis' – madatanic

+0

Als Sie sehr viel. –

0

SQL Stored Procedure:

Angenommen Prozedur einige id/Identität gibt, wie unten

SET @ReturnValue= Scope_identity() return @ReturnValue

in C# gezeigt, dass wir kann

SqlParameter[] param = null; param = new SqlParameter[] { new SqlParameter("@idStudent",idStudent), new SqlParameter("","") // some empty parameters for return value }

//here we can update param with return type SqlParameter parOut = new SqlParameter("@ReturnValue", 0); parOut.Direction = ParameterDirection.Output; param[param.Length - 1] = parOut;

DataSet dsResult = con.executeSelectStoredProc("SP_NAME", param);