使用VBA执行SQL更新TXT文件遇运行时错误-2147467259求助
解决TXT文件作为数据库时UPDATE操作的运行时错误-2147467259(80004005)
我来帮你排查这个UPDATE操作的问题,这个错误通常和文本驱动的配置、文件权限或者SQL语法细节有关,咱们一步步来解决:
1. 先排查最基础的文件问题
- 关闭文件锁定:确保
banco.txt没有被其他程序(比如Excel、记事本)打开,文本文件被锁定时ADO无法写入,会直接抛出权限类错误 - 检查文件夹权限:确认当前Windows用户对目标文件夹有写入权限,右键文件夹→属性→安全选项卡,检查你的用户账户是否拥有写入、修改权限
2. 替换更稳定的ACE驱动连接字符串
原代码用的Microsoft Text Driver对文本文件的写入支持有限,推荐换成Microsoft ACE OLEDB 12.0驱动,它对文本文件的兼容性更好。修改连接字符串如下:
cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _ "Data Source=" & strFolder & ";" & _ "Extended Properties=""text;HDR=Yes;FMT=Delimited;ReadOnly=False;"";"
注意:如果是64位Excel,需要安装对应位数的ACE驱动(微软官方提供免费安装包),否则会提示驱动未找到。
3. 调整SQL语句与文件格式匹配
- 去掉表名的
.txt后缀:ACE驱动识别文本文件时,表名直接用文件名前缀即可,无需后缀:UPDATE banco SET ColunaC = '12345' WHERE ColunaB = 'GGGGG' - 确认分隔符配置:如果你的测试数据是制表符分隔(不是逗号),需要把连接字符串里的
FMT=Delimited改成FMT=TabDelimited
4. 手动创建Schema.ini文件规范列格式
ADO操作文本文件时,会依赖文件夹下的Schema.ini文件识别列的类型和格式,如果这个文件缺失,驱动可能会错误解析列数据导致更新失败。在你的目标文件夹下新建Schema.ini文件,内容如下:
[banco.txt] Format=Delimited(,) ColNameHeader=True CharacterSet=ANSI Col1=ColunaA Integer Col2=ColunaB Text Width 6 Col3=ColunaC Double
这个文件明确指定了:文件是逗号分隔、第一行是列名、各列的数据类型,能避免驱动自动识别出错。
5. 优化代码并添加错误捕获
原代码里创建Recordset对象是多余的(UPDATE操作不需要返回数据集),而且缺少错误捕获,无法获取更详细的错误信息。优化后的代码如下:
Sub UpdateTextFileData() Dim cn As ADODB.Connection, strFolder As String, sqlquery As String On Error GoTo ErrHandler Set cn = New ADODB.Connection strFolder = "你的本地文件夹路径" '替换成实际路径 '使用ACE驱动连接 cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _ "Data Source=" & strFolder & ";" & _ "Extended Properties=""text;HDR=Yes;FMT=Delimited;ReadOnly=False;"";" sqlquery = "UPDATE banco SET ColunaC = '12345' WHERE ColunaB = 'GGGGG'" cn.Execute sqlquery '直接执行UPDATE,无需Recordset MsgBox "数据更新成功!" Cleanup: '释放资源 If Not cn Is Nothing Then If cn.State = adStateOpen Then cn.Close End If Set cn = Nothing Exit Sub ErrHandler: '显示详细错误信息 MsgBox "错误编号:" & Err.Number & vbCrLf & "错误描述:" & Err.Description Resume Cleanup End Sub
内容的提问来源于stack exchange,提问作者Eduardo
相关产品推荐
相关产品推荐

