2011-08-10 20 views
3

我有一個存儲過程:VB.NET - 一個查詢中有多個結果集?

CREATE PROCEDURE [TestProc] 
AS 
BEGIN 
    select '1a', '1b' 
    select '2a', '2b', '2c' 
    select '3a', '3b' 
END 

如果我執行使用SQL Management Studio中下面的查詢,

exec TestProc 

我得到3個結果集:

1. | 1a | 1b | 

2. | 2a | 2b | 2c | 

3. | 3a | 3b | 

但是當我使用ASP.NET(VB.NET)中的存儲過程,

Dim Connection As New SqlConnection(ConfigurationManager.ConnectionStrings("ConnToHilmarc").ToString) 
Dim Command As New SqlCommand("exec TestProc @First, @Second", Connection) 
Dim Reader As SqlDataReader 

Command.Parameters.AddWithValue("@First", "Hello") 
Command.Parameters.AddWithValue("@Second", "World") 

Connection.Open() 
Reader = Command.ExecuteReader 

While Reader.Read 
    Response.Write(Reader(0) & " " & Reader(1) & "<br/>") 
End While 

Reader.Close() 
Connection.Close() 

我只得到第一個結果集:

| 1a | 1b | 

我怎樣才能使用SqlDataReader三個結果集?甚至三個SqlDataReader的?或者是否有可能在VB.NET中的一個查詢中獲得多個結果集?我的唯一選擇是DataSet?提前致謝。

回答

8

你要使用的SqlDataReaderNextResult()得到一個結果集:

Reader.NextResult(); 

SqlDataReader.NextResult()返回true,如果有另一個結果集,否則爲假,所以,你可以(在您的示例代碼)使用下面的循環,以避免具有3套代碼基本上做同樣的事情:

Using Connection As New SqlConnection(ConfigurationManager.ConnectionStrings("ConnToHilmarc").ToString()) 

    Dim Command As New SqlCommand("exec TestProc @First, @Second", Connection) 
    Dim Reader As SqlDataReader 

    Command.Parameters.AddWithValue("@First", "Hello") 
    Command.Parameters.AddWithValue("@Second", "World") 

    Connection.Open() 
    Reader = Command.ExecuteReader() 

    While Reader.Read() OrElse (Reader.NextResult() And Reader.Read()) 
     For i As Integer = 0 To Reader.FieldCount - 1 
      Response.Write(Reader(i).ToString() 
      Response.Write(" ") 
     Next 

     Response.Write("<br />") 
    End While 

    Reader.Close() 

End Using 

OrElse的將執行邏輯短circuting:

  1. 如果Reader.Read()返回true,它將讀取下一行,而不會調用Reader.NextResult()(這會使讀者前進到下一個結果並可能導致數據丟失)。 And Reader.Read()用於確保獲取下一個結果集的第一行。
  2. 如果Reader.Read()爲false,則會評估下一個表達式(Reader.NextResult()) - 如果它爲true,它將處理下一個結果集。
  3. 如果兩者均爲false,則退出循環。
相關問題