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

FLI*_*KER 3 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"
                                    , 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();
}
Run Code Online (Sandbox Code Playgroud)

如果我不将数据加载到DataTable中并且不将其绑定到网格,我将获得6个结果集,但在上面的代码中,我继续; y第1,第3和第5个结果集,看起来像填充跳过结果集每个循环.

问题是:

  1. 为什么会这样.
  2. 实现这一目标的最简单的解决方案是什么.

小智 7

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();
}
Run Code Online (Sandbox Code Playgroud)