2012-09-26 30 views
-1

我有以下c#代碼,用於在連接到多個MS訪問數據庫表時過濾當前數據。這工作正常,但由於數據集ds太大,循環需要永遠返回檢查每行調用另一個mdb數據庫表。有沒有一種方法來優化這個刪除基於列過濾器的行。在多個ACCESS數據庫上過濾數據集以優化結果

string ABCACCESSDataSource = @"c:\websites\abc.mdb"; 
string XYZACCESSDataSource = @"c:\websites\xyz.mdb"; 

private void dataviewTable() 
{ 
     OleDbConnection Conn = DatabaseCommands.openDBConnection(ABCACCESSDataSource, this); 
     string query1 = select column1, column2, column3 from ABCTable where column2 = 'hello' order by column1; 
     Dataview dv; 
     OleDbDataAdapter da = new OleDbDataAdapter(query1, Conn); 

     DataSet ds = new System.Data.DataSet(); 
     da.Fill(ds, "ABCTable"); 

     foreach (DataRow dr in ds.Tables["ABCTable"].Rows) 
      checkValue = dr["ABCTable"].ToString(); 
         { 
         resultvalue = getvalue(checkValue); 
         if(resultvalue == "unavailable") 
         { 
          dr.delete(); 
         } 

      dv = ds.Tables["ABCTable"].DefaultView;  
}  

private string getvalue(string checkValuepassed)  
{ 
     OleDbConnection Conn2 = DatabaseCommands.openDBConnection(XYZACCESSDataSource, this); 
     string query2 = select columnX from XYZTable where columnY = 'test' AND columnZ = '" + checkValuepassed +"'" ;; 

     OleDbDataAdapter da2 = new OleDbDataAdapter(query2, Conn2); 
     ds2 = new DataSet(); 
         da2.Fill(ds2); 
         resultVal = ds2.Tables[0].Rows[0][0].ToString() ; 

         return resultVal; 
} 
+1

列名真的是Column1,Column2等..因爲我注意到你檢查列名='你好'什麼是表結構看起來像..我建議閱讀/谷歌搜索如何使用OLEDB與Access數據庫這看起來有點草率.. – MethodMan

+0

列名像ID,名稱,分數等...這不是馬虎,它工作得很好。它只是表結果太大,我試圖優化這一點。 – user1701450

+0

然後改變你的問題來描述..它會讓別人更容易在你的意見中給你更合理的答案 – MethodMan

回答

0

如果您正在獲取單個值,那麼將其放在表中以檢索值是很慢的。

但是檢索一次值。

string query2 = select columnZ, columnX from XYZTable where columnY = 'test' ;; 

Dictionary<string, string> table2Dict = new Dictionary<string, string>(); 

table2Dict.add(columnZ, columnX); 

colZvalue = table2Dict[checkValuepassed]; 

另一種看待這種情況的方法是不循環ABC。
只需循環XYZ並向ABC發出刪除命令。
如果記錄不存在,它將不會刪除任何內容。 並且像10-100一樣批量加入。
會有甜蜜點。
刪除[XYX]其中[ABCTable] in(..,..,..);

+0

所以要填充上面的代碼中的表2,我需要做一個for循環,並添加每個項目的關鍵和價值? – user1701450

+0

我試過這個,但是當我通過where ColumnY ='test'時得到的結果是9000行左右,我需要得到checkValuePassed傳遞的那一行。 – user1701450

+0

您沒有關注。整個想法是獲得9000行並將其放入字典中。您只能觸摸表XYZ ONCE。然後你使用table2Dict [checkValuepassed]; – Paparazzi

0

第二個數據庫(XYZ)有多大? 如果它適合在內存中,您可以先選擇Dictionairy中的所有行(沒有任何columnZ = ...),然後在getvalue(..)中僅執行內存操作,從而節省大量的OleDb查詢。

+0

每桌約5000行!感謝您的建議。我會嘗試這 – user1701450