2011-03-18 67 views
2

我試圖通過VB 6.0應用程序導出Adodb Recordset以excell。我可以通過For Loop做到這一點。但是這個記錄集包含了200行的100列。所以,完成這個象牙花費很多時間,有時會被吊死。 有沒有一種快速的方法來實現相同? 提前致謝將記錄集導出到Excel

回答

1

有一些方法可以顯着提高ADODB.Recordset對象的性能。一個我用加快速度最好的技巧就是在你的循環,以創建明確field對象:

Dim rs As New ADODB.Recordset 
Dim fldLastName As ADODB.Field, fldFirstName As ADODB.Field 

rs.Open "SELECT au_lname, au_fname FROM authors", "DSN=pubs", , , adCmdText 

Set fldLastName = rs.Fields("au_lname") 
Set fldFirstName = rs.Fields("au_fname") 

Do Until rs.EOF 
    csvOutput = csvOutput & fldLastName & "," & fldFirstName & vbCrLf 
    rs.MoveNext 
Loop 
rs.Close 

這真的可以加快速度,因爲你在提及Recordset.Field.Value避免後期綁定項目。試試看,你會看到性能的巨大提升。我曾與大量的記錄集一起工作,如你所描述的那樣,並且使用這種技術可以容忍性能。

順便說一下,MSDN上有一篇很好的文章,其中有一些其他提示可能有助於提高您的ADODB代碼的性能 - ADO Performance Best Practices。這篇文章現在已經很老了,但我認爲這一切在多年後的第一次再次閱讀後仍然適用。

+0

爲什麼你認爲你的循環,這涉及製作的'csvOutput' 200K次「深拷貝」,將執行比簡單地調用Recordset對象的'GetString'方法例如'csvOutput = rs.GetString(,,「,」,vbCrLf)'表示只有一個賦值給'csvOutput'而不是200K。 – onedaywhen 2011-03-18 14:37:27

1

幾點建議:

Excel對象模型具有CopyFromRecordset方法。

的記錄對象具有GetRows方法返回一個陣列,其可以「轉置」到Excel Range對象的Value屬性(「轉置」 =列的行,反之亦然 - Excel有一個Transpose工作表函數,可以是通過其對象模型調用)。

請注意,在Excel 2007之前,工作表被限制爲65,536行,您可能會發現上述Excel方法同樣受到限制。

Recordset對象有一個GetString方法將所有行一次寫入一個字符串(不需要循環)。

您可能完全繞過記錄集並使用Access SQL(ACE,Jet,其他)將數據直接寫入Excel,例如

SELECT * 
    INTO [Excel 8.0;DATABASE=C:\MyNewWorkbook.xls].MyNewTable 
    FROM [ODBC;Driver={SQL Server};Server=MyServer;Database=MyDB;UID=Admin;PWD=***].MyDBTable; 
+0

這真是太棒了。我一直使用循環技術,並且對此非常滿意,但是您提供的選項看起來更好。 – 2011-03-18 15:16:37