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