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.