VBA - Создать ADODB.Recordset из содержимого электронной таблицы - PullRequest
3 голосов
/ 20 марта 2010

Я работаю над приложением Excel, которое запрашивает базу данных SQL. Запросы могут занимать много времени (20-40 мин). Если я что-то неправильно кодировал, это может занять много времени, чтобы ошибиться или достичь точки останова. Я могу сохранить результаты на листе, но когда я работаю с наборами рекордов, все может взорваться.

Есть ли способ загрузить данные в ADODB.Recordset при отладке, чтобы пропустить запрос к базе данных (после первого раза)?

Буду ли я использовать что-то вроде этого?

Запрос листа Excel в MS-Access VBA (с использованием набора записей ADODB)

Ответы [ 2 ]

6 голосов
/ 22 марта 2010

Мне пришлось установить MDAC, чтобы получить msado15.dll, и как только он у меня появился, я добавил ссылку на него из (на Win7 64bit):

C: \ Program Files (x86) \ Common Files \ System \ ado \ msado15.dll

Затем я создал функцию для возврата объекта ADODB.Recordset, передавая имя листа, которое существует в текущей активной книге. Вот код для всех остальных, если им это нужно, включая Sub Test (), чтобы посмотреть, работает ли он:

Public Function RecordSetFromSheet(sheetName As String)

Dim rst As New ADODB.Recordset
Dim cnx As New ADODB.Connection
Dim cmd As New ADODB.Command

    'setup the connection
    '[HDR=Yes] means the Field names are in the first row
    With cnx
        .Provider = "Microsoft.Jet.OLEDB.4.0"
        .ConnectionString = "Data Source='" & ThisWorkbook.FullName & "'; " & "Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'"
        .Open
    End With

    'setup the command
    Set cmd.ActiveConnection = cnx
    cmd.CommandType = adCmdText
    cmd.CommandText = "SELECT * FROM [" & sheetName & "$]"
    rst.CursorLocation = adUseClient
    rst.CursorType = adOpenDynamic
    rst.LockType = adLockOptimistic

    'open the connection
    rst.Open cmd

    'disconnect the recordset
    Set rst.ActiveConnection = Nothing

    'cleanup
    If CBool(cmd.State And adStateOpen) = True Then
        Set cmd = Nothing
    End If

    If CBool(cnx.State And adStateOpen) = True Then cnx.Close
    Set cnx = Nothing

    '"return" the recordset object
    Set RecordSetFromSheet = rst

End Function

Public Sub Test()

Dim rstData As ADODB.Recordset
Set rstData = RecordSetFromSheet("Sheet1")

Sheets("Sheet2").Range("A1").CopyFromRecordset rstData

End Sub

Данные Sheet1: Поле1 Поле2 Поле3 Красный А 1 Синий B 2 Зеленый C 3

Что следует скопировать на Лист 2: Красный А 1 Синий B 2 Зеленый C 3

Это экономит ОГРОМНОЕ количество времени от запросов к SQL каждый раз, когда я хочу внести изменение и проверить его ...

- Роберт

2 голосов
/ 22 марта 2010

Проще всего было бы использовать rs.Save "filename" и rs.Open "filename" для сериализации клиентских наборов записей в файлы.

...