2

我有一个存储过程,它插入到表中然后执行这一行

SET @returnVal = SCOPE_IDENTITY();

之后我都尝试了:

SELECT @returnVal

return @returnVal

当我从 Microsoft SQL Server Management Studio 执行存储过程时,我得到了预期的结果SELECT @returnVal- 选择了插入数据的标识列。

但是,当我将存储过程添加到我的 ADO.Net 实体数据模型/EntityFramework 类/.edmx 类并在我的 C# 代码中执行存储过程时,我得到了返回值 -1 没有失败。

是否有可能得到我想要的值,新的身份值,返回?

我意识到我可以手动将存储过程绑定到模型中表的插入操作 - 但这不是一个选项。每次我重新生成我的模型类时,有太多的插入过程来完成这项手动工作。

4

4 回答 4

3

在过程定义中声明参数的输出类型:

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

并在调用存储过程时将其称为:

 declare @returnVal int
 exec Procedurename @returnVal output
 print @returnVal 
于 2013-08-27T17:43:19.467 回答
0

context.Database.ExecuteSqlCommand返回命令执行结果而不是查询结果。如果您需要获取数据而不是使用context.Database.SqlQuery.

SET @ReturnVal=SCOPE_IDENTITY()然后使用选择。

示例: 如何将 DbContext.Database.SqlQuery<TElement>(sql, params) 与存储过程一起使用?EF 代码优先 CTP5

于 2013-08-27T18:01:38.433 回答
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);
于 2017-07-12T10:47:23.117 回答
0

如果您打开 edmx 文件并在模型浏览器中右键单击函数导入,您可以告诉实体框架存储过程返回一个标量集合。然后,您基本上可以使用 mycontext.mysproc().Single() 调用存储过程来获取 ID。

于 2021-03-12T04:49:58.800 回答