症状
通过 ADO 和 ODBC 编辑 Excel 工作表时,如果使用 ADO DataControl 对象,可能会收到以下错误消息:
[Microsoft][ODBC Excel Driver] Operation must use an updateable query.
如果使用使用 ADO 代码生成的 Recordset 对象,则通过 ADO 和 ODBC 编辑 Excel 工作表时,可能会收到以下错误消息:
Run-time error '-2147467259(80004005)': [Microsoft][ODBC Excel Driver] Operation must use an updateable query.
原因
如果尝试编辑保存或打开为 ReadOnly 的工作表,则会出现此问题。
注释
ReadOnly 是与 Excel 的 ODBC 连接的默认设置,包含或不带数据源名称(DSN)。 因此,用户必须始终更改该设置才能编辑数据。
决议
若要解决此问题,请使用以下方法:
确保 Recordset 对象的 LockType 属性未设置为 ReadOnly。
确保尝试打开的文件未保存为 ReadOnly。
如果要通过 DSN 进行连接,请执行以下步骤:
- 打开“控制面板”,然后选择“ODBC 数据源管理员”。
- 双击 DSN。
- 在“ODBC Microsoft Excel 设置”对话框中,选择“选项”。
- 确保清除 ReadOnly 复选框。
如果使用的是无 DSN 连接,请确保在连接字符串中包含“ReadOnly=0”选项。 例如:
cn.Open "Driver={Microsoft Excel Driver (*.xls)};DBQ=C:\MyDoc.xls;ReadOnly=0;"
状态
此行为是设计造成的。
详细信息
重现行为的步骤
在 Visual Basic 中创建新的 Standard EXE 项目。
在“项目”菜单上,选择“引用”,然后添加对 Microsoft ActiveX 数据对象库的引用。
向 Form1 添加命令按钮。
将以下代码添加到 Form1:
Dim rs As ADODB.Recordset Dim cn As ADODB.Connection Private Sub Form_Load() Command1.Caption = "Edit" End Sub Private Sub Command1_Click() Dim DocPath As String DocPath = App.Path & "\Test.xls" Set cn = New Connection Set rs = New Recordset cn.Open "Driver={Microsoft Excel Driver (*.xls)};DBQ=" & DocPath & ";ReadOnly=1" rs.LockType = adLockOptimistic rs.Open "TB1", cn rs.AddNew rs.Fields(1).Value = "New Value" rs.Update rs.Close cn.Close Set rs = Nothing Set cn = Nothing End Sub
保存应用程序。
创建新的 Excel 工作表,然后将工作表另存为 Test.xls。
在“插入”菜单上,指向“名称”,然后选择“定义”。
在 Excel 工作表中创建一个新表,然后将表命名为 TB1。
将工作表保存在与 Visual Basic 应用程序相同的文件夹中。
按 F5 运行应用程序。
参考文献
有关详细信息,请参阅 Office Space:Microsoft Office 应用程序脚本的提示和技巧。