Экспорт набора записей в Excel - PullRequest
2 голосов
/ 18 марта 2011

Я пытаюсь экспортировать набор записей Adodb для выдачи через приложение VB 6.0.Я могу сделать это для For Loop.Но набор записей содержит 100 столбцов с 200000 строк.Таким образом, это занимает огромное время, чтобы закончить бивень. Временами это становится повешенным.Есть ли быстрый способ добиться того же?Заранее благодарен

Ответы [ 2 ]

1 голос
/ 18 марта 2011

Некоторые предложения:

Объектная модель Excel имеет метод CopyFromRecordset.

Объект Recordset имеет метод GetRows для возврата массива, который можно «транспонировать» в свойство Value объекта Range объекта Excel («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;
1 голос
/ 18 марта 2011

Есть несколько способов значительно улучшить производительность объектов ADODB.Recordset. Один из лучших советов, которые я использовал для ускорения, - это создание явных полей объектов в вашем цикле:

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 . Сейчас эта статья довольно старая, но я думаю, что она все еще применима после прочтения ее впервые за многие годы.

...