如何将值从存储过程返回到EF
我试图通过EF调用存储过程并从存储过程中检索返回值。 我用这个答案作为指导。 这是我的存储过程:
CREATE PROCEDURE [dbo].[usp_test] ( @result int OUT ) AS BEGIN --DO STUFF SET @result = 0 END
以下是我如何从EF调用它:
var status = new SqlParameter { ParameterName = "result", DbType = DbType.Int32, Direction = ParameterDirection.Output }; var result = context.Database.SqlQuery("EXEC usp_test @result", status); var wasSuccessful = result.First() == 1; if (!wasSuccessful) { //DO STUFF }
我收到此错误消息:
数据阅读器有多个字段。 多个字段对EDM原语或枚举类型无效
我究竟做错了什么?
在程序结束前尝试select @result
。
CREATE PROCEDURE [dbo].[usp_test] ( @result int OUT ) AS BEGIN --DO STUFF SET @result = 0 Select @result END
希望它有效。
尝试添加.First();
到最后…
var result = context.Database.SqlQuery("EXEC usp_test @result", status).First();
我不这样你需要First()
,因为你要返回一个值,这只能用于IEnumerable – 但需要仔细检查。
var wasSuccessful = result == 1;
我想用存储过程返回插入行的新id。 所以我也做了一个OUTPUT参数。 在使用EF6的C#中,我得到如下:
using System.Data.Entity.Core.Objects; ... db = new myEntities1(); ObjectParameter returnId = new ObjectParameter("returnId", DbType.Int64); db.postLogItem("New item.", returnId); MessageBox.Show("Logitem added. New returnId: " + (int)returnId.Value);
存储过程中变量的名称需要与调用ObjectParameter的构造函数的名称匹配。
CREATE PROCEDURE [dbo].[postLogItem] @description nvarchar(200), @returnId bigint OUTPUT AS BEGIN SET NOCOUNT ON; INSERT INTO dbo.LogItem ( time, description ) VALUES ( GETDATE(), @description ); SET @returnId = SCOPE_IDENTITY(); END
将ParameterDirection.Output更改为ParameterDirection.ReturnValue
如果没有任何作用,那么您可以尝试这种替代方法
- 在PROC中计算结果并将其保存在数据库的表中
- 在EF代码中读取该表中的数据。
但是,如果你有一个可以并行运行许多这样的EF代码的并发系统,那么你的存储过程需要变得更复杂,以处理并发。
谢谢,希望这可能有所帮助。