2013-05-30 39 views
1

在我的项目中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 
+0

我对EF不是很有经验,但是有可能因为你返回1或选择了'Scope_Identity()'而遇到困难?你能否尝试将'Select Scope_Identity()'改为'RETURN Scope_Identity()',看看它是否有所作为? – Sean

+0

如果这样不能解决问题(我没有太高的期望),那么让其他人看到EF正在使用的代码来获得这个SP的结果,模型代码或者其他任何东西都是有帮助的 – Sean

+0

no ,我测试过使用return。但是现在它在两种情况下都显示相同的错误。后来,只有当条件满足时才显示。 –

回答

1

错误告诉我们,EF期待一个结果集,当我们使用RETURN我们没有得到结果组。你的错误意味着存储过程返回一个整数,但是EF期待一个小数,所以我们只需将所选的值改为十进制。

所以修改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) 
+0

非常感谢。它解决了我的问题。 –

+0

完全没问题=] – Sean

+0

如果Sp返回十进制和整数,而没有在sp级别进行强制转换,则可以采取其他方式在Ef级别进行处理,以便Ef可以同时接受并可以在代码级别使用或转换。 –