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

DataTable.Load Skips to next result set in multi-result 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. 为什么会这样。
  2. 实现此目标最简单的解决方案是什么。

DataTable.Load,前进到下一个结果集,因此您不需要使用 NextResult()。

循环直到 reader 打开。

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 测试)