Symptome Wenn Sie ActiveX Data Objects (ADO) mit Active Server Pages (ASP) verwenden, können die folgenden häufigen Fehler auftreten:
Fehler „80004005“ beim Microsoft OLE DB-Anbieter für ODBC-Treiber
[Microsoft][ODBC Microsoft Access 97-Treiber] Der Vorgang muss eine aktualisierbare Abfrage verwenden.
Ursache In diesem Artikel werden die vier Hauptursachen für diesen Fehler und die entsprechenden Problemumgehungen beschrieben. Obwohl in diesem Artikel Microsoft Access-Datenbanken behandelt werden, gelten die hier bereitgestellten Informationen auch für andere Datenbanktypen.
Lösung Dieser Fehler tritt normalerweise auf, wenn Ihr Skript versucht, eine Aktualisierung durchzuführen oder eine andere Aktion auszuführen, die Informationen in der Datenbank ändert. Dieser Fehler tritt auf, weil ADO aus einem der folgenden Gründe nicht in die Datenbank schreiben kann:
1. Der häufigste Grund ist, dass das Internet-Gastkonto (IUSR_MACHINE, das standardmäßig zur Gruppe „Jeder“ gehört) keinen Zugriff auf die Datenbankdatei hat (.mdb) Schreibberechtigung. Um dieses Problem zu beheben, passen Sie die Eigenschaften dieser Datei über die Registerkarte „Sicherheit“ im Explorer an, sodass das Internet-Gastkonto über die richtigen Berechtigungen verfügt.
Hinweis: Wenn Sie eine Microsoft Access-Datenbank mit ADO verwenden, müssen Sie dem Internet-Gastkonto auch Schreibberechtigungen für das Verzeichnis erteilen, das die MDB-Datei enthält. Dies liegt daran, dass Jet eine .ldb-Datei erstellt, die die Datenbanksperre übernimmt. Da Jet möglicherweise temporäre Dateien im Verzeichnis „Temp“ erstellt, müssen Sie möglicherweise auch Lese-/Schreibberechtigungen für diesen Ordner erteilen.
2. Der zweite Grund für diesen Fehler ist, dass die Datenbank nicht im richtigen Modus mit Schreibberechtigungen geöffnet wurde. Wenn Sie einen Öffnungsvorgang für ein Verbindungsobjekt ausführen, sollten Sie die Mode-Eigenschaft verwenden, um die Berechtigungen anzugeben, die Sie für die Verbindung haben, wie folgt:
SQL = „UPDATE Products Set UnitPrice = 2;“
Setze Conn = Server.CreateObject("ADODB.Connection")
Conn.Mode = 3 '3 = adModeReadWrite
Conn.Open „myDSN“
Conn.Execute(SQL)
Verbind.Schließen
Hinweis: Standardmäßig ist MODE auf 0 (adModeUnknown) gesetzt, was normalerweise Aktualisierungen zulässt.
3. Ein weiterer Grund für diesen Fehler besteht darin, dass im ODBC-Administrator möglicherweise die Einstellung „Schreibgeschützt“ auf der Seite „Optionen“ des DSN ausgewählt ist.
4. Das letzte Problem und die Problemumgehung gelten für alle SQL-Datenquellen. SQL-Anweisungen, die die referenzielle Integrität der Datenbank verletzen, können zum Auftreten dieses Fehlers führen. Hier sind einige der am häufigsten fehlgeschlagenen Abfragen:
• Die einfachsten Abfragen sind diejenigen, die Sie nicht ändern können: Kreuztabellenabfragen, SQL-Passthrough-Abfragen, Union-Abfragen oder Aktualisierungsoperationsabfragen (d. h. Tabellenerstellungsabfragen), bei denen die UniqueValue-Eigenschaft auf „Ja“ festgelegt ist.
• Ein weiterer sehr häufiger Grund ist, dass der Join Indizes für verknüpfte ODBC-Tabellen enthält, die nicht eindeutig sind. In diesem Fall kann SQL nicht garantieren, dass die Datensätze in der Tabelle eindeutig sind und sich die Werte der Felder in der Tabelle mit der Abfrage ändern.
• Es gibt einen Grund, warum es tatsächlich eine zuverlässige Alternative gibt. Wenn Sie versuchen, ein Join-Feld auf der „Eins“-Seite einer „Eins-zu-Viele“-Abfrage zu aktualisieren, schlägt der Vorgang fehl, es sei denn, Sie aktivieren kaskadierende Aktualisierungen. Denn dann können Sie die referenzielle Integrität an die JET-Engine delegieren.