【问题标题】:Entity Framework 4: The selected stored procedure returns no columns实体框架 4:选定的存储过程不返回任何列
【发布时间】:2013-11-13 22:39:51
【问题描述】:

在我的 SP 中,我混合使用了静态 SQL 和动态 SQL:

declare @result table
(
 RowNum bigint,
 Id_and_Title varchar(max),
 DaysLeft int,
 cat_id int
);

然后,在动态 SQL 中,我将结果插入到该表中:

DECLARE @TSQL NVARCHAR(max);
SET @TSQL = ......

(我用print @TSQL所以我确定查询没问题)

insert into @result
EXECUTE sp_executesql @TSQL

select * from @result

但是,当我尝试在 VS 2010 Ultimate 中导入 taht SP 时,我看到了标题中提到的消息。是什么原因造成的?很多次我都发生了这个错误,但我仍然不知道是什么原因造成的

【问题讨论】:

  • 您在什么时候收到错误消息?当你“从数据库更新模型”,或者当你创建函数导入,或者当你创建复杂类型时......
  • 我从模型中删除了 SP,然后我从数据库中更新了它,当我导入那个 SP 时,我得到了那个错误
  • 在我使用我的函数的动态 SQL 中,这会导致问题,但为什么呢?我不知道...

标签: tsql stored-procedures entity-framework-4


【解决方案1】:

尝试将此行添加到存储过程的开头:
SET FMTONLY OFF
您可以在完成导入后将其删除。

this article 中提到了它(有点远),它对我有用,尽管在我严重依赖存储过程的时候我最终回到了 ADO.NET。请记住,如果您的列根据动态 SQL 发生变化,您的实体模型将会中断。

【讨论】:

  • 太棒了。文章链接现在对我不起作用,但我发现原因是 select 语句在执行之前不会被评估,所以 EF 在添加导入时不会检测到列。 set fmtonly off 强制发送列信息。
  • 这对我有用。我的 proc 从临时表中返回一个选择,并且 EF 无法获取列数据。非常感谢!
【解决方案2】:

我不确切知道您的返回类型是什么,但如果您的返回类型数量有限(并且相对较少),您可以创建一个用户定义的表类型并将其返回。

CREATE TYPE T1 AS TABLE 
( ID bigint NOT NULL
  ,Field1 varchar(max) COLLATE Latin1_General_CI_AI NOT NULL
  ,Field2 bit NOT NULL
  ,Field3 varchar(500) NOT NULL
  );
GO

那么在程序中:

DECLARE @tempTable dbo.T1

INSERT @tempTable (ID, Field1, Field2, Field3)
SELECT .....

....

SELECT * FROM @tempTable

现在 EF 应该能够识别返回的列类型了。

【讨论】:

    猜你喜欢
    • 2012-07-19
    • 2015-05-14
    • 2012-05-07
    • 2014-08-20
    • 2011-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多