объект DataTable.Загрузка переходит к следующему результирующему набору в средстве чтения данных с несколькими результатами


У меня есть запрос с несколькими результатами, и я пытаюсь привязать каждый результат к отдельному DataGridView.

using (SqlConnection con = new SqlConnection(connectionString))
{
    con.Open();
    SqlCommand cmd = new SqlCommand("SELECT 1 select 2 select 3 select 4 select 5 select 6"
                                    , con);
    SqlDataReader reader = cmd.ExecuteReader();
    int x = 50;
    int y = 100;
    do
    {
        DataGridView dgv1 = new DataGridView();
        DataTable dt = new DataTable();
        dt.Load(reader);
        dgv1.DataSource = dt;
        dgv1.Left = x;
        dgv1.Top = y;
        dgv1.Height = 60;
        y = y + 70;
        this.Controls.Add(dgv1);
    } while (reader.NextResult());
    reader.Close();
}

Если я не загружаю данные в DataTable и не привязываю их к сетке, я получу 6 результирующих наборов, но в коде выше я получаю;y 1-й, 3-й и 5-й результирующие наборы, похоже, что заполнение пропускает результирующий набор в каждом цикле.

Вопрос таков:

  1. Почему это происходит.
  2. Какое самое простое решение для достижения этой цели?
2 2

2 ответа:

DataTable.Загрузка, переход к следующему результирующему набору, поэтому вам не нужно использовать NextResult().

Просто делайте цикл, пока читатель не будет открыт.

using (SqlConnection con = new SqlConnection(connectionString))
{
    con.Open();
    SqlCommand cmd = new SqlCommand("SELECT 1 select 2 select 3 select 4 select 5 select 6"
                                    , con);
    SqlDataReader reader = cmd.ExecuteReader();
    int x = 50;
    int y = 100;
    do
    {
        DataGridView dgv1 = new DataGridView();
        DataTable dt = new DataTable();
        dt.Load(reader);
        dgv1.DataSource = dt;
        dgv1.Left = x;
        dgv1.Top = y;
        dgv1.Height = 60;
        y = y + 70;
        this.Controls.Add(dgv1);
    } while (!reader.IsClosed); // here is the change
    reader.Close();
}

Ответ с помощью read.IsClosed() не ошибается, но будьте осторожны:

Похоже, есть проблема, когда количество полей не одинаково во всех выборках (тот же тип данных тоже):

Например 1:

    select 2,2 select 1

Например 2:

    select 2,2 select 'one', 'one'

(протестировано с .NET 4.5.2)