2

我有一個插入到表中的存儲過程,然後執行此行實體框架和SCOPE_IDENTITY

SET @returnVal = SCOPE_IDENTITY(); 

之後,我都試過:

SELECT @returnVal 

return @returnVal 

當我從Microsoft SQL Server Management Studio執行存儲過程時,我得到預期的結果SELECT @returnVal - 選擇插入數據的標識列。

但是,當我將存儲過程添加到我的ADO.Net實體數據模型/ EntityFramework類/ .edmx類並在我的C#代碼中執行存儲過程時,我得到的值-1返回時沒有失敗。

是否有可能獲得我想要的值,新的標識值返回?

我意識到我可以手動將存儲過程綁定到我的模型中表的插入動作 - 但這不是一個選項。每次重新生成我的模型類時,都有太多插入過程來完成這個手動工作。

+0

可能的重複[從插入SQL Server獲取SCOPE \ _IDENTITY](http://stackoverflow.com/questions/4918574/getting-scope-identity-from-sql-server-on-insert) – Grax

+2

您使用ExecuteNonQuery當你應該使用ExecuteScalar? – Grax

+0

和執行代碼是?NonQuery任何機會 –

回答

2

聲明參數的輸出類型在你的程序中定義:

create procedure [dbo].[Procedurename] @returnVal int output 
as 
SET @returnVal = SCOPE_IDENTITY(); 

,並同時調用存儲過程調用它:

declare @returnVal int 
exec Procedurename @returnVal output 
print @returnVal 
+0

這工作。我的新代碼被添加到帖子中。 – Dudeman3000

+0

請將回復標爲答案,以防止它的工作:) – Sonam

+0

完成,謝謝索南! – Dudeman3000

0

context.Database.ExecuteSqlCommand返回命令執行結果,而不是查詢結果。 如果您需要獲取數據,請使用context.Database.SqlQuery

SET @ReturnVal=SCOPE_IDENTITY()然後使用select。

實施例: How to use DbContext.Database.SqlQuery<TElement>(sql, params) with stored procedure? EF Code First CTP5

+1

這很可能是一個很好的解決方案,但是我將另一個解決方案標記爲答案bc它解決了我的問題,我不必改變我調用存儲過程的方式(w EF DbContext) - 我只需要做向存儲過程和C#代碼添加了一個輸出參數。 – Dudeman3000

0

從OP的採取質疑

添加一個輸出參數的工作(下面標記爲回答)。

存儲過程的簽名,現在看起來是這樣的:

我的存儲過程的簽名,現在看起來是這樣的:

CREATE PROCEDURE SP_MyStoreProc ([Multiple Parameters], @returnVal int output) 

存儲過程的最後一行是:

return @returnVal 

我現在C#代碼看起來像這樣:(db是我的dbContext類的一個實例)

System.Data.Objects.ObjectParameter identityParameter = 
new System.Data.Objects.ObjectParameter("returnVal", 0); 

db.SP_MyStoredProc([Multiple Parameters], identityParameter); 

int myNewIdentity = Convert.ToInt32(identityParameter.Value);