2011-09-20 66 views
1

我有一個存儲過程,根據輸入,返回多個int整數行或多行DateTime。Linq To Sql:調用具有不同返回值的存儲過程

我看過的答案,this question和已經閱讀並實施從Handling Multiple Result Shapes from SPROCs斯科特Guthries溶液(向下滾動頁面看到,一節)。

不幸的是,它只是不工作。

這裏是我的代碼:

​​

使用SQL Server Profiler,LINQ的2 SQL是生產代碼,看起來像這樣:

declare @p6 int 
set @p6=0 
exec sp_executesql N'EXEC @RETURN_VALUE = [FunkyStoredProcedure] @appId = @p0, @sId = @p1, @cId = @p2',N'@p0 int,@p1 int,@p2 int,@RETURN_VALUE int output',@p0=2,@p1=4,@p2=2,@[email protected] output 
select @p6 

其產生的結果集,看起來像這樣:

cId 
----------- 
694 
42 
43 
41 
4732 


----------- 
0 

(1 row(s) affected) 

請注意,這裏有兩個結果集(應該只有一個)。並注意到第二個結果集,返回LinqToSql的結果集爲0!

「exec sp_executesql ...」行生成第一個正確的結果集。

行「select @ p6」產生第二個不正確的結果集。

首先,爲什麼@ p6被定義爲int?在函數中,我有兩個可能的ResultTypes:List和List這看起來像是一個問題。

其次,它爲什麼不返回存儲過程的輸出?而是返回@ p6的值?

最後,最重要的是,我如何才能正確地工作?

回答

1

忽略剖析 - 這是導致你錯了路;-)

你是如何讀的結果? 您應該將它們讀入一個IMultipleResults,然後調用GetResult> <>來獲取實際數據 即。

IMultipleResults result = dc.FunkyStoredProcedure(1,2,3); 
var ints = result.GetResult<int>(); 

IMultipleResults result = dc.FunkyStoredProcedure(1,2,3); 
var dts = result.GetResult<DateTime>(); 

如果你選擇了錯誤的類型,並通過結果枚舉,你會拋出構造一個SystemException(消息=「指定的轉換無效。」),所以如果你不這樣做知道類型,假設最有可能的類型,如果拋出了上述情況,則嘗試使用其他類型。

喜歡的東西:

IMultipleResults result = dc.FunkyStoredProcedure(1,2,3); 
try 
{ 
    var ints = result.GetResult<int>(); 
    DoStuffWithIntegerResults(ints); 
} 
catch(SystemException) 
{ 
    var dates = result.GetResult<DateTime>(); 
    DoStuffWithDateResults(dates); 
} 
+0

我從IMultipleResults得到它,它總是與0 –

+0

值這完全是一起工作的一個int。我只是沒有看到它。 –

相關問題