如何解决VBA操作Movies.accdb时出现的运行时错误3219
报错原因排查
- 游标类型不兼容:你当前使用的
adOpenForwardOnly(仅向前游标)在Access ACE引擎的适配中对写入操作支持度差,即便配置了adLockOptimistic锁类型,也经常出现无法执行Update的问题,这是该数据库触发报错的最核心原因。 - 数据表存在未赋值的必填字段:wiseowl教程的
tblFilm表默认通常包含FilmID(如果未设置自增主键)、FilmGenreID等必填约束字段,你当前代码仅赋值3个字段,若存在其他必填项未赋值会触发写入失败。 - 数据库文件被系统锁定:从网站下载的accdb文件默认会被Windows标记为来自互联网的不安全文件,自动设为只读状态,无法执行写入操作。
- 字段类型不匹配:若Excel中待写入的
FilmReleaseDate值为文本格式,无法直接转换为Access的日期类型,也会触发Update失败。
解决方案
- 替换游标类型:将
CursorType参数从adOpenForwardOnly改为adOpenKeyset(键集游标),该游标对Access的写入操作兼容性最好。 - 检查表结构必填项:打开
Movies.accdb的tblFilm设计视图,确认所有标记为「必填=是」的字段都在代码中完成赋值,若有不需要的必填项可直接修改表结构设置为「必填=否」。 - 解除文件锁定:右键点击
Movies.accdb文件,选择「属性」,在常规选项卡底部勾选「解除锁定」后点击确定。 - 强制转换字段类型:对日期、数值类型的字段赋值时增加类型转换,避免格式不兼容。
修改后代码示例
Const cnstrAccess As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\sam\Desktop\Today\Movies.accdb;Persist Security Info=False;" Sub ADOModifyingDataWIthRecordset() Dim MoviesConn As ADODB.Connection Dim MoviesData As ADODB.Recordset Dim r As Range Set MoviesConn = New ADODB.Connection MoviesConn.ConnectionString = cnstrAccess MoviesConn.Open On Error GoTo CloseConnection Set MoviesData = New ADODB.Recordset With MoviesData .ActiveConnection = MoviesConn .Source = "tblFilm" ' 修改游标类型为键集游标 .CursorType = adOpenKeyset .LockType = adLockOptimistic .Open On Error GoTo CloseRecordset Sheet2.Activate For Each r In Sheet2.Range("A2", Sheet2.Range("A1").End(xlDown)) .AddNew .Fields("FilmName").Value = r.Offset(0, 1).Value ' 强制转换为日期类型,避免格式不兼容 .Fields("FilmReleaseDate").Value = CDate(r.Offset(0, 2).Value) .Fields("FilmRunTimeMinutes").Value = 101 ' 若有其他必填字段,在此处补充赋值 ' .Fields("FilmGenreID").Value = 1 示例 .Update Next r End With CloseRecordset: If Err.Number <> 0 Then ' 可输出具体错误信息方便排查 Debug.Print "写入错误:" & Err.Description End If MoviesData.Close CloseConnection: MoviesConn.Close Set MoviesData = Nothing Set MoviesConn = Nothing End Sub
内容的提问来源于stack exchange,提问作者PhoenixmotoP
相关产品推荐
相关产品推荐

