【问题标题】:How does MSLinqToSqlGenerator determine the return type of a stored procedure?MSLinqToSqlGenerator 如何确定存储过程的返回类型?
【发布时间】:2009-07-28 15:48:10
【问题描述】:

我有一个存储过程(SP)如下:


CREATE PROCEDURE [dbo].[UDSPSelectMissing]
    -- paramters omitted
AS
BEGIN 
    -- Code Omitted
    SELECT 
        c.MemberID,
        c.FirstName,
        c.MiddleName,
        c.LastName,
        c.Suffix,
        c.PhoneHome,
        c.PhoneCell,
        c.Email
        FROM [dbo].[Members] c
        WHERE c.MemberID IN (SELECT MemberID FROM #PeopleCameMissing)
        ORDER BY c.LastName,c.FirstName
END

当我将 SP 添加到“dbml”设计器的 SP 窗格时,我期望 MSLinqToSqlGenerator 创建“ISingleResult”作为返回值类型。令我惊讶的是,返回值类型是“int”。显然,生成器使用某些标准来确定返回值类型。我还有其他类似的返回“ISingleResult”类型的 SP。

有人知道什么会导致生成器出现这种行为吗?

顺便说一句,这个网站上有人建议重新创建 SP,从“dbml”中删除引用,重新启动 Visual Studio (VS) 并再次将其添加到“dbml”。我经历了所有这些都无济于事。

我怀疑临时表“#PeopleCameMissing”。

欢迎提出任何建议或建议!

谢谢,

库伦

【问题讨论】:

    标签: c# visual-studio-2008 sql-server-2005 linq-to-sql


    【解决方案1】:

    我在原始帖子中提到我怀疑临时表。临时表是由“SELECT INTO #PeopleCameMissing”命令创建的,因此它的定义是动态的,因此当存储过程添加到“dbml”设计器时,生成器对表的定义一无所知。如果我让生成器知道表定义怎么办,也许我能够获得所需的返回类型。基于这个猜想,我进行了测试。我声明了一个表如下:

    
        DECLARE @PeopleCameMissing TABLE(
            MemberID int,
            FirstName nchar(20),
            MiddleName nchar(20),
            LastName nchar(20),
            Suffix nchar(10),
            PhoneHome nchar(20),
            PhoneCell nchar(20),
            Email  nchar(80)
        );
    

    并把原来的说法改成如下:

    
        INSERT INTO @PeopleCameMissing (
            MemberID,
            FirstName,
            MiddleName,
            LastName,
            Suffix,
            PhoneHome,
            PhoneCell,
            Email)
        SELECT 
            c.MemberID,
            c.FirstName,
            c.MiddleName,
            c.LastName,
            c.Suffix,
            c.PhoneHome,
            c.PhoneCell,
            c.Email
            FROM [dbo].[Members] c
            WHERE c.MemberID IN (SELECT a.MemberID FROM #PeopleCameMissing a)
            ORDER BY c.LastName,c.FirstName;
    
        DROP TABLE #PeopleCameMissing;
    
        SELECT * 
            FROM @PeopleCameMissing 
            ORDER BY LastName,FirstName;
    
    

    然后我再次将存储过程添加到“dbml”设计器中。这次生成器创建了所需的返回类型:“ISingleResult”。这似乎证明了我的猜想。

    【讨论】:

      【解决方案2】:

      很简单(特殊情况下)。

      SQL 允许您在不调用过程的情况下询问结果集架构。

      在不那么特殊的条件下*,SQL 会在每次调用时为您提供替代答案。

      * 带有 IF 语句的那些。这可能是故意的。我不太了解 SQL,无法回答这个问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多