Estoy intentando llamar a un procedimiento almacenado desde mi aplicación de Windows C #. El procedimiento almacenado se está ejecutando 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 investigado en línea y todos los sitios que he visto apuntan a 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 intenté usar a 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.
@ReturnVal
al procedimiento almacenado?OUTPUT
parámetro o conjunto de resultados para ese propósito.Sé que esto es antiguo, pero lo encontré con Google.
Si tiene un valor de retorno en su procedimiento almacenado, diga "Retorno 1", sin usar parámetros de salida.
Puede hacer lo siguiente: "@RETURN_VALUE" se agrega silenciosamente a cada objeto de comando. NO ES NECESARIO AGREGAR EXPLÍCITAMENTE
cmd.ExecuteNonQuery(); rtn = (int)cmd.Parameters["@RETURN_VALUE"].Value;
fuente
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;
fuente
ExecuteScalar();
funcionará, pero un parámetro de salida sería una solución superior.fuente
Puede intentar usar un parámetro de salida. http://msdn.microsoft.com/en-us/library/ms378108.aspx
fuente
Tuve un problema similar con la llamada SP que devolvió un error de que no se incluyó un parámetro esperado. Mi código fue el siguiente.
Procedimiento almacenado:
Y C#:
En la resolución de problemas, me di cuenta de que el procedimiento almacenado estaba REALMENTE buscando una dirección de "InputOutput", por lo que el siguiente cambio solucionó el problema.
r
fuente
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; }
fuente
Esta es una muestra muy breve de devolver un solo valor de un procedimiento:
SQL:
CREATE PROCEDURE [dbo].[MakeDouble] @InpVal int AS BEGIN SELECT @InpVal * 2; RETURN 0; END
Código C #:
int inpVal = 11; string retVal = "?"; using (var sqlCon = new SqlConnection( "Data Source = . ; Initial Catalog = SampleDb; Integrated Security = True;")) { sqlCon.Open(); retVal = new SqlCommand("Exec dbo.MakeDouble " + inpVal + ";", sqlCon).ExecuteScalar().ToString(); sqlCon.Close(); } Debug.Print(inpVal + " * 2 = " + retVal); //> 11 * 2 = 22
fuente
Veo que el otro está cerrado. Básicamente, aquí está el borrador de mi código. Creo que te falta el comentario de la cadena cmd. Por ejemplo, si mi procedimiento de tienda es llamar: DBO.Test. Necesitaría escribir cmd = "DBO.test". Luego haga el tipo de comando igual al procedimiento de almacenamiento, y bla, bla, bla
Connection.open(); String cmd="DBO.test"; //the command Sqlcommand mycommand;
fuente