Excel VBA ADODB Access Database Lookup - Сократить время запроса - PullRequest
0 голосов
/ 02 октября 2018

Я написал некоторый код VBA, который запрашивает базу данных доступа и вытягивает этот код в ячейки.Это работает, но очень медленно, в основном из-за того, как я это написал, однако я изо всех сил пытаюсь ускорить его.

Первый и второй запросы совпадают, за исключением того, что второй запрос имеет смещение в 1 месяц.

Как я могу ускорить это?

Первая проблема заключается в том, что мне кажется, что мне приходится подключать и закрывать базу данных каждый цикл.Если я пытаюсь выполнить оба запроса в рамках одного подключения к базе данных, я получаю сообщение об ошибке.

Второй вопрос - соединение кажется довольно медленным.

  ' FIRST MONTH QUERY
  db.Connect
     db.RunGetResults ("SELECT data.*, monthdata.VAL, monthdata.MONTHVAL, monthdata.GREEN, monthdata.RED, monthdata.RAG, monthdata.CREATOR FROM data LEFT JOIN monthdata ON data.UID = monthdata.DATAUID WHERE [UID] = '" & (IDcell) & "'  AND [MONTHVAL] = #" & Format(Range("multidate"), "mm/dd/yyyy") & "#")
    'Debug.Print db.Recordset.RecordCount

            irow = IDcell.Row
            Do Until db.Recordset.EOF
            icol = 2
            For Each ifield In db.Recordset.Fields
            Sheet3.Cells(irow, icol) = ifield.Value
                icol = icol + 1
                Next
            i = i + 1
           progress i

            db.Recordset.MoveNext
            If db.Recordset.EOF = True Then
            Else
            End If
            Loop
        End If

    Next
    db.Disconnect

   GoTo 69

   ' SECOND MONTH QUERY
             For Each IDcell In Rng
            If IDcell <> "" Then
            db.Connect
            'Application.Goto Reference:="month2"
            db.RunGetResults ("SELECT monthdata.VAL, monthdata.MONTHVAL, monthdata.GREEN, monthdata.RED, monthdata.RAG, monthdata.CREATOR FROM data LEFT JOIN monthdata ON data.UID = monthdata.DATAUID WHERE [UID] = '" & (IDcell) & "'  AND [MONTHVAL] = #" & Format((month2), "mm/dd/yyyy") & "#")

            'Debug.Print db.Recordset.RecordCount

            irow = IDcell.Row
            Do Until db.Recordset.EOF
            icol = 18
            For Each ifield In db.Recordset.Fields
            Sheet3.Cells(irow, icol) = ifield.Value
            icol = icol + 1
            Next
             i = i + 1
           progress i
            db.Recordset.MoveNext
            If db.Recordset.EOF = True Then
            Else
            End If
            Loop
        End If
    Next
    db.Disconnect

Редактировать

По запросу это объект БД

Public WithEvents Connection As ADODB.Connection
Public WithEvents Recordset As ADODB.Recordset
Public Command As New ADODB.Command
Public FilePath
Public Password

Public Function Connect()

    If Connection.State = 1 Then Disconnect

   AccessConnect = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" & FilePath & "';Jet OLEDB:Database Password='" & Password & "';"

       Connection.ConnectionString = AccessConnect
       Connection.CursorLocation = adUseClient
       Connection.mode = adModeReadWrite
       Connection.Open

End Function

Public Function Disconnect()
    On Error Resume Next
    Connection.Close
    On Error GoTo 0
End Function

Public Function RunGetResults(qryString)

    sqlQuery = qryString
    Recordset.Open sqlQuery, Connection, adOpenKeyset, adLockOptimistic

End Function
Public Function Execute(qryString)

    Connection.Execute (qryString)

End Function

Public Function Esc(eString)
    eString = Replace(eString, "'", "''")
    Esc = eString
End Function

Private Sub Class_Initialize()
    Set Connection = New ADODB.Connection
    Set Recordset = New ADODB.Recordset

    Password = "xxxxx"
End Sub

1 Ответ

0 голосов
/ 02 октября 2018

Я предлагаю использовать adOpenKeyset, adLockOptimistic только тогда, когда вам это нужно.

Затвор и защелка несут накладные расходы.Если вы только собираетесь читать, используйте adOpenStatic, adLockReadOnly.Это не блокирует записи и не требует постоянного подключения для получения обновлений при удалении записей.

Весь ваш объект базы данных мне кажется странным.Вы объявляете набор записей и связь с событиями, но не слушаете никаких событий.Все это влечет за собой некоторые накладные расходы.

Вы также можете отключить набор записей, но если вы используете набор записей статического типа с блокировкой только для чтения, которая, вероятно, не будет иметь большого значения.

...