本文只代表作者在一定階段的認識與理解。
一.寫作前提
最近在一個項目中使用到了Linq to SQL,Linq to SQL提供了對Table、Stored Procedure及Function等的應用,對於Stored Procedure而言,如果在你的Stored Procedure可以返回一個資料集合的時候,Linq to SQL為自動的為其產生一個相應的強型別結果集對象,之後在我們的Project中方便的引用。前兩天我的Project中遇到了一個特別奇怪的問題,就是在我的Stored Procedure中使用了一個temp表,然後再用select語句select這個temp表中的資料,可Linq to SQL對這個Stored Procedure給出的並不是一個強型別的結果集,而是一個int型,真是讓人摸不著頭腦,下面我們就來分析一下這個問題,並提出我的一個不合適的解決方案,並尋求更好的解決方案。
二.Stored Procedure在Linq to SQL中的結果分析
我們先來分析有問題的Stored Procude,表1所示:
圖表1:Stored Procedure1定義 |
-- ============================================ -- Author: Xiong Wei -- Create date: 22 May 2010 -- Description: Search group manage -- ============================================= CREATE PROCEDURE [dbo].[SP_TEST_ONE] ( @p_sort_exprission nvarchar(50), @p_paging_number int, @p_paging_size int, @p_total_count int output ) AS
BEGIN
SELECT S.SchoolName,C.*, ROW_NUMBER() OVER(ORDER BY C.Oid ASC) AS ROW_INDEX INTO #TEMP FROM T_COURSE AS C INNER JOIN T_SCHOOL AS S ON C.SchoolOid = S.Oid
SET @p_total_count=@@ROWCOUNT
SELECT * FROM #TEMP WHERE ROW_INDEX>=@p_paging_number*@p_paging_size+1 AND ROW_INDEX<@p_paging_number*@p_paging_size+1+@p_paging_size DROP TABLE #TEMP END RETURN
|
能過上面的代碼,我們可以看出其實它最後取出的應該是#TEMP表中經過分布手的記錄的集合。Ok,之後我們把這個Stored Procedure 放到Linq to SQL中,我們來看看他返回的是什麼結果集,表2所示。
圖表2:Stored Procedure1返回結果 |
|
是不是很奇怪,因為它返回的是一個int型,而不是資料集合。
下面我們再來看另外一個Stored Procedure,表3所示。
圖表3:Stored Procedure2 定義 |
-- ============================================= -- Author: Xiong Wei -- Create date: 22 May 2010 -- Description: Search group manage -- ============================================= CREATE PROCEDURE [dbo].[SP_TEST_TWO] ( @p_sort_exprission nvarchar(50), @p_paging_number int, @p_paging_size int, @p_total_count int output ) AS
BEGIN
SELECT S.SchoolName,C.*, ROW_NUMBER() OVER(ORDER BY C.Oid ASC) AS ROW_INDEX FROM T_COURSE AS C INNER JOIN T_SCHOOL AS S ON C.SchoolOid = S.Oid
SET @p_total_count=@@ROWCOUNT END RETURN |
先我們不說圖表3定義的Stored Procedure返回的是什麼類型,只從功能上來說它與圖表1定義只是返回結果的結果資料不同而已,返回的結果類型是相同,但是我們來看看Linq to SQL中它返回是不是一個int型呢?Ok,我們來看看圖表4中給出的結果。
圖表4:Stored Procedure2 返回結果 |
|
在Stored Procedure2中,Linq to SQL產生了一個強型別的結果集SP_TEST_TWOResult ,但是從選擇結果上來說,Stored Procedure1和Stored Procedure2返回的是相同類型的結果,但是在Linq to SQL中卻是不同的類型。
三.問題的解決方案
對於此問題的解決方案,我上網查了一遍,沒有直接的解決方案。然後我分析兩個Stored Procedure在Database輸出的結果類型應該都是一樣的,所以我想是否可以使用Stored Procedure2產生所需要的強型別,然後再用Stored Procedure1中的代碼來替代Stored Procedure2中的代碼 ,於是我試了一下,結果發現是可以的,這也就是證明了Stored Procedure1和Stored Procedure2的執行結果是相同的,但在Linq to SQL 卻產生了不同的類型。我不知道這算不算是Microsoft在Linq to SQL上的一個bug,還請 “有緣人”指點。
四.總結
雖然上面的代碼可以解了我在項目中現存的問題,但是我相信這並非是最好的解決方案並且存在很多問題。比如說,如果在輸出的結果集中多加一個欄位,那麼我們就需要重建這個強型別,那麼我們就需要為這個結果集重新建立一個Stored Procedure,所以這是不可取的。在有空之餘,我將再研究一下,同時也希望有知道人的可以指點一下,在此表示感謝。