【问题标题】:Calling Stored Procedure In Entity Framework在实体框架中调用存储过程
【发布时间】:2017-08-15 19:12:22
【问题描述】:

我在 SQL Server 存储过程的末尾有以下部分:

if(@someValue < 0)
  begin
    SELECT @resultIsSuccess = 0
    Return @resultIsSuccess
  end
else
  begin
    SELECT @resultIsSuccess = 1
    Return @resultIsSuccess
  end

其中@resultIsSuccess 的类型为bit。

所以,基本上我会返回一个布尔值来指示该过程是否产生了预期的结果。

在 EF 方面,我将 Function Import 的返回类型配置为布尔值。

当我打电话时:

bool isSuccess = context.MyFunctionImport(arg1, arg2).FirstOrDefault().Value;

我得到以下异常:

存储数据提供者返回的数据读取器没有 为所请求的查询提供了足够的列。

这里有什么问题?

【问题讨论】:

  • 为什么不尝试SELECT 0 或SELECT 1 而不是添加额外的行并声明一个变量?这可能是因为您实际上并没有“读取”任何内容,而是输出到返回变量。
  • 永远不要使用存储过程的返回值来返回数据。使用输出参数或结果集。

标签: c# sql-server entity-framework


【解决方案1】:

如果你要返回一个值,你需要一个返回参数。因此,您没有使用datareader 来获得您的价值。您没有selecting 任何东西,因此您需要访问该返回参数。

而不是 select 填充 datareader 的值,因为当您尝试通过 EF 从未实例化的 datareader 读取值时可能会遇到错误。

if(@someValue < 0)
    SELECT 0
else
    SELECT 1

我不确定是否支持返回值,reference,所以除非在较新的版本中修复,否则您可能正在尝试做不可能的事情。

【讨论】:

    【解决方案2】:

    您必须记住,您不会从您的过程中返回位数据类型。存储过程的返回数据类型是 int。

    您可以将代码大大简化为单行返回语句。

    return case when @someValue < 0 then 0 else 1 end
    

    然后在您的代码中,您需要将 0 或 1 解析为布尔值。

    --编辑-- 由于您正在寻找第一个值,因此您需要在过程中使用 select 语句。像这样。

    Select isSuccess  = case when @someValue < 0 then 0 else 1 end
    

    【讨论】:

    • 我试过了,但它调用函数总是返回 1。即使我将返回值更改为数字,例如 5 或 6,它也返回 1。
    • 您如何检查您的退货?返回值。老实说,您可能应该使用 OUTPUT 参数。
    • 我在做 int isSuccess = context.MyFunctionImport(arg1, arg2);
    • 啊....那么您从过程中的第一个 select 语句中获取值...而不是返回值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-25
    相关资源
    最近更新 更多