PRB: ASP возвращает ошибку «В операции должен использоваться обновляемый запрос»

Проблема

При совместном использовании ActiveX Data Objects (ADO) и Active Server Pages (ASP) может произойти следующая типичная ошибка:

Служба доступа Microsoft OLE DB для драйверов ODBC ошибка '80004005'

[Microsoft][Драйвер ODBC для Microsoft Access 97] В операции должен использоваться обновляемый запрос.

Причина

В данной статье описаны основные четыре причины возникновения такой ошибки и способы устранения проблемы в каждом из случаев. Хотя данная статья относится к базам данных Microsoft Access, представленные в ней сведения применимы и к другим типам баз данных.

Решение

Такая ошибка обычно возникает при попытке сценария выполнить запрос UPDATE или какое-либо другое действие, изменяющее информацию в базе данных. Такая ошибка возникает, поскольку объекту ADO не удается сделать запись в базе данных по одной из следующих причин.

  1. Наиболее распространенная ошибка состоит в том, что у гостевой учетной записи Интернета (IUSR_MACHINE), являющейся по умолчанию частью группы «Все», не имеется разрешения на запись в файл базы данных (MDB). Для устранения такой ошибки перейдите в проводнике на вкладку «Безопасность» и измените свойства для этого файла, чтобы пользователи гостевой учетной записи Интернета имели требуемые разрешения.

    Примечание. При использовании баз данных Microsoft Access совместно с объектом ADO также необходимо предоставить пользователям гостевой учетной записи Интернета права на запись в папку, содержащую файл MDB. Это связано с тем, что модуль Microsoft Jet создает файл LDB для обработки защиты базы данных. Может потребоваться также предоставить права чтения и записи в папку Temp, поскольку модулем Microsoft Jet могут быть созданы временные файлы в данной папке.
  2. Второй причиной такой ошибки является то, что база данных была открыта в неправильном для записи режиме. При выполнении действия «Открыть» над объектом «Подключение» используется свойство «Режим», показывающее разрешения для данного подключения как показано ниже.

          SQL = "UPDATE Products Set UnitPrice = 2;"
    Set Conn = Server.CreateObject("ADODB.Connection")
    Conn.Mode = 3 '3 = adModeReadWrite
    Conn.Open "myDSN"
    Conn.Execute(SQL)
    Conn.Close

    Примечание. По умолчанию для параметра MODE задано значение 0 (adModeUnknown), что обычно позволяет вносить обновления.
  3. Еще одной причиной такой ошибки является установленный флажок «Только чтение» на странице «Параметры» для имен источника данных в диспетчере ODBC.
  4. Последняя причина и ее решение относятся к источнику данных SQL. Ошибка могла быть вызвана инструкциями SQL, нарушающими целостность базы данных на уровне ссылок. Ниже представлены несколько наиболее распространенных запросов, вызывающих сбой.
    • Самую простую группу представляют неизменяемые запросы: перекрестные запросы, запросы к серверу SQL, запросы на объединение или на обновление (на создание таблицы), у которых для свойств UniqueValue заданы значения «Да».

    • Другой распространенный случай происходит при объединении связанных таблиц ODBC, не имеющих уникальных индексов. В этом случае нельзя гарантировать, что записи останутся уникальными в таблице, значения полей которой изменяются при запросе.

    • Лишь один случай имеет надежное решение. Если выполняется попытка обновления связанного поля запроса «один-ко-многим» со стороны «один», то, если не включено каскадное обновление, произойдет сбой. При таком способе выполняется делегирование целостности базы данных на уровне ссылок в ядро JET.

Статус

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

Номер статьи: 175168 — последний просмотр: 29 сент. 2004 г. — редакция: 1

Отзывы и предложения