DataTable.Load Переход к следующему набору результатов в DataReader с несколькими результатами.
У меня есть многорезультатный запрос, и я пытаюсь связать каждый результат с отдельным 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-й набор результатов, похоже, заполнение пропускает набор результатов в каждая петля.
Вопрос:
- Почему это происходит?
- Какое самое простое решение для достижения этой цели.
2 ответа
Решение
DataTable.Load, переход к следующему набору результатов, поэтому вам не нужно использовать 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() не является неправильным, но будьте осторожны:
Кажется, есть проблема, когда количество полей не одинаково во всех SELECT (также один и тот же тип данных):
например, 1:
select 2,2 select 1
например 2:
select 2,2 select 'one', 'one'
(протестировано с.NET 4.5.2)