2010-02-26 103 views
5

Tengo problemas para intentar corregir la sintaxis de mi código asp.net C# 2008. que necesito para obtener un valor de retorno (Select @@ identidad) de mi procedimiento almacenadoObtener un valor de retorno en C# asp.net de un procedimiento almacenado (problema de sintaxis)

Mi código C# es:

 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(); 

La siguiente línea en mi código tiene que ser el "ParameterDirection.ReturnValue "pero parece que no puedo obtener la sintaxis correcta".

¿Alguna idea?

+0

se dice "valor de retorno", que implica: RETORNO sintaxis (@NewID), pero se dice "select @@ Identidad "que devolverá un conjunto de resultados, no un valor de retorno. Mi respuesta asume que estás usando la sintaxis RETORNO. ¿Podrías aclarar? – AdaTheDev

+0

el código en el proceso almacenado es Seleccionar @@ Identidad Desafortunadamente, el proceso almacenado no se puede modificar. – user279521

+0

Pity proc no se puede modificar. Sabiendo que me gustaría mencionar que SCOPE_IDENTITY se debe usar con preferencia a @@ Identity. Sé que no es aplicable en este caso, solo esparciendo semillas por otras que pueden no saber http://msdn.microsoft.com/en-us/library/aa259185(SQL.80).aspx –

Respuesta

14

Para capturar un valor de retorno (devuelto por SQL utilizando la ({número}) sintaxis RETORNO) usan:

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

Además, es probable que debe utilizar SCOPE_IDENTITY() en lugar de @@ IDENTITY

Editar:
Así que su sproc haría algo como:

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

Y su código C# para recuperar ese valor sería:

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

Edición 2:
Ok, la pregunta original confundió el problema ya que el "valor de retorno" es una cosa diferente a lo que realmente está haciendo, que es devolver un conjunto de resultados de una sola columna.

Por lo tanto, en su lugar NO agregue un parámetro ReturnValue en absoluto.Sólo tiene que utilizar ExecuteScalar() usando la configuración de SqlCommand original como a continuación:

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

¿Cómo asigno el valor de retorno a una variable? – user279521

+0

@ user279521, respuesta actualizada – AdaTheDev

+0

¡NO !. Mi código de proceso es "Seleccionar @@ Identidad" Este proceso no se puede modificar. – user279521

0

La dirección se establece en un objeto SqlParameter, por su ejemplo que debería ser algo como:

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

Para obtener un valor de retorno, ¿tengo que hacer un cmdHeader.Parameters.Add (nuevo SqlParameter ("@ Postal_Code", SqlDbType.VarChar) , 12)); también? – user279521

+0

Sí, el parámetro de devolución debe agregarse a la colección de parámetros 'SqlCommand' junto con los otros parámetros. – 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

el código se ejecutó bien, pero sin valor de retorno; – user279521

+0

necesita asignar su ReturnValue en su procedimiento almacenado. podría ser @ReturnValue o lo que elija. puede usar esta declaración (en mi caso ReturnValue): SET ReturnValue = 'Su resultado' – madatanic

+0

Than You Very Much. –

0

procedimiento almacenado de SQL:

Supongamos procedimiento devuelve un documento de identidad/identidad como se muestra a continuación

SET @ReturnValue= Scope_identity() return @ReturnValue

en C# que puede

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);

Cuestiones relacionadas