2013-03-06 102 views
0

我有這個存儲過程:SQL Server存儲過程產生的結果,但不返回他們

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"); 

在我的web項目中,我永遠不能訪問結果集 - 它只是說沒有返回。我做錯了什麼是阻止結果集被返回?

+0

向我們展示您的web項目中運行sproc的代碼。 – Melanie 2013-03-06 16:00:36

+3

應該檢索結果集的.NET代碼是相關的 – Andomar 2013-03-06 16:00:40

+0

我更新了OP以包含請求的代碼。 sproc正在從.dbml文件訪問。 – StronglyTyped 2013-03-06 16:06:52

回答

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

當然,它會如果你改變了你的存儲過程,以在一致的列名是WAY簡單結果集。像這樣:

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 
+1

由於您添加了列名稱,我將其標記爲答案,但問題的根本原因在於,當我最初將sproc添加到我的dbml時,返回類型被設置爲「未知」(我想因爲我最初並未沒有聲明列名)。當我對sproc進行更改並刪除/將其讀入我的dbml時,返回類型從未更新過。只有當我刪除它,建立,關閉Visual Studio,重新打開VS,然後重新讀它,它是否設置返回類型爲「自動生成」。在我發佈之前,我確實嘗試了類似於你的代碼,但它只是從未在dbml中更新過。 – StronglyTyped 2013-03-08 16:47:29

相關問題