2012-11-02 39 views
1

結合的DataTable尋求使用DataReader朋友GridView控件不是從數據集

我已加載從數據庫中3個表來DataSet幫助,但我無法將其綁定到一個GridView

protected void GetStudReport(Object o, EventArgs e) 
{ 
    if (mycon.State != ConnectionState.Open) 
    { 
     List<string> lstQstn = new List<string>(); 

     mycon.Open(); 
     cmd = new MySqlCommand("SELECT * from scord_mark_table where [email protected]", mycon); 
     cmd.Parameters.Add(new MySqlParameter("StID", MySqlDbType.VarChar, 10, "stu_ID")); 
     cmd.Parameters["@StID"].Value = drpDnSearch3.SelectedValue; 
     MySqlDataReader rdr1 = cmd.ExecuteReader(); 
     DataSet ds = new DataSet(); 
     DataTable dtScrTbl = new DataTable("ScoreTable"); 
     dtScrTbl.Load(rdr1); 
     ds.Tables.Add(dtScrTbl); 
     rdr1.Close(); 
     cmd = null; 

     int i = 0; 
     Dictionary<string, string> dctSub = new Dictionary<string, string>(); 
     using (DataTableReader dtr = ds.CreateDataReader()) 
     { 
      while (dtr.Read()) 
      { 
       lstQstn.Add(dtr["test_id"].ToString()); 

       while (i <= lstQstn.Count()) 
       { 
        cmd = new MySqlCommand("SELECT test_id,subject_id from qution_no_table where test_id='" + lstQstn[i].ToString() + "'", mycon); 
        MySqlDataReader rdr2 = cmd.ExecuteReader(); 
        while (rdr2.Read()) 
        { 
         dctSub.Add(rdr2["subject_id"].ToString(),rdr2["test_id"].ToString()); 
        } 
        rdr2.Close(); 
        break; 
       } 

       i++; 


      } 
      cmd = null; 
     } 

     string strTestID="where test_id='"; 
     i=0; 
     foreach (string lst in lstQstn) 
     { 
      if (i > 0) 
      { 
       strTestID += @" and test_id='"; 
      } 
      strTestID += lst + @"'"; 
      i++; 
     } 


     cmd = new MySqlCommand("SELECT * from qution_no_table " +strTestID+";"+"SELECT * from out_of_mark_table " +strTestID, mycon); 

     MySqlDataReader rdr3 = cmd.ExecuteReader(); 

     DataTable dtQNoTbl = new DataTable("QstNoTable"); 
     dtQNoTbl.Load(rdr3); 
     ds.Tables.Add(dtQNoTbl); 

     rdr3.NextResult(); 

     // bind the second resultset 
     DataTable dtOutMrkTbl = new DataTable("OutOfMarkTable"); 
     dtOutMrkTbl.Load(rdr3); 
     ds.Tables.Add(dtOutMrkTbl); 
     rdr3.Close(); 

     //** 
     GridView1.DataSource = ds.Tables["OutOfMarkTable"]; 
     GridView1.DataBind(); //** 
    } 
} 
+0

是什麼讓你覺得綁定失敗?您是否使用過調試器來確保DataReader中有數據? – slugster

回答

2

原因是您的rdr3.NextResult()它推動讀者到下一個結果(如果有的話)。但是這已經在DataTable.Load中完成了。從MSDN:

Load方法消耗的第一個結果從加載 IDataReader的設置,併成功完成後,將讀者的 位置到下一個結果集,如果有的話。

所以你只需要省略它。另一種選擇是使用DatSet.Load(reader),而不是一次添加的最後兩個表:

ds.Load(rdr, LoadOption.OverwriteChanges, "QstNoTable","OutOfMarkTable"); 
GridView1.DataSource = ds.Tables["OutOfMarkTable"]; 

DataSet.Load不會刪除在DataSet現有表。

+0

謝謝您的善意回應Mr.Schmelter。但我仍然無法解決問題。 – neo

+0

@Aneosh:我想我現在已經找到了理由,相應地編輯了我的答案。 –

+0

非常感謝Mr.Schmelter對你的寶貴時間花在這個上面,它真的在工作! – neo