2016-05-01 34 views
1

我想從存儲過程獲取最後一個插入的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); 
+0

@id不應該是一個OUTPUT參數:只需返回值即可。我懷疑SQL命令調用會引發一個錯誤:注意任何這樣的「什麼都行不通」的結果。 – user2864740

+1

備註:您應該**不要**爲存儲過程使用'sp_'前綴。微軟已經保留了這個前綴以供自己使用(參見*命名存儲過程*)](http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx),以及你將來有可能冒着名字衝突的風險。 [這對你的存儲過程性能也是不利的](http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix)。最好只是簡單地避免使用'sp_'並將其他內容用作前綴 - 或者根本沒有前綴! –

回答

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; 
+0

,它的工作!謝謝上帝保佑你 – Lucy

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 
+0

感謝您的幫助,但是如何獲取C#代碼中的SCOPE_IDENTITY()? – Lucy

+0

我不知道如果我會EXEC(通過SQL查詢)存儲過程,就像你已經在做。在任何情況下,下面的答案也會起作用。但只是爲了回答你的問題,我會做類似於:https://msdn.microsoft.com/en-us/library/37hwc7kt(v=vs.100).aspx ...創建cmd對象並分隔參數像這樣:https://msdn.microsoft.com/en-us/library/80x06z3b(v=vs.100).aspx –

相關問題