Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Verwenden von Ausgabeparametern für gespeicherte Prozeduren in C#

Ich habe Ihre gespeicherte Prozedur leicht modifiziert (um SCOPE_IDENTITY zu verwenden ) und sieht so aus:

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

    SELECT @NewId = SCOPE_IDENTITY()
END

Ich habe dies versucht und es funktioniert einwandfrei (mit dieser modifizierten gespeicherten Prozedur):

// 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();
}

Funktioniert das auch in Ihrem Umfeld? Ich kann nicht sagen, warum Ihr ursprünglicher Code nicht funktioniert - aber wenn ich das hier mache, VS2010 und SQL Server 2008 R2, funktioniert es einfach einwandfrei ....

Wenn Sie keinen Wert zurückbekommen, dann vermute ich Ihre Tabelle Contracts möglicherweise nicht wirklich eine Spalte mit IDENTITY Eigentum darauf.