DataTable.Load 跳过多结果 DataReader 中的下一个结果集

5
我有一个多结果查询,并尝试将每个结果绑定到单独的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个结果集,但在上面的代码中,我只获得了第1、3和5个结果集,看起来每次循环都会跳过一个结果集。
问题是:
1.为什么会发生这种情况。
2.实现此目标的最简单解决方案是什么。

3
DataTable.Load 会自动将读取器推进到下一个结果。 - Alexander Petrov
2个回答

10

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();
}

0

使用read.IsClosed()的答案并没有错,但是要小心:

当所有SELECT中字段数量不同时(数据类型也相同),似乎存在问题:

例如1:

    select 2,2 select 1

例子2:

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

(在.NET 4.5.2下测试通过)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接