Най-бързият 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