在实体框架中调用存储过程

时间:2017-08-15 19:12:22

标签: c# sql-server entity-framework

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

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

其中@resultIsSuccess的类型为bit

所以,基本上我正在返回一个bool来表明该程序是否产生了预期的结果。

在EF端,我将Function Import的返回类型配置为boolean。

我打电话的时候:

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

我得到以下异常:

  

商店数据提供商返回的数据阅读器没有   足够的列用于请求的查询。

这里有什么问题?

2 个答案:

答案 0 :(得分:2)

如果要返回值,则需要返回参数。因此,您没有使用datareader来获取价值。您不是select任何东西,因此您需要有权访问该返回参数。

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

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

我不确定是否支持返回值reference,因此您可能会尝试执行不可能的操作,除非在较新版本中修复。

答案 1 :(得分:0)

您必须记住,您没有从过程中返回一些数据类型。存储过程的返回数据类型是int。

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

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

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

- EDIT-- 由于您要查找第一个值,因此需要在过程中使用select语句。这样的事情。

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