2013-06-12 68 views
1

我有下面的代碼出來使用OleDB數據庫和填充數據集的信息。然後檢查數據集中是否有東西,如果是,則將該數據集添加到數據表中,然後在函數結束時返回該數據表。連續添加到數據表

for (int i = 0; i < UserClassDict[UserName].ControlNumber.Count; i++) 
        { 
         string query = "SELECT * FROM [FNF Taxes] WHERE ControlNumber =" + UserClassDict[UserName].ControlNumber[i] + ";"; 
         adapter.SelectCommand = new OleDbCommand(query, conn); 
         DataSet dataset = new DataSet(); 
         adapter.Fill(dataset); 

         if (dataset.Tables[0].Rows.Count > 0) 
         { 
          dt = dataset.Tables[0]; 
               } 
        } 

我的問題是這樣的。正如您可以通過for循環所告知的那樣,該塊將運行多次,我希望從數據庫中提取的每行都添加到數據表中。因此,當數據表返回時,它具有所有X行的數量。但是,正如上面的代碼塊中那樣,添加到數據表中的唯一行是最近被拖動的行。

+0

我很難理解什麼是quatsion。 –

+0

用於構建此sql的技術容易受到注入攻擊。這個特定的查詢可能是可以的,因爲它看起來像C#對象是一個數字數據類型,但如果其他查詢使用相同的技術來將數據替換爲查詢,那麼實際上您會乞求被黑客入侵。 –

+0

可能是一些額外的代碼可以幫助更好地幫助 – ErickBest

回答

3

使用DataTable.Merge()

DataTable dt = null; 
for (int i = 0; i < UserClassDict[UserName].ControlNumber.Count; i++) 
{ 
    string query = "SELECT * FROM [FNF Taxes] WHERE ControlNumber =" + UserClassDict[UserName].ControlNumber[i] + ";"; 
    adapter.SelectCommand = new OleDbCommand(query, conn); 
    DataSet dataset = new DataSet(); 
    adapter.Fill(dataset); 

    if (dataset.Tables[0].Rows.Count > 0) 
    { 
     if (dt == null) 
      dt = dataset.Tables[0].Clone(); 
     dt.Merge(dataset.Tables[0]); 
    } 
} 
return dt; 
0

我所知道的最直接的方式就是繼續加載DataTable的同一個實例。考慮一類可能是這樣認爲:

private DataTable _dt = new DataTable(); 

... 

private void FillMyDataTable() 
{ 
    ... 
    sda.Fill(_dt); 
} 

或在您的情況下,DataSet。另一種選擇是Merge,它是由DonBoitnott提供的解決方案。

0

嘗試在此級別應用級聯方法dt = dataset.Tables [0]; ...我會避免在一個迭代中的對象聲明...循環看起來太忙了...此外,你可以使用ifor loop,而不是像[0],這樣的東西,你會去[i]。 ....允許dt存儲連接的數據。

0

我相信你可以運行一次查詢。您不必在循環中創建所有這些對象。

   string where = ""; 
       string query = "SELECT * FROM [FNF Taxes] WHERE ControlNumber = {0};"; 
       for (int i = 0; i < UserClassDict[UserName].ControlNumber.Count; i++) 
       { 
        if(i == UserClassDict[UserName].ControlNumber.Count -1) 
         where+=UserClassDict[UserName].ControlNumber[i] ; 
        else 
         where += UserClassDict[UserName].ControlNumber[i] + ","; 

       } 

       adapter.SelectCommand = new OleDbCommand(string.Format(query,where), conn); 
       DataSet dataset = new DataSet(); 
       adapter.Fill(dataset); 

       if (dataset.Tables[0].Rows.Count > 0) 
       { 
        if (dt == null) 
         dt = dataset.Tables[0]; 
       }