【问题标题】:Entity Framework shows error when called stored procedure实体框架在调用存储过程时显示错误
【发布时间】:2013-05-30 09:32:50
【问题描述】:

在我的项目中,EF 调用了一个如下所示的存储过程。它返回 1 或范围标识。

在 EF 函数导入时,存储过程以十进制返回类型列出。

当存储过程返回作用域标识时,一切正常。

但是当sp的条件满足时,ef抛出错误为

存储数据提供程序返回的数据读取器没有足够的列用于请求的查询。

请帮忙..

这是我的存储过程:

@VendorId int,
    @ueeareaCode varchar(3),
    @TuPrfxNo varchar(3),
    @jeeSfxNo varchar(4),
    @Tjode varchar(3),
    @uxNo varchar(3),
    @TyufxNo varchar(4),
    @Iyuy bit


AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from

    SET NOCOUNT ON;

     IF EXISTS (Select dfen_id
                    from dbo.efe_phfedwn_eflwn
                    where
                    [yu] = @Tyuode and
                    [uy] = @TuyxNo and
                    [yuno] = @Tuo)
                    return 1
    ELSE
        Begin
            INSERT INTO dbo.yu 
                         ....................                       
            Select Scope_Identity()
    End
END

【问题讨论】:

  • 我对 EF 不是很有经验,但是否有可能因为您返回 1 或选择 Scope_Identity() 它有困难?您可以尝试将Select Scope_Identity() 更改为RETURN Scope_Identity() 看看是否会有所不同?
  • 如果这不能解决它(我没有寄予厚望),它会有助于其他人看到 EF 用于获取此 SP 的结果的代码,模型代码或任何东西
  • 不,我已经使用 return 进行了测试。但现在它在两种情况下都显示相同的错误。后来,它只有在条件满足时才会显示。
  • 好吧,也许解决方案实际上是相反的,您只需使用SELECT 1SELECT Scope_Identity()
  • 使用 select 时,else 条件可以,但在 if 条件下,它不能将 int32 转换为 decimal 。请帮助。我的 Ef 输出为十进制。

标签: asp.net entity-framework c#-4.0 stored-procedures


【解决方案1】:

错误告诉我们 EF 需要一个结果集,而当我们使用 RETURN 时,我们没有得到结果集。您的错误意味着存储过程返回一个整数,但 EF 需要一个小数,所以我们只需 CAST 将所选值转换为小数。

所以修改SQL让我们SELECT而不是RETURN,就像这样(不要忘记使用CAST):

 IF EXISTS (Select cntct_ctr_phn_ln_id
                from dbo.cntct_ctr_phn_ln
                where
                [toll_free_phn_area_cd] = @TollfreeareaCode and
                [toll_free_phn_prfx_no] = @TollfreePrfxNo and
                [toll_free_phn_sfx_no] = @TollfreeSfxNo)
                SELECT CAST(1 AS decimal)

然后还有CASTSCOPE_IDENTITY()的结果到小数点:

SELECT CAST(SCOPE_IDENTITY() AS decimal)

【讨论】:

  • 如果 Sp 返回十进制和整数,而不在 sp 级别进行强制转换,是在 Ef 级别处理的任何其他方式,以便 Ef 可以接受两者并可以在代码级别使用或转换。
  • 我真的不能告诉你。您也许可以覆盖 EF 构建对象的默认逻辑,但恐怕我的理解还没有那么远。
  • 但是如果我们需要 return 语句而不是 select 语句来返回 Sprocs 中的 ID 呢?
  • 我不太确定,但是this question似乎建议你应该使用EXEC将存储过程的返回值选择为输出参数,然后选择参数的值一旦查询执行完毕。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多