valor stored salida retorno retornar recuperar procedimiento parametros parametro obtener ejecutar devolver datos con almacenado c# sql-server stored-procedures ado.net return-value

c# - stored - Llamar al procedimiento almacenado con valor de retorno



recuperar parametro de salida c# (8)

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.


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;


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


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



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;


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;


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;