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;
}
Puede intentar usar un parámetro de salida. http://msdn.microsoft.com/en-us/library/ms378108.aspx
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;