2017-05-02 37 views
2

複数の結果クエリがあり、各結果を個別のDataGridViewにバインドしようとしています。私はDataTableのにデータをロードしていないと、グリッドにバインドしていない場合、私は6の結果セットを取得しますDataTable.Load複数結果のDataReaderで次の結果セットにスキップ

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

が、上記のコードでは、私が乗る;第一、第三及び第五結果セットは、ルックスのy populateのように、各ループに結果セットをスキップします。

質問は以下のとおりです。

  1. これはなぜ起こりますか。
  2. この目標を達成する最も簡単な方法は何ですか?
+2

「DataTable.Load」は自動的にリーダーを次の結果に進めます。 –

答えて

3

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(); 
} 
関連する問題