Llamar al procedimiento almacenado con valor de retorno

Intento llamar a un procedimiento almacenado desde mi aplicación de Windows C #. El procedimiento almacenado se ejecuta en una instancia local de SQL Server 2008. Puedo llamar al procedimiento almacenado pero no puedo recuperar el valor del procedimiento almacenado. Se supone que este procedimiento almacenado devuelve el siguiente número de la secuencia. He hecho investigaciones en línea y todos los sitios que he visto han señalado que esta solución funciona.

Código de procedimiento almacenado:

ALTER procedure [dbo].[usp_GetNewSeqVal] @SeqName nvarchar(255) as begin declare @NewSeqVal int set NOCOUNT ON update AllSequences set @NewSeqVal = CurrVal = CurrVal+Incr where SeqName = @SeqName if @@rowcount = 0 begin print 'Sequence does not exist' return end return @NewSeqVal end 

Código que llama al procedimiento almacenado:

 SqlConnection conn = new SqlConnection(getConnectionString()); conn.Open(); SqlCommand cmd = new SqlCommand(parameterStatement.getQuery(), conn); cmd.CommandType = CommandType.StoredProcedure; SqlParameter param = new SqlParameter(); param = cmd.Parameters.Add("@SeqName", SqlDbType.NVarChar); param.Direction = ParameterDirection.Input; param.Value = "SeqName"; SqlDataReader reader = cmd.ExecuteReader(); 

También he intentado usar un DataSet para recuperar el valor de retorno con el mismo resultado. ¿Qué me falta para obtener el valor de retorno de mi procedimiento almacenado? Si necesita más información, hágamelo saber.

Necesita agregar un parámetro de retorno al comando:

 using (SqlConnection conn = new SqlConnection(getConnectionString())) using (SqlCommand cmd = conn.CreateCommand()) { cmd.CommandText = parameterStatement.getQuery(); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.AddWithValue("SeqName", "SeqNameValue"); var returnParameter = cmd.Parameters.Add("@ReturnVal", SqlDbType.Int); returnParameter.Direction = ParameterDirection.ReturnValue; conn.Open(); cmd.ExecuteNonQuery(); var result = returnParameter.Value; } 

Sé que esto es viejo, pero lo encontré con Google.

Si tiene un valor de retorno en su procedimiento almacenado, diga “Volver 1”, sin utilizar los parámetros de salida.

Puede hacer lo siguiente: “@RETURN_VALUE” se agrega silenciosamente a cada objeto de comando. NO NECESITA AGREGAR EXPLICITAMENTE

  cmd.ExecuteNonQuery(); rtn = (int)cmd.Parameters["@RETURN_VALUE"].Value; 

ExecuteScalar () funcionará, pero un parámetro de salida sería una solución superior.

La versión de EnterpriseLibrary en mi máquina tenía otros parámetros. Esto estaba funcionando:

  SqlParameter retval = new SqlParameter("@ReturnValue", System.Data.SqlDbType.Int); retval.Direction = System.Data.ParameterDirection.ReturnValue; cmd.Parameters.Add(retval); db.ExecuteNonQuery(cmd); object o = cmd.Parameters["@ReturnValue"].Value; 

Puede intentar usar un parámetro de salida. http://msdn.microsoft.com/en-us/library/ms378108.aspx

Tuve un problema similar con la llamada del SP que devuelve un error de que no se incluyó un parámetro esperado. Mi código era el siguiente.
Procedimiento almacenado:

@Result int OUTPUT

Y C#:

  SqlParameter result = cmd.Parameters.Add(new SqlParameter("@Result", DbType.Int32)); result.Direction = ParameterDirection.ReturnValue; 

En la solución de problemas, me di cuenta de que el procedimiento almacenado REALMENTE estaba buscando una dirección de “InputOutput”, por lo que el siguiente cambio solucionó el problema.

  r 

Result.Direction = ParameterDirection.InputOutput;

O si está utilizando EnterpriseLibrary en lugar de ADO.NET estándar …

 Database db = DatabaseFactory.CreateDatabase(); using (DbCommand cmd = db.GetStoredProcCommand("usp_GetNewSeqVal")) { db.AddInParameter(cmd, "SeqName", DbType.String, "SeqNameValue"); db.AddParameter(cmd, "RetVal", DbType.Int32, ParameterDirection.ReturnValue, null, DataRowVersion.Default, null); db.ExecuteNonQuery(cmd); var result = (int)cmd.Parameters["RetVal"].Value; } 

Veo que el otro está cerrado. Así que, básicamente, aquí está el rudo de mi código. Creo que te falta el comentario de cmd de cadena. Por ejemplo, si el procedimiento de mi tienda es llamar: DBO.Test. Necesitaría escribir cmd = “DBO.test”. Luego haga un comando tipo igual al procedimiento de almacenamiento, y bla, bla, bla

 Connection.open(); String cmd="DBO.test"; //the command Sqlcommand mycommand;