我有一个插入表中的存储过程然后执行此行
SET @returnVal = SCOPE_IDENTITY();
之后我尝试了两个:
SELECT @returnVal
和
return @returnVal
当我从Microsoft SQL Server Management Studio执行存储过程时,我得到了SELECT @returnVal
的预期结果 - 选择了插入数据的标识列。
但是,当我将存储过程添加到我的ADO.Net实体数据模型/ EntityFramework类/ .edmx类并在我的C#代码中执行存储过程时,我得到了返回的值-1。
是否有可能获得我想要的值,新的身份值,返回?
我意识到我可以手动将存储过程绑定到模型中表的插入操作 - 但这不是一个选项。每次重新生成我的模型类时,都有太多的插入程序来完成这个手动工作。
答案 0 :(得分:2)
在过程定义中声明参数的输出类型:
create procedure [dbo].[Procedurename] @returnVal int output
as
SET @returnVal = SCOPE_IDENTITY();
并在调用存储过程时将其命名为:
declare @returnVal int
exec Procedurename @returnVal output
print @returnVal
答案 1 :(得分:0)
context.Database.ExecuteSqlCommand
返回命令执行结果而不是查询结果。
如果您需要获取数据而不是使用context.Database.SqlQuery
。
SET @ReturnVal=SCOPE_IDENTITY()
然后使用select。
答案 2 :(得分:0)
取自OPs问题
添加输出参数(答案标记如下)。
存储过程签名现在看起来像这样:
我的存储过程签名现在看起来像这样:
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);
答案 3 :(得分:0)
如果您打开 edmx 文件并右键单击模型浏览器中的函数导入,您可以告诉实体框架该存储过程返回一个标量集合。然后,您基本上可以使用 mycontext.mysproc().Single() 调用 sproc 以获取 ID。