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

stored - recuperar parametro de salida c#



Usar parĂ¡metros de salida de procedimiento almacenado en C# (4)

Antes de cambiar el procedimiento almacenado, compruebe cuál es el resultado de su actual. En SQL Server Management, ejecute lo siguiente:

DECLARE @NewId int EXEC @return_value = [dbo].[usp_InsertContract] N''Gary'', @NewId OUTPUT SELECT @NewId

Vea lo que devuelve. Esto puede darle algunos indicios de por qué su param no está lleno.

Tengo un problema al devolver un parámetro de salida de un procedimiento almacenado en el servidor Sql a una variable C #. He leído las otras publicaciones relacionadas con esto, no solo aquí, sino en otros sitios, y no puedo hacer que funcione. Esto es lo que tengo actualmente. Actualmente estoy tratando de imprimir el valor que vuelve. El siguiente código devuelve un valor nulo. Lo que intento devolver es la clave principal. He intentado usar @@IDENTITY y SCOPE_INDENTITY() (es decir, SET @NewId = SCOPE_IDENTITY() ).

Procedimiento almacenado:

CREATE PROCEDURE usp_InsertContract @ContractNumber varchar(7), @NewId int OUTPUT AS BEGIN INSERT into [dbo].[Contracts] (ContractNumber) VALUES (@ContractNumber) Select @NewId = Id From [dbo].[Contracts] where ContractNumber = @ContractNumber END

Abriendo la base de datos:

pvConnectionString = "Server = Desktop-PC//SQLEXPRESS; Database = PVDatabase; User ID = sa; PASSWORD = *******; Trusted_Connection = True;"; try { pvConnection = new SqlConnection(pvConnectionString); pvConnection.Open(); } catch (Exception e) { databaseError = true; }

Ejecutando el comando:

pvCommand = new SqlCommand("usp_InsertContract", pvConnection); pvCommand.Transaction = pvTransaction; pvCommand.CommandType = CommandType.StoredProcedure; pvCommand.Parameters.Clear(); pvCommand.Parameters.Add(new SqlParameter("@ContractNumber", contractNumber)); SqlParameter pvNewId = new SqlParameter(); pvNewId.ParameterName = "@NewId"; pvNewId.DbType = DbType.Int32; pvNewId.Direction = ParameterDirection.Output; pvCommand.Parameters.Add(pvNewId); try { sqlRows = pvCommand.ExecuteNonQuery(); if (sqlRows > 0) Debug.Print("New Id Inserted = ", pvCommand.Parameters["@NewId"].Value.ToString()); } catch (Exception e) { Debug.Print("Insert Exception Type: {0}", e.GetType()); Debug.Print(" Message: {0}", e.Message); } }


En su código C #, está utilizando la transacción para el comando. Simplemente realice la transacción y luego acceda a su valor de parámetro, obtendrá el valor. Trabajó para mi. :)


Modifiqué ligeramente su procedimiento almacenado (para usar SCOPE_IDENTITY ) y se ve así:

CREATE PROCEDURE usp_InsertContract @ContractNumber varchar(7), @NewId int OUTPUT AS BEGIN INSERT INTO [dbo].[Contracts] (ContractNumber) VALUES (@ContractNumber) SELECT @NewId = SCOPE_IDENTITY() END

Intenté esto y funciona bien (con ese procedimiento almacenado modificado):

// define connection and command, in using blocks to ensure disposal using(SqlConnection conn = new SqlConnection(pvConnectionString )) using(SqlCommand cmd = new SqlCommand("dbo.usp_InsertContract", conn)) { cmd.CommandType = CommandType.StoredProcedure; // set up the parameters cmd.Parameters.Add("@ContractNumber", SqlDbType.VarChar, 7); cmd.Parameters.Add("@NewId", SqlDbType.Int).Direction = ParameterDirection.Output; // set parameter values cmd.Parameters["@ContractNumber"].Value = contractNumber; // open connection and execute stored procedure conn.Open(); cmd.ExecuteNonQuery(); // read output value from @NewId int contractID = Convert.ToInt32(cmd.Parameters["@NewId"].Value); conn.Close(); }

¿Esto también funciona en tu entorno? No puedo decir por qué su código original no funcionará, pero cuando hago esto aquí, VS2010 y SQL Server 2008 R2, simplemente funciona perfectamente ...

Si no recupera un valor, entonces sospecho que los Contracts tabla podrían no tener realmente una columna con la propiedad IDENTITY .


Procedimiento almacenado.........

CREATE PROCEDURE usp_InsertContract @ContractNumber varchar(7) AS BEGIN INSERT into [dbo].[Contracts] (ContractNumber) VALUES (@ContractNumber) SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY] END

DO#

pvCommand.CommandType = CommandType.StoredProcedure; pvCommand.Parameters.Clear(); pvCommand.Parameters.Add(new SqlParameter("@ContractNumber", contractNumber)); object uniqueId; int id; try { uniqueId = pvCommand.ExecuteScalar(); id = Convert.ToInt32(uniqueId); } catch (Exception e) { Debug.Print(" Message: {0}", e.Message); } }

EDITAR: "Todavía obtengo un valor DBNull ... No se puede convertir objetos de DBNull a otros tipos. Volveré a ocuparme mañana. Me voy a mi otro trabajo".

Creo que la columna Id en su tabla SQL no es una columna de identidad.