【问题标题】:In VBA Query cannot be completed在 VBA 中查询无法完成
【发布时间】:2017-07-13 07:50:51
【问题描述】:

我想查找来自不同表的记录总和并将输出插入新列中,当我运行代码时它显示错误:

"查询无法完成。要么是查询结果的大小是 大于数据库的最大大小(2GB)或没有足够的 磁盘上的临时存储空间,用于存储查询结果"

它突出显示该行

STD.Open sql, cnn, adOpenStatic

我的代码如下

Option Compare Database
Option Explicit

Public cnn As New ADODB.Connection
Public db As DAO.Database

Public Sub SMain()
    Set db = Access.Application.CurrentDb
    Set cnn = CurrentProject.Connection

   Get_Value

End Sub

Private Sub Get_Value()
    Dim sql As String
    Dim STD As New ADODB.Recordset
    Dim ODR As DAO.Recordset
    Set ODR = db.OpenRecordset("Total_tbl")

    Do Until ODR.EOF
    DoEvents
    sql = "SELECT SUM(MONT_VOL.tot_n* STD_tbl.factor_n)AS TOTAL_N FROM MONT_VOL " & _
    " INNER JOIN (STD_tbl INNER JOIN Total_tbl ON STD_tbl.AREA =Total_tbl.AREA_1" & _
    " AND STD_tbl.AID = Total_tbl.AID)" & _
    " ON MONT_VOL.BID = STD_tbl.BLOCK" & _
    " WHERE MONT_VOL.BDATE = Total_tbl.Adate" & _
    " GROUP BY MONT_VOL.BID"
    STD.Open sql, cnn, adOpenStatic

        If STD.RecordCount <> 0 Then
            ODR.Edit
            ODR!New_Col= STD!TOTAL_N
            ODR.Update
        End If

        STD.Close
        ODR.MoveNext
    Loop
End Sub

我犯了什么错误? 我在

上正确调用输出吗

ODR!New_Col= STD!TOTAL_N

【问题讨论】:

标签: mysql ms-access vba


【解决方案1】:

如果查询太大(错误消息表明),那么让我们将其拆分为更小的块。这只能在 MySQL 中正确实现,Access 不支持 LIMITOFFSET,解决方法很混乱,尤其是对于总计查询

我在这里做了一些假设:

  1. 所有相关表都存储在同一个 MySQL 数据库中
  2. 您的表具有可用于 ADO 的有效连接字符串

请注意,仅在 MySQL 中执行查询可能足以修复此错误。

Private Sub Get_Value()
    Dim sql As String
    Dim STD As New ADODB.Recordset
    Dim ODR As DAO.Recordset
    Set ODR = db.OpenRecordset("Total_tbl")
    'Create a new ADODB connection that's directly to MySQL, and doesn't use Access
    Dim adoConn2 As ADODB.Connection
    adoConn2.ConnectionString = CurrentDb.TableDefs("MONT_VOL").Connect
    adoConn2.Open
    'Initialize variables used for pagination
    Dim RecordCount As Integer
    Dim PageSize As Integer
    Dim Offset As Integer
    Offset = 0
    RecordCount = 1
    PageSize = 100
    Do Until ODR.EOF
    DoEvents

    While RecordCount <> 0
        sql = "SELECT SUM(MONT_VOL.tot_n* STD_tbl.factor_n)AS TOTAL_N FROM MONT_VOL " & _
        " INNER JOIN (STD_tbl INNER JOIN Total_tbl ON STD_tbl.AREA =Total_tbl.AREA_1" & _
        " AND STD_tbl.AID = Total_tbl.AID)" & _
        " ON MONT_VOL.BID = STD_tbl.BLOCK" & _
        " WHERE MONT_VOL.BDATE = Total_tbl.Adate" & _
        " GROUP BY MONT_VOL.BID" & _
        " LIMIT " & Offset & "," & PageSize

        STD.Open sql, adoConn2, adOpenStatic
        RecordCount = STD.RecordCount
            If STD.RecordCount <> 0 Then
                ODR.Edit
                ODR!New_Col = STD!TOTAL_N
                ODR.Update
            End If

            STD.Close
            Offset = Offset + PageSize
        Wend
        ODR.MoveNext
    Loop
    adoConn2.Close
End Sub

【讨论】:

  • 谢谢,现在又出现一个错误是什么原因? [Microsoft] [ODBC Driver Manager] 未找到数据源名称且未指定默认驱动程序。 它突出显示adoConn2.Open
  • 好吧,如前所述,假设所有表都在 MySQL 中,并且所有表都有有效的连接字符串。 MONT_VOL 的桌子在哪里?
  • 这是来自服务器的链接表。(外部数据)
  • 你能Debug.Print TableDefs("MONT_VOL").Connect(如果有的话,用xxxx替换密码和用户名)吗?
  • 那么该表没有链接到 MySQL 中的表,您不能对其进行直通查询。请编辑您的问题以正确反映 MySQL 中的哪些表以及 Access 中的哪些表
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-23
相关资源
最近更新 更多