MS-Access自动添加附件报错:Invalid field data type求助
解决Access VBA中Attachment字段"Invalid field data type"错误
错误根源
Access的Attachment字段并非普通字段,它本质是嵌套的DAO.Recordset2对象,而非简单的字段值。原代码中直接将rs("Field1")赋值给DAO.Field2并调用LoadFromFile或设置Value的方式,完全不符合Attachment字段的操作逻辑,这就是报错的核心原因。
另外,原代码中先读取文件二进制再转Base64的操作是冗余的——Attachment字段支持直接通过LoadFromFile加载本地文件,无需额外编码转换。
修正后的代码
Option Compare Database Option Explicit Public Sub UpdateAttachments() Dim rsMain As DAO.Recordset Dim rsAttach As DAO.Recordset2 Dim hyperlinkPath As String Dim attachmentPath As String '打开主表记录集 Set rsMain = CurrentDb.OpenRecordset("tblParts", dbOpenDynaset) Do Until rsMain.EOF '提取超链接字段中的实际文件路径 hyperlinkPath = rsMain("Print") 'Access超链接格式为:显示文本#文件路径#,提取中间的路径部分 If InStr(hyperlinkPath, "#") > 0 Then attachmentPath = Split(hyperlinkPath, "#")(1) '替换URL编码的空格 attachmentPath = Replace(attachmentPath, "%20", " ") Else '如果超链接格式异常,跳过当前记录 rsMain.MoveNext GoTo NextRecord End If '验证文件是否存在 If Dir(attachmentPath) = "" Then rsMain.MoveNext GoTo NextRecord End If rsMain.Edit '获取Attachment字段的嵌套记录集 Set rsAttach = rsMain("Field1").Value '如果已有附件,可选择删除旧附件(根据需求调整) If rsAttach.RecordCount > 0 Then rsAttach.MoveFirst Do Until rsAttach.EOF rsAttach.Delete rsAttach.MoveNext Loop End If '添加新附件 rsAttach.AddNew '直接加载本地文件到Attachment字段的FileData字段 rsAttach("FileData").LoadFromFile attachmentPath '可选:设置附件的显示文件名 rsAttach("FileName") = Dir(attachmentPath) rsAttach.Update '关闭嵌套记录集 rsAttach.Close rsMain.Update NextRecord: rsMain.MoveNext Loop rsMain.Close Set rsAttach = Nothing Set rsMain = Nothing End Sub
关键修正点说明
- 操作嵌套记录集:Attachment字段的
Value属性返回的是Recordset2,必须通过这个嵌套记录集来添加/删除附件。 - 简化路径提取:利用Split函数直接拆分Access超链接的标准格式(
显示文本#路径#),比原代码的Mid截取更可靠。 - 冗余代码移除:删除了二进制读取和Base64编码的步骤,直接用
LoadFromFile加载文件,符合Attachment字段的原生操作逻辑。 - 增加异常处理:添加了文件存在性检查和超链接格式验证,避免因无效路径导致的额外错误。
内容的提问来源于stack exchange,提问作者jdev1234
相关产品推荐
相关产品推荐

