Tôi đã sửa đổi một chút quy trình đã lưu trữ của bạn (để sử dụng SCOPE_IDENTITY
) và nó trông như thế này:
CREATE PROCEDURE usp_InsertContract
@ContractNumber varchar(7),
@NewId int OUTPUT
AS
BEGIN
INSERT INTO [dbo].[Contracts] (ContractNumber)
VALUES (@ContractNumber)
SELECT @NewId = SCOPE_IDENTITY()
END
Tôi đã thử điều này và nó hoạt động tốt (với quy trình được lưu trữ đã sửa đổi đó):
// 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();
}
Điều này cũng hoạt động trong môi trường của bạn? Tôi không thể nói tại sao mã gốc của bạn không hoạt động - nhưng khi tôi làm điều này ở đây, VS2010 và SQL Server 2008 R2, nó hoạt động hoàn hảo ....
Nếu bạn không nhận lại được giá trị - thì tôi nghi ngờ bảng của bạn Contracts
có thể không thực sự có một cột có IDENTITY
tài sản trên đó.