2011-03-02 49 views
1

我使用oledbcommand的對象從dBase4數據庫獲取數據並將其加載到數據表中。但是在5-10分鐘左右的時間內獲取160條記錄需要花費太多時間。 請幫幫我。由oledbcommand對象獲取數據時,Excutereader速度很慢

代碼:

using (OleDbConnection cn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;" + @"Data Source=" + TrendFilePath + "\\" + Pathname + ";" + @"Extended Properties=dBASE III;")) 

using (OleDbCommand cm = cn.CreateCommand()) 
{ 
    cn.Open(); 

    for (int L = 0; L <= months; L++) 
    { 
     DataTable dt_Dbf = new DataTable(); 
     From_Date = DateTime.ParseExact(frmdate, dateFormat2, provider); 
     From_Date = From_Date.AddMonths(L); 

     int month = From_Date.Month; 
     string year = "1" + From_Date.Year.ToString().Substring(2, 2); 

     if (L == 0) 
     { 

       cm.CommandText = @"SELECT * FROM 128.DBF where DATE_Y =" 
           + year + " and DATE_M = " + month + " and DATE_D>=" + From_Day + ""; 
       dt_Dbf.Load(cm.ExecuteReader(CommandBehavior.CloseConnection)); 
     } 
    } 
} 
+0

128.dbf文件大小是多少?它是本地還是網絡共享?你真的需要所有的領域? – rene 2011-03-02 11:57:27

+0

你能檢查dbase文件是否有索引嗎?否則,爲列DATE_Y創建一個DATE_Y,DATE_M可能會幫助... – rene 2011-03-02 12:05:59

+0

@rene:128.dbf文件的大小爲326KB Aprox。該文件在遠程PC上。我需要7個領域中的15個。我是新的,所以我不知道如何檢查索引到數據庫 – vishis 2011-03-02 12:35:19

回答

0

我懷疑你執行查詢的問題。除非查詢是對大量(數百萬/數十億)數據集進行篩選,否則即使您正在執行這些查詢的12個(我假設每個月),我也沒有看到它的問題。另外,在我寫作時,您是否計劃使用DataTable?對於每個月,你填充表,然後把它扔掉。 (由於您提到的數據庫只有〜300k,查詢本身不可能佔用任何重要時間)。

它可能與網絡或文件本身有關。正如我所說的,你正在執行12個查詢,但是每個成功的時候都會斷開連接。這意味着您需要建立12個連接,並運行12個查詢。您應該調查您是否可以爲需要執行的一組查詢維護單個連接。

另一種可能性是鎖定。數據庫文件是否能夠維護多個連接併爲不同的用戶執行多個查詢?我根本不知道dbase產品,但如果它是單用戶/單線程的,可能會出現其他人正在使用數據庫並將其鎖定一段時間的情況。

嘗試將數據庫複製到本地計算機,更改連接字符串以引用本地副本,然後再次運行此代碼。如果執行時間明顯縮短,我相信您可以自信地說有某種網絡問題。從那一刻起,你將(可能)需要尋求組織中的某個人的幫助。對於12個看似簡單的查詢,5-10分鐘是一個笑話。

如果網絡是問題的原因,您可以採取幾種選擇。

  • 要求網絡/基礎設施人員進行調查。它可能是共享上的磁盤,或者網絡IO過載。
  • 在程序開始時將數據庫複製到機器上。如果你只是在讀取數據,而且你不需要更新的數據,這將僅適用。或者,在每個查詢的開始處複製到本地,只寫入網絡。這將保持(相對)新鮮的數據,並確保所有寫入都是正確的。但是,如果您執行了大量查詢,則複製整個文件的網絡成本可能會降低性能。
  • 使用更好的數據庫產品(我的建議)。建立一個數據庫服務器,使用Postgres或MySql(我建議Postgres),將dbase數據遷移到服務器,並讓所有引用dbase文件的應用程序指向數據庫服務器。如果有多個連接需要訪問數據庫,你應該這樣做。如果只有一個連接需要訪問數據庫,那麼數據庫應該在正在訪問的機器上。