我有这个存储过程:
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");
在我的网络项目中,我永远无法访问结果集 - 它只是说没有返回任何内容。我做错了什么阻止了返回结果集?
答案 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