VB.NET - 一个查询中的多个结果集?

时间:2011-08-10 04:32:48

标签: sql vb.net datareader

我有一个存储过程:

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是我唯一的选择吗?提前谢谢。

2 个答案:

答案 0 :(得分:9)

您需要使用NextResult()的{​​{1}}来获取下一个结果集:

SqlDataReader
如果有另一个结果集,则

Reader.NextResult(); 返回true,否则返回false,因此您可以(在您的示例代码中)使用以下循环来避免让3组代码执行基本相同的操作:

SqlDataReader.NextResult()

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 将执行逻辑短路:

  1. 如果Reader.Read()返回true,它将读取下一行而不调用Reader.NextResult()(这会使读者前进到下一个结果并可能导致数据丢失)。 OrElse用于确保获得下一个结果集的第一行。
  2. 如果Reader.Read()为false,将评估下一个表达式(Reader.NextResult()) - 如果是,则它将处理下一个结果集。
  3. 如果两者都为假,则退出循环。

答案 1 :(得分:2)

查看SqlDataReader.NextResult方法。在你的SqlDataReader上调用它。