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, выполните следующие действия.

    1. Откройте панель управления и щелкните Администратор источника данных ODBC.
    2. Дважды щелкните имя DSN.
    3. В диалоговом окне Настройка MICROSOFT Excel ODBC нажмите кнопку Параметры.
    4. Убедитесь, что флажок Только чтение проверка не установлен.
  • Если вы используете подключение без DSN, обязательно включите в строка подключения параметр ReadOnly=0. Например:

    cn.Open "Driver={Microsoft Excel Driver (*.xls)};DBQ=C:\MyDoc.xls;ReadOnly=0;"
    

Статус

Такое поведение является особенностью данного продукта.

Дополнительные сведения

Действия по воспроизведению поведения

  1. Создайте проект EXE уровня "Стандартный" в Visual Basic.

  2. В меню Проект выберите ссылки, а затем добавьте ссылку на библиотеку объектов данных Microsoft ActiveX.

  3. Добавьте кнопку Command в Form1.

  4. Добавьте следующий код в 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  
    
  5. Сохраните приложение.

  6. Создайте новый лист Excel, а затем сохраните его как Test.xls.

  7. В меню Вставка наведите указатель мыши на пункт Имя и нажмите кнопку Определить.

  8. Создайте новую таблицу на листе Excel, а затем назовите ее ТБ1.

  9. Сохраните лист в той же папке, что и приложение Visual Basic.

  10. Нажмите клавишу F5, чтобы запустить приложение.

Ссылки

Дополнительные сведения см. в следующей статье:

Офисное пространство: советы и рекомендации по созданию сценариев приложений Microsoft Office