为什么Entity Framework无法查看我的存储过程的列信息?

Rod*_*ner 31 stored-procedures entity-framework entity-framework-4

我有以下存储过程,当我尝试功能导入时,我说我的存储过程不返回任何列.我错过了什么?有什么建议?

Proc:

ALTER PROCEDURE [healthc].[ev_kc_Products_Search]
(
    @SearchString   VARCHAR(1000)
)
AS
SET NOCOUNT ON

    DECLARE @SQL    VARCHAR(max),
        @SQL1   VARCHAR(max),
        @Tag    VARCHAR(5)

    CREATE TABLE #T
    (   ID      INT,
        VendorName  VARCHAR(255),
        ItemName        VARCHAR(255),
        Type        VARCHAR(2),
        Sequence        TINYINT
    )


 SET @SQL = '

    INSERT  #T

    SELECT  VendorID ID,
        Name VendorName,
        NULL ItemName,
        ''V'' Type,
        0 Sequence
    FROM    tblVendors
    WHERE   '+REPLACE(@SQL1,@Tag,'Name')+'

    UNION ALL

    BLAH BLAH BLAH'


 EXEC(@SQL)


 SELECT ID, VendorName, ItemName, Type FROM #T
Run Code Online (Sandbox Code Playgroud)

ben*_*oam 54

尝试将此行添加到存储过程的开头:

SET FMTONLY OFF
Run Code Online (Sandbox Code Playgroud)

完成导入后,可以将其删除.


小智 38

幕后发生什么事?

  1. 在执行函数导入时 - >获取列信息... Visual Studio执行存储过程,所有param值都为NULL(您可以通过MS SQL Profiler对此进行交叉检查).

  2. 执行步骤1,返回存储过程的结果列及其数据类型和长度信息.

  3. 获取列信息后,单击"创建新的复杂类型"按钮可在争用中创建SP的复杂类型.

在您的情况下,存储的proc参数不可为空,因此Visual Studio调用失败并且不返回任何列.

怎么办呢?

IF (1=0) 
BEGIN 
    SET FMTONLY OFF 
    if @param1 is null and @param2 is null then
        begin
            select
            cast(null as varchar(10)) as Column1,
            cast(null as bit) as Column2,
            cast(null as decimal) as Column3
        END
END   

确切地说(在你的情况下):

IF (1=0) 
BEGIN 
    SET FMTONLY OFF 
    if @SearchString is null then
        BEGIN
            select
            cast(null as int) as ID,
            cast(null as varchar(255)) as VendorName,
            cast(null as varchar(255)) as ItemName,
            cast(null as varchar(2)) as Type
        END
END   

参考:http://mysoftwarenotes.wordpress.com/2011/11/04/entity-framework-4-%E2%80%93-the-selected-stored-procedure-returns-no-columns-part-2/

  • 使用 NULL 参数执行的存储过程的信息是黄金!在使用 VS 将我的应用程序移植到新环境时,我丢失了一个表,导致存储过程在 EF 尝试调用它以获取列值以构建复杂类型时默默地失败。您的回答使我转到 SSMS 中的一个新查询窗口,并使用空输入参数执行存储过程,复制 EF 所做的事情,从而发现我的愚蠢错误,即 EF 正在默默吞咽。 (2认同)

Mah*_*vej 6

在完整性和简单的@benshabatnoam答案,只需将以下代码放在开头:

IF (1=2)
    SET FMTONLY OFF
Run Code Online (Sandbox Code Playgroud)

注意:它适用于EF 6.1.3和Visual Studio 2015 Update 3