Access 2007 VBA向链接SQL Server表插入BLOB时遇异常错误
解决Access调用saveBLOB函数插入大BLOB数据时的Null赋值错误
你遇到的这个问题,核心原因大概率是直接给DAO记录集的varbinary(max)字段赋值大字节数组时,老版本ODBC驱动和DAO的交互出现了数据传递异常,导致触发了“Null值赋给非Variant变量”的错误——毕竟小文件和立即窗口调用能成功,说明基础逻辑没问题,只是大文件场景下触发了驱动或DAO的处理限制。
下面是几个针对性的解决方案,按优先级排序:
1. 改用DAO的AppendChunk方法写入大BLOB数据
直接赋值rs!FileBLOB = blob对小数据量友好,但针对超过一定阈值的大文件,DAO的AppendChunk是专门为BLOB类型设计的分块写入方法,能避免数据传递时的截断或Null异常。修改saveBLOB函数中写入BLOB的代码:
原代码片段:
190 rs!FileBLOB = blob 200 rs.Update
替换为:
190 ' 编辑模式下先清空字段,避免残留数据干扰 If rs.EditMode = dbEditInProgress Then rs!FileBLOB = Null End If ' 使用AppendChunk写入二进制数组 rs!FileBLOB.AppendChunk blob 200 rs.Update
同时,建议优化文件读取的逻辑,增加空文件判断(避免数组越界):
60 fs = LOF(hdl) 70 If fs = 0 Then MsgBox "无法读取空文件!", vbExclamation saveBLOB = False GoTo CLEANUP End If 80 ReDim blob(fs - 1) ' 数组下标从0开始,总长度匹配文件字节数 90 Get #hdl, , blob
2. 检查并升级ODBC驱动
你当前使用的SQLSRV32.DLL(版本6.01.7601.17514)是比较老旧的SQL Server ODBC驱动,对varbinary(max)这类大字段的支持存在局限:
- 打开ODBC数据源管理器,找到你的SQL Server链接,进入配置页面,确保勾选了**“使用ANSI引用标识符”和“使用ANSI NULL, DEFAULT, and WARNINGS”**选项,这些设置能优化二进制数据的传递逻辑。
- 优先考虑升级到最新的ODBC Driver 17 for SQL Server,新驱动修复了大量老版本的兼容性问题,对大BLOB字段的支持更稳定。
3. 优化窗体调用的参数校验
在窗体的UploadFile过程中,增加对文件路径的有效性校验,避免传递无效路径导致后续逻辑出错:
Private Sub UploadFile() 10 If HandleErrors() Then On Error GoTo ERR_HANDLING 20 ErrorHandler().CallStack.PushCallStack Me.Name & ".UploadFile()" 30 Dim strFilePath As String 40 strFilePath = Nz(Me!txtFQFN, vbNullString) 50 ' 校验路径是否有效 60 If strFilePath = vbNullString Or Dir(strFilePath) = "" Then 70 MsgBox "请选择有效的文件路径!", vbExclamation 80 GoTo FINALLY 90 End If 100 If (Not saveBLOB(strFilePath)) Then _ MsgBox "Beim Speichern des BLOBs in der Datenbank ist ein Fehler aufgetreten.", vbExclamation FINALLY: 9000 ErrorHandler().CallStack.PopCallStack 9010 Exit Sub ERR_HANDLING: 9900 ErrorHandler().handleError ErrSinkDatabase + ErrSinkScreen, Me.Name & ".UploadFile()" 9910 Resume FINALLY End Sub
内容的提问来源于stack exchange,提问作者D.C.
相关产品推荐
相关产品推荐

