Поделиться через


Ошибка "Операция должна использовать обновляемый запрос" При доступе к 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. Убедитесь, что флажок ReadOnly снят.
  • Если вы используете подключение без dsN, обязательно включите параметр ReadOnly=0 в строку подключения. Рассмотрим пример.

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

Состояние

Это поведение является намеренным.

Дополнительная информация

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

  1. Создайте проект STANDARD EXE в Visual Basic.

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

  3. Добавьте командную кнопку в 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, чтобы запустить приложение.

Ссылки

Дополнительные сведения см. в разделе Office Space: советы и рекомендации по созданию сценариев приложений Microsoft Office.