PRB: "Операция должна использовать обновляемый запрос" При доступе к Excel через ODBC
Симптомы
При редактировании листа Excel с помощью ADO и ODBC может появиться следующее сообщение об ошибке при использовании объекта ADO DataControl:
[Microsoft][ODBC Excel Driver] Operation must use an updateable query.
При использовании объекта Recordset, созданного с помощью кода ADO, при редактировании листа Excel с помощью ADO и ODBC может появиться следующее сообщение об ошибке:
Run-time error '-2147467259(80004005)': [Microsoft][ODBC Excel Driver] Operation must use an updateable query.
Причина
Эта проблема возникает при попытке изменить лист, сохраненный или открытый как ReadOnly.
Примечание.
ReadOnly — это параметр по умолчанию для подключения ODBC к Excel с именем источника данных (DSN) или без нее. Поэтому пользователь всегда должен изменить этот параметр, чтобы изменить данные.
Разрешение
Чтобы устранить эту проблему, используйте следующие методы:
Убедитесь, что для свойства LockType объекта Recordset не задано значение ReadOnly.
Убедитесь, что файл, который вы пытаетесь открыть, не сохранен как ReadOnly.
Если вы подключаетесь через DSN, выполните следующие действия.
- Откройте панель управления и щелкните Администратор источника данных ODBC.
- Дважды щелкните имя DSN.
- В диалоговом окне Настройка MICROSOFT Excel ODBC нажмите кнопку Параметры.
- Убедитесь, что флажок Только чтение проверка не установлен.
Если вы используете подключение без DSN, обязательно включите в строка подключения параметр ReadOnly=0. Например:
cn.Open "Driver={Microsoft Excel Driver (*.xls)};DBQ=C:\MyDoc.xls;ReadOnly=0;"
Статус
Такое поведение является особенностью данного продукта.
Дополнительные сведения
Действия по воспроизведению поведения
Создайте проект EXE уровня "Стандартный" в Visual Basic.
В меню Проект выберите ссылки, а затем добавьте ссылку на библиотеку объектов данных Microsoft ActiveX.
Добавьте кнопку Command в 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, а затем назовите ее ТБ1.
Сохраните лист в той же папке, что и приложение Visual Basic.
Нажмите клавишу F5, чтобы запустить приложение.
Ссылки
Дополнительные сведения см. в следующей статье:
Офисное пространство: советы и рекомендации по созданию сценариев приложений Microsoft Office
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по