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

时间:2017-05-02 00:04:27

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

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

问题是:

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

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:0)

使用read.IsClosed()的答案没有错,但要注意:

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

例如1:

    select 2,2 select 1

例如2:

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

(已通过.NET 4.5.2测试)