Самый быстрый ADO для копирования и вставки таблиц с sql-сервера в Excel

Я перемещаю таблицы данных с sql-сервера в Excel.
Мне не нужно перемещаться по набору записей только для того, чтобы получить данные и вставить их в рабочий лист.

Использую ли я правильные аргументы для метода Open набора записей?

Dim recSet As ADODB.Recordset
Set recSet = New ADODB.Recordset
aConnection.Open
recSet.Open stringSQL, aConnection, adOpenForwardOnly, adLockReadOnly, adCmdText 
wb.Sheets(sName).Cells(1, 1).CopyFromRecordset recSet
recSet.Close
If Not (recSet Is Nothing) Then
    If (recSet.State And 1) = 1 Then recSet.Close
    Set recSet.ActiveConnection = Nothing
    Set recSet = Nothing
End If

person whytheq    schedule 26.01.2015    source источник
comment
Согласно MSDN , да ваши доводы верны. Если ваш stringSQL не такой сложный, а ваш RecordSet не такой большой, это должно быть мгновенно.   -  person L42    schedule 27.01.2015
comment
@ L42 никогда не более 5000 строк на 10 столбцов?   -  person whytheq    schedule 27.01.2015
comment
Ах, у меня около 45 000, и на моей машине это заняло примерно 140–150 секунд. Кстати, местоположение источника также учитывается. Мой источник находится на общем диске сервера.   -  person L42    schedule 27.01.2015


Ответы (1)


Это подход, который я использовал для извлечения данных из MSSQLServer, возможно, он будет вам полезен:

Sub test()
    Dim Connection As ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim QT As Excel.QueryTable
    Dim ConnectionString As String
    Dim SQL As String
    Set Connection = New ADODB.Connection
    Set rs = New ADODB.Recordset

    ConnectionString = ""
    SQL = "SELECT * FROM SomeTable"
    Connection.Open ConnectionString
    rs.Open SQL, Connection, adOpenStatic, adLockReadOnly

    Set QT = ActiveSheet.QueryTables.Add(rs, ActiveSheet.Cells(1, 1))
    QT.Refresh:    rs.Close:    QT.Delete:    Connection.Close
End Sub
person Vasily Ivoyzha    schedule 26.01.2015
comment
Это здорово, потому что QueryTables сохраняет имя столбца, в отличие от метода Range.CopyFromRecordset. По следующей ссылке можно скопировать существующие данные Excel в набор записей. Я знаю, что это может быть не связано с первым вопросом, но в сочетании с вашим ответом заполните недостающую часть и включите множество способов работы с набором записей в Excel, спасибо. usefulgyaan.wordpress.com/2013/07/11/ - person Harry Duong; 06.12.2016