SQL Server存储过程生成结果但不返回它们

时间:2013-03-06 15:49:18

标签: c# sql sql-server linq-to-sql stored-procedures

我有这个存储过程:

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中运行它时,我得到了这个输出:

output

返回“结果0”的代码:

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

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

1 个答案:

答案 0 :(得分:0)

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

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

Scott Guthrie的这篇文章更多地讨论了这个问题:(在“处理多个结果形状”一节中)http://weblogs.asp.net/scottgu/archive/2007/08/16/linq-to-sql-part-6-retrieving-data-using-stored-procedures.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