VBA - Создайте ADODB.Recordset из содержания электронной таблицы

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

Существует ли способ загрузить данные в ADODB.Recordset, когда я отлаживаю для пропуска запросов базы данных (после первого раза)?

Я использовал бы что-то вроде этого?

Запросите рабочий лист Excel в MS-Access VBA (использующий ADODB recordset)

5
задан Community 23 May 2017 в 12:18
поделиться

2 ответа

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

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

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

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 Красный A 1 {{1} } Синий B 2 Зеленый C 3

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

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

- Роберт

8
ответ дан 13 December 2019 в 22:05
поделиться

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

2
ответ дан 13 December 2019 в 22:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: