如何将值从存储过程返回到EF

时间:2016-02-12 00:15:25

标签: c# sql sql-server entity-framework

我试图通过EF调用存储过程并从存储过程中检索返回值。我用this答案作为指导。这是我的存储过程:

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<int>("EXEC usp_test @result", status);
var wasSuccessful = result.First() == 1;
if (!wasSuccessful)
{
    //DO STUFF
}

我收到此错误消息:

  

数据阅读器有多个字段。多个字段对EDM原语或枚举类型无效

我做错了什么?

5 个答案:

答案 0 :(得分:4)

在程序结束前尝试each

select @result

希望它有效。

答案 1 :(得分:0)

尝试将.First();添加到结尾...

var result = context.Database.SqlQuery<int>("EXEC usp_test @result", status).First(); 

我不这样你需要First(),因为你要返回一个值,这只能用于IEnumerable - 但要仔细检查。

var wasSuccessful = result == 1;

答案 2 :(得分:0)

我想用存储过程返回插入行的新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

答案 3 :(得分:0)

将ParameterDirection.Output更改为ParameterDirection.ReturnValue

答案 4 :(得分:-3)

如果没有任何作用,那么您可以尝试这种替代方法:

  1. 在PROC中计算结果并将其保存在数据库中的表中
  2. 在EF代码中读取该表中的数据。
  3. 但是,如果你有一个可并行运行许多这样的EF代码的并发系统,那么你的存储过程需要变得更加复杂以处理并发。

    谢谢,希望这可能有所帮助。