Access中Large Number类型字段更新失败问题求助
解决Access VBA更新Large Number字段时的"Multiple-step OLE DB operation generated errors"错误
问题重现
测试代码如下:
Private Sub test() Dim rs As New ADODB.Recordset Dim size As LongLong rs.Open "Select * From LocalFiles ", _ CurrentProject.AccessConnection, adOpenKeyset, adLockOptimistic rs.AddNew size = 12345678912345# rs("FileSize") = size rs.Update ' 报错:Multiple-step OLE DB operation generated errors rs.Close End Sub
- 数据库
FileSize字段为Large Number类型,已启用该类型且为支持Large Number的新数据库 - 使用VBA的
LongLong类型存储数据,仅在赋值rs("FileSize") = size后触发更新错误
原因分析
你推测的OLE DB驱动不支持Large Number类型是准确的。Access的ADODB连接(基于OLE DB)对Large Number字段的原生支持存在兼容性问题,无法直接将VBA的LongLong类型值映射到该字段。
解决办法
方法1:使用DAO记录集替代ADODB
DAO是Access原生的数据访问接口,对Large Number字段支持更完善:
Private Sub test() Dim rs As DAO.Recordset Dim size As LongLong Set rs = CurrentDb.OpenRecordset("LocalFiles", dbOpenDynaset) rs.AddNew size = 12345678912345# rs("FileSize") = size rs.Update rs.Close Set rs = Nothing End Sub
方法2:通过SQL语句直接插入/更新
绕开记录集赋值,直接用参数化SQL传递数值:
Private Sub test() Dim size As LongLong Dim sqlStr As String size = 12345678912345# sqlStr = "INSERT INTO LocalFiles (FileSize) VALUES (@FileSize)" With CurrentProject.Connection .Execute sqlStr, Array(size) End With End Sub
方法3:将数值转为字符串后赋值(临时 workaround)
如果必须使用ADODB,可以先把LongLong转为字符串,再赋值给字段:
Private Sub test() Dim rs As New ADODB.Recordset Dim size As LongLong rs.Open "Select * From LocalFiles ", _ CurrentProject.AccessConnection, adOpenKeyset, adLockOptimistic rs.AddNew size = 12345678912345# rs("FileSize") = CStr(size) ' 转为字符串赋值 rs.Update rs.Close Set rs = Nothing End Sub
注意:此方法仅适用于纯数字的Large Number字段,若字段涉及小数需额外处理。
内容的提问来源于stack exchange,提问作者h2oyes ss
相关产品推荐
相关产品推荐

