0

我有这个存储过程:

alter PROCEDURE [dbo].[DynamicDropDownList]
(
    @TableName varchar(100),
    @DataTextField varchar(100),
    @ValueTextField varchar(100)
)
AS
BEGIN
SET NOCOUNT ON; 

declare @results table (DataTextField varchar(255), DataValueFIeld varchar(2));
    declare @sql varchar(max);

    set @sql = ('select ' + @DataTextField + ', ' + @ValueTextField +
                ' from ' + @TableName +
                ' order by ' + @DataTextField);

    exec(@sql);

    return;
END

当我在 LinqPad 中运行它时,我得到以下输出:

输出

返回“结果 0”的代码:

var results = db.DynamicDropDownList("Countries", "Country", "CountryCode");

在我的网络项目中,我永远无法访问结果集 - 它只是说没有返回任何内容。我做错了什么导致结果集无法返回?

4

1 回答 1

0

您的 exec() 命令使 Linq2Sql 难以确定输出的形状。也就是说,每次运行 SP 时,列名都可能发生变化。

解决方法是向您的项目添加一个部分类,该类定义一个方法,该方法将调用 SPROC 并将结果集作为 IMultipleResult 对象返回。您需要为每个可能的输出创建一个 ResultType。

Scott Guthrie 的这篇文章对此进行了更多讨论:(在“处理多个结果形状”部分)http://weblogs.asp.net/scottgu/archive/2007/08/16/linq-to-sql-part-6 -检索数据使用存储过程.aspx

当然,如果您将存储过程更改为在结果集中具有一致的列名,那会更简单。像这样:

ALTER PROCEDURE [dbo].[DynamicDropDownList]
(
    @TableName varchar(100),
    @DataTextField varchar(100),
    @ValueTextField varchar(100)
)
AS
BEGIN
SET NOCOUNT ON; 

    declare @results table (DataTextField varchar(255), DataValueFIeld varchar(2));
    declare @sql varchar(max);

    set @sql = ('select ' + @DataTextField + ' AS Data, ' + @ValueTextField + ' AS Value ' +
                ' from ' + @TableName + ' AS LookupTable ' +
                ' order by ' + @DataTextField);

    exec(@sql);

    return;
END
于 2013-03-08T15:58:07.167 回答