VB.NET - несколько результирующих наборов в одном запросе? - PullRequest
4 голосов
/ 10 августа 2011

У меня есть хранимая процедура:

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 ]

9 голосов
/ 10 августа 2011

Вы хотите использовать NextResult() из SqlDataReader, чтобы получить следующий набор результатов:

Reader.NextResult();

SqlDataReader.NextResult() возвращает true, если есть другой набор результатов, в противном случае - false, поэтому вы можете (в своем примере кода) использовать следующий цикл, чтобы избежать трех наборов кода, выполняющих по существу одно и то же:

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 ()) - если оно истинно, оно обработает следующий набор результатов.
  3. Если оба имеют значение false, цикл завершается.
2 голосов
/ 10 августа 2011

Взгляните на метод SqlDataReader.NextResult .Позвоните на ваш SqlDataReader.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...