无法从存储过程返回最后插入的行

时间:2016-05-01 05:07:14

标签: c# sql-server entity-framework stored-procedures

我试图从存储过程中获取最后一个插入的id,但我不能。

我想要的就是获得SCOPE_IDENTITY()

我的存储过程如下所示:

CREATE PROCEDURE [dbo].[sp_InsertProduct]
    @ProductName varchar(30),
    @ProductPrice decimal ,
    @ProductQuantity int,
    @id int output
AS
BEGIN
    INSERT INTO Product (ProductName, ProductPrice, ProductQuantity) 
    VALUES (@ProductName, @ProductPrice, @ProductQuantity)

    SET @id = SCOPE_IDENTITY()
    RETURN  @id
END

这是我的C#代码

var ProductParameters = new[] {
    new SqlParameter("@ProductName", Product.ProductName),
    new SqlParameter ("@ProductPrice", Product.ProductPrice),
    new SqlParameter ("@ProductQuantity", Product.ProductQuantity)
};

var y = db.Database.ExecuteSqlCommand("EXEC sp_InsertProduct @ProductName, @ProductPrice, @ProductQuantity", ProductParameters);

2 个答案:

答案 0 :(得分:1)

您真的不需要@id变量。

CREATE PROCEDURE [dbo].[sp_InsertProduct]


    @ProductName varchar(30),
    @ProductPrice decimal ,
    @ProductQuantity int,

AS

BEGIN


INSERT INTO Product (ProductName,ProductPrice,ProductQuantity) VALUES  (@ProductName,@ProductPrice,@ProductQuantity)



RETURN SCOPE_IDENTITY();

END

答案 1 :(得分:1)

您只需从存储过程中返回值(无需输入参数):

CREATE PROCEDURE [dbo].[sp_InsertProduct]
    @ProductName varchar(30),
    @ProductPrice decimal ,
    @ProductQuantity int
AS
BEGIN
    INSERT INTO Product (ProductName,ProductPrice,ProductQuantity) VALUES  (@ProductName,@ProductPrice,@ProductQuantity)        
    RETURN SCOPE_IDENTITY()
END

然后从您的C#代码中获得一个输出参数,其中包含SP的返回值:

var returnValue = new SqlParameter("@ReturnValue", SqlDbType.Int)
    {
       Direction = ParameterDirection.Output
    };

var ProductParameters = new[]{
   new SqlParameter("@ProductName",Product.ProductName),
   new SqlParameter ("@ProductPrice",Product.ProductPrice),
   new SqlParameter ("@ProductQuantity",Product.ProductQuantity),
   returnValue
};

db.Database.ExecuteSqlCommand("EXEC @ReturnValue = sp_InsertProduct @ProductName,@ProductPrice,@ProductQuantity", ProductParameters);

var scopeIdentity = (int)returnValue.Value;