我正在尝试通过VB 6.0应用程序将Adodb Recordset导出到excell。我可以通过For Loop做到这一点。但记录集包含100列,行数为200000行。所以它耗费了大量的时间来完成这个象牙。有时它会被绞死。 有没有快速的方法来实现同样的目标? 提前谢谢
答案 0 :(得分: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。这篇文章现在已经很老了,但我认为这在几年来第一次再次阅读之后仍然适用。
答案 1 :(得分:1)
一些建议:
Excel对象模型具有CopyFromRecordset
方法。
Recordset对象有一个GetRows
方法返回一个数组,您可以将其'转置'到Excel Range
对象的Value
属性中('transpose'=列到行,反之亦然 - 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;