【问题标题】:VB.NET - Multiple Result Sets in one query?VB.NET - 一个查询中的多个结果集?
【发布时间】:2011-08-10 04:32:48
【问题描述】:

我有一个存储过程:

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

【问题讨论】:

    标签: sql vb.net datareader


    【解决方案1】:

    您需要使用SqlDataReaderNextResult() 来获取下一个结果集:

    Reader.NextResult();
    

    SqlDataReader.NextResult() 如果有另一个结果集则返回 true,否则返回 false,因此您可以(在您的示例代码中)使用以下循环来避免 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 将执行逻辑短路:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-02-07
        • 1970-01-01
        • 2012-03-30
        • 1970-01-01
        • 2018-10-17
        • 1970-01-01
        相关资源
        最近更新 更多