2015-09-08 57 views
0
Private Function CreateConnString(ByVal Str As String) As String 
    Return "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Str & ";Extended Properties=""Excel 12.0;HDR=Yes;IMEX=1""" 
End Function 
... 
For Each sMatl_Num As String In alMaterialNumbers 
       ifileNo = 1 
       dbConnection.ConnectionString = CreateConnString(sExcelDBPath) 
       dbCommand.Connection = dbConnection 
       dbCommand.CommandText = "SELECT [col1], [col2], [col3], [col4], [col5], [col6] FROM [sheet$] WHERE [material]='" & sMatl_Num & "'" & " AND [col3] IS NOT NULL" & " AND [col6] IS NOT NULL" 
       dbConnection.Open() 
       dbReader = dbCommand.ExecuteReader() 
       If dbReader.HasRows Then 
        Do While dbReader.Read 
         sCol1= dbReader.GetString(0).ToString 
         sCol2= dbReader.GetString(1).ToString 
         sCol3= dbReader.GetString(2).ToString 
         sCol4= dbReader.GetString(3).ToString 
         sCol5= dbReader.GetString(4).ToString 
         sCol6= dbReader.GetString(5).ToString 
        'Write txt file with name and content derived from these strings 
        Loop 
       End If 
       dbReader.Close() 
       dbConnection.Close() 
Next 

我在查詢使用oledb的Excel文件。有相當多的列從每行獲取數據。這是瘋狂地運行緩慢。有什麼方法可以優化這個嗎?數組列表的數量約爲23k。用於查詢Excel的多個打開命令oledb連接

+0

您*可*一次將整個文件讀入到Datatable中,然後應用過濾器一次處理其中的部分內容。我不確定它會更快,但它會減少數據庫操作 – Plutonix

+0

您不需要'GetString'頂部的'ToString'。我懷疑這會讓它變得更快:它只是冗餘代碼。 –

回答

0

問題是,對於每個sMatl_Num(我假設有23k?),你打開一個OLEDB連接,讀入一個記錄,然後逐個抓取這些字段,寫入它們,然後關閉連接。打開和關閉連接,在過濾其他字段的同時查詢單個物料編號,並從返回的字段中提取數據很昂貴。

這很可能會更快,如果你把整個記錄一次(複製和粘貼),篩選出col3=null and col6=null使用自動篩選或東西,那麼就使用本地vlookup功能在Col1拉 - Col6值。它仍然可以在VBA中完成。

您正在使用的方法將更適合單個快速查找大型文件。就像在Excel中有一個用戶可以輸入材料編號的UI一樣,並且您將OLEDB轉換爲材質主數據並獲取所需的屬性並將它們返回給用戶界面。一旦。

1

嘗試僅打開一次連接,然後處理它作爲記錄集返回的行,然後關閉它。

所以,你可以改變SQL來按sMatl_Num排序行,並有一個where子句只選擇alMaterialNumbers中的MaterialNumbers(這可能是一個IN子句或子查詢 - 它取決於可能有​​多少值)

所以有得到了一個記錄,你可以通過它寫出每個MaterialNumbers行,當數變化寫出來,希望下一個文件循環...

這是否有道理。

+0

從文件的寫入中分離出數據庫的讀取(內存允許,但只有23k條記錄不會出現問題),這是絕對有意義的。不管它是否會更快是另一回事,但我認爲你的這一部分覆蓋了只使用一個查詢獲取所有必需數據的想法。 –

+0

是的,它是有道理的謝謝你!這個模塊在使用這種解決方案約9分鐘後運行。與幾天相反,我會說這是相當優化的。再次感謝! –

+0

很高興知道。請勾選我的答案並向上箭頭! – HarveyFrench