Excel VBA ADODB Access数据库查找-减少查询时间

时间:2018-10-02 09:57:27

标签: excel database vba ms-access adodb

我编写了一些VBA代码,该代码查询访问数据库并将该代码放入单元格中。它可以工作,但是非常慢,主要取决于我的编写方式,但是我一直在努力加快速度。

第一个查询和第二个查询相同,除了第二个查询的偏移量为1个月。

如何加快速度?

第一个问题是我似乎必须在每个循环中连接和关闭数据库。如果我尝试在同一数据库连接中运行两个查询,则会收到错误消息。

第二个问题是联接似乎很慢。

Lock

编辑

根据请求,这是数据库对象

  ' 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

1 个答案:

答案 0 :(得分:1)

我建议仅在需要时使用android.enableD8.desugaring=false

锁定和闩锁会产生开销。如果您只想阅读,请使用adOpenKeyset, adLockOptimistic。这不会锁定记录,并且在记录被删除时不需要持续的连接来接收更新。

您的整个数据库对象对我来说都很奇怪。您在声明记录集和与事件的连接,但不监听任何事件。所有这些都会产生一些开销。

您还可以断开记录集的连接,但是,如果您使用的是带有只读锁的静态类型的记录集,则可能不会有太大的不同。