vba - ADO 错误 没有足够的内存资源来完成此操作
问题描述
我已经CheckInvTotals
在 Access 2010 数据库中使用 ADO 函数 5 年了,没有出现任何问题。最近我迁移到 Office 2019 并且此函数未能返回以下消息:
错误 -2147024882(没有足够的内存资源来完成此操作。)
我可以绕过启动表单来测试这个功能。以这种方式执行函数仍然失败并出现上述错误,因此其他正在运行的对象不太可能导致内存泄漏。
我参考Microsoft ActiveX Data Objects 6.1 Library
. 我想知道 ADO 失败的原因并收到有关我可能会尝试消除 ADO 例程中的错误的建议。
- 我曾尝试引用 ADO 的早期版本,但无济于事
- 随附的 DAO 代码
CheckInvTotals2
正常运行 - ADO 故障也出现在 Office 2016 中
Public Function CheckInvTotals(lngPayID As Long) As Boolean
'Is there a difference between Invoice Total and payment amount
Dim cmd As New ADODB.Command
Dim rst As New ADODB.Recordset
On Error GoTo CheckInvTotals_Error
With cmd
.CommandText = "qryprmInvDiff"
.CommandType = adCmdStoredProc
Set .ActiveConnection = CurrentProject.Connection
.Parameters.Append .CreateParameter("PayID", adBigInt, adParamInput, , lngPayID)
rst.CursorType = adOpenStatic
Set rst = .Execute
End With
CheckInvTotals = rst.EOF
rst.Close
CheckInvTotals_Error:
If Err Then
MsgBox "Error " & Err.Number & " (" & Err.Description & ")"
End If
Set rst = Nothing
Set cmd = Nothing
End Function
Public Function CheckInvTotals2(lngPayID As Long) As Boolean
'Is there a difference between Invoice Total and payment amount
Dim db As Database
Dim qd As DAO.QueryDef
Dim prmPayID As DAO.Parameter
Dim rst As DAO.Recordset
On Error GoTo Handle_err
Set db = CurrentDb
Set qd = db.QueryDefs("qryprmInvDiff")
Set prmPayID = qd.Parameters!PayID
prmPayID.Value = lngPayID
Set rst = qd.OpenRecordset
CheckInvTotals2 = rst.EOF
rst.Close
Handle_err:
If Err Then
MsgBox "Error " & Format(Err.Number) & " " & Err.Description
Err.Clear
End If
On Error Resume Next
Set rst = Nothing
Set prmPayID = Nothing
Set qd = Nothing
Set db = Nothing
End Function
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]));
代码应该简单地返回true
或false
。
解决方案
有点太晚了,但是今天我遇到了这个问题,也许还有其他人……
微软信息:https ://docs.microsoft.com/en-us/office/troubleshoot/access/adbigint-data-type-errors
解决方案:将 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"))
```
推荐阅读
- artifactory - 如何将身份验证证书添加到存储库
- azure - 无法通过 Azure Dev Spaces 启动 Web
- python - 从提交按钮请求python获取下载的文件
- python - 将 95% 置信区间作为误差线添加到 pandas 条形图
- python-3.x - 遇到问题“TypeError: String Indeces must be an integer”
- mysql - 在尝试定义我的表时收到错误
- python - 在 DF 中删除特定值的重复项
- apache-kafka - 如何在 KSQL 应用程序中设置 group.id
- fiware - 发送到 ContextBroker 的命令未到达 IOT 代理
- python-3.x - 如何在 python 中规范化或标准化数据集的特定或选定特征