Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba ADO错误没有足够的内存资源来完成此操作_Vba_Ms Access_Ado_Dao - Fatal编程技术网

Vba ADO错误没有足够的内存资源来完成此操作

Vba ADO错误没有足够的内存资源来完成此操作,vba,ms-access,ado,dao,Vba,Ms Access,Ado,Dao,我已经在Access 2010数据库中使用ADO函数CheckInvTotals5年了,没有出现任何问题。最近我已迁移到Office 2019,此功能无法返回以下消息: 错误-2147024882(内存资源不足,无法完成此操作。) 我可以绕过启动窗体来测试这个函数。以这种方式执行函数仍然会失败,并出现上述错误,因此其他正在运行的对象不太可能导致内存泄漏 我参考了Microsoft ActiveX数据对象6.1库。 我想知道ADO失败的原因,并收到关于如何消除ADO例程中的错误的建议 我尝试引用A

我已经在Access 2010数据库中使用ADO函数
CheckInvTotals
5年了,没有出现任何问题。最近我已迁移到Office 2019,此功能无法返回以下消息:

错误-2147024882(内存资源不足,无法完成此操作。)

我可以绕过启动窗体来测试这个函数。以这种方式执行函数仍然会失败,并出现上述错误,因此其他正在运行的对象不太可能导致内存泄漏

我参考了Microsoft ActiveX数据对象6.1库。 我想知道ADO失败的原因,并收到关于如何消除ADO例程中的错误的建议

  • 我尝试引用ADO的早期版本,但没有成功
  • 所附DAO代码
    CheckInvTotals2
    运行正常,无错误
  • ADO故障也发生在Office 2016中
  • 公共函数CheckInvTotals(长度为lngPayID)为布尔值
    “发票总额和付款金额之间有差异吗
    Dim cmd作为新的ADODB.Command
    将rst设置为新ADODB.Recordset
    On错误转到CheckInvTotals\U错误
    使用cmd
    .CommandText=“qryprmInvDiff”
    .CommandType=adCmdStoredProc
    Set.ActiveConnection=CurrentProject.Connection
    .Parameters.Append.CreateParameter(“PayID”、adBigInt、adParamInput、lngPayID)
    rst.CursorType=adOpenStatic
    设置rst=.Execute
    以
    CheckInvTotals=rst.EOF
    rst.关闭
    检查INVU错误:
    如果有错误,那么
    MsgBox“Error”和Err.Number&“(&Err.Description&”)
    如果结束
    设置rst=无
    Set cmd=Nothing
    端函数
    公共函数CheckInvTotals2(lngPayID长度)为布尔值
    “发票总额和付款金额之间有差异吗
    dimdb作为数据库
    将qd变暗为DAO.QueryDef
    作为DAO.Parameter的Dim prmPayID
    将rst设置为DAO.Recordset
    On Error转到Handle\u err
    Set db=CurrentDb
    设置qd=db.querydfs(“qryprmInvDiff”)
    设置prmPayID=qd.参数!帕伊德
    prmPayID.Value=lngPayID
    Set rst=qd.OpenRecordset
    CheckInvTotals2=rst.EOF
    rst.关闭
    处理错误:
    如果有错误,那么
    MsgBox“错误”和格式(错误号)&“错误描述”
    呃,明白了
    如果结束
    出错时继续下一步
    设置rst=无
    设置prmPayID=Nothing
    设置qd=无
    Set db=Nothing
    端函数
    
    SQL
    qryprmInvDiff

    PARAMETERS PayID Long;
    SELECT Creditors.CName, Creditors.Code, [InvTotal]-[Amount] AS Diff FROM 
    Creditors INNER JOIN (Payments INNER JOIN qryPayInvTotal ON 
    Payments.ID = qryPayInvTotal.PayID) ON Creditors.ID = Payments.CID
    WHERE ((([InvTotal]-[Amount])<>0) AND ((Payments.PID)=[PayID]));
    
    参数PayID Long;
    选择benders.CName、benders.Code、[InvTotal]-[Amount]作为差异来源
    债权人内部联接(付款内部联接qryPayInvTotal ON
    Payments.ID=qrypayiinvtotal.PayID)债权人。ID=Payments.CID
    其中((([InvTotal]-[Amount])0)和((Payments.PID)=[PayID]);
    

    代码应该简单地返回
    true
    false

    有点太晚了,但是今天我遇到了这个问题,可能还有其他人也遇到了这个问题

    微软资讯:

    解决方案:将adBigInt更改为更合适的值,在我的例子中,adNumeric执行此任务

      Set Cmd = New ADODB.Command
    
      RS.MoveFirst
    
      With Cmd
        .ActiveConnection = CurrentProject.Connection
        .CommandType = adCmdText
        .CommandText = strSQL
    
        .Parameters.Append .CreateParameter("@idposition", adChar, adParamInput, 36, strGUID)
        .Parameters.Append .CreateParameter("@idbeleg", adChar, adParamInput, 36, RS.Fields("idbeleg"))
    
        ' ########### A2019 > adBigInt changed to adNumeric (Database Datatype: Long (Integer))
        '.Parameters.Append .CreateParameter("@sortnr", adBigInt, adParamInput, , RS.Fields("sortnr"))
    
        .Parameters.Append .CreateParameter("@sortnr", adNumeric, adParamInput, , RS.Fields("sortnr"))
    ```
    

    检索记录集纯粹是为了查看是否存在任何记录。您应该编写一个SQL命令,该命令将返回记录计数,该计数将指示零或不为零,这将更加有效。您还应该指定
    adForwardOnly
    ,除非您特别需要向后移动记录(在示例中没有)。每个查询都应该返回所需的最小数据量。它更快、更高效。您是否考虑过问题是否是由于使用64位Microsoft Access造成的?谢谢@Gareth。同意,简单地测试EOF状态而不是返回记录计数是我糟糕的表现。但是,修改查询以对返回的记录求和失败,错误为…表达式太复杂,无法计算。我想这就是我选择EOF测试的原因。我已将光标修改为仅使用adOpenForwardOnly,但未成功感谢@UnhandledException确实,进一步阅读表明ADO.Net可以解决此问题,但这不是使用VBA访问的选项。几年前,我相信DAO将被ADO所取代,所以我尽可能地使用ADO。现在看来,在Office/VBA环境中,DAO是MS的首选