C# 加载跳转到多结果DataReader中的下一个结果集

C# 加载跳转到多结果DataReader中的下一个结果集,c#,sqldatareader,C#,Sqldatareader,我有一个多结果查询,并试图将每个结果绑定到单独的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" , c

我有一个多结果查询,并试图将每个结果绑定到单独的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第一、第三和第五个结果集,看起来像是填充跳过每个循环中的结果集

问题是:

  • 为什么会发生这种情况
  • 实现这一目标最简单的解决方案是什么

  • 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()的答案没有错,但要注意:

    如果所有选择中的字段数量不相同(数据类型也相同),则似乎存在问题:

    例1:

        select 2,2 select 1
    
    例2:

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

    (使用.NET 4.5.2进行测试)

    DataTable.Load
    自动将读卡器提前到下一个结果。