Tengo un problema al devolver un parámetro de salida de un procedimiento almacenado de SQL Server en 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()
).Uso de parámetros de salida de procedimiento almacenado en C#
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
Abrir 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;
}
La ejecución del 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);
}
}
También usaría SCOPE_IDENTITY() en lugar de volver a consultar la misma tabla, y en caso de que aparezca el error "la consulta puede devolver varios resultados", al asignar a una sola salida var. – JMC
¿Utilizo el comando set para hacer esto?SET NewId = SCOPE_IDENTITY()? Reemplacé la declaración de selección con lo siguiente ... SET @NewId = SCOPE_IDENTITY() y aún recibo un valor nulo de nuevo. – Gary
Por supuesto, puede confirmar que el nuevo registro está realmente insertado, ¿verdad? ¿Podría mostrar más de su código C# (la apertura de la conexión, la creación de comandos, etc.) – Steve