症状 ActiveX データ オブジェクト (ADO) を Active Server Pages (ASP) とともに使用すると、次の一般的なエラーが発生することがあります。
Microsoft OLE DB Provider for ODBC Drivers エラー「80004005」
[Microsoft][ODBC Microsoft Access 97 Driver] 操作では更新可能なクエリを使用する必要があります。
原因 この記事では、このエラーの 4 つの主な原因と対応する回避策について説明します。この記事では Microsoft Access データベースについて説明しますが、ここで提供される情報は他の種類のデータベースにも当てはまります。
解決策 通常、このエラーは、スクリプトが更新を実行したり、データベース内の情報を変更するその他のアクションを実行しようとしたときに発生します。このエラーは、次のいずれかの理由で ADO がデータベースに書き込めないために発生します。
1. 最も一般的な理由は、インターネット ゲスト アカウント (IUSR_MACHINE、デフォルトでは「Everyone」グループに属します) がデータベース ファイルにアクセスできないことです。 (.mdb) 書き込み権限。この問題を解決するには、エクスプローラーの [セキュリティ] タブを使用してこのファイルのプロパティを調整し、インターネット ゲスト アカウントに正しいアクセス許可が与えられるようにします。
注: ADO で Microsoft Access データベースを使用する場合は、.mdb ファイルを含むディレクトリへの書き込みアクセス許可をインターネット ゲスト アカウントに付与する必要もあります。これは、Jet がデータベースのロックを処理する .ldb ファイルを作成するためです。 Jet は「Temp」ディレクトリに一時ファイルを作成する場合があるため、そのフォルダーに読み取り/書き込みアクセス許可を付与する必要がある場合もあります。
2. このエラーの 2 番目の理由は、データベースが書き込み権限を持つ正しいモードで開かれていないことです。 Connection オブジェクトに対して Open 操作を実行する場合は、次のように、Mode プロパティを使用して、接続に対して持っているアクセス許可を示す必要があります。
SQL = "UPDATE 製品セット UnitPrice = 2;"
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Mode = 3 '3 = adModeReadWrite
「myDSN」を開く
接続実行(SQL)
接続を閉じる
注: デフォルトでは、MODE は 0 (adModeUnknown) に設定されており、通常は更新が許可されます。
3. このエラーのもう 1 つの理由は、ODBC アドミニストレータで、DSN の [オプション] ページの [読み取り専用] 設定が選択されている可能性があることです。
4. 最後の問題と回避策は、すべての SQL データ ソースに適用されます。データベースの参照整合性に違反する SQL ステートメントにより、このエラーが発生する可能性があります。失敗する最も一般的なクエリの一部を次に示します。
• 最も単純なクエリのセットは、変更できないものです。クロス集計クエリ、SQL パススルー クエリ、ユニオン クエリ、UniqueValue プロパティが Yes に設定されている更新 (つまり、テーブルの作成) 操作クエリです。
• もう 1 つの非常に一般的な理由は、結合に一意ではないリンクされた ODBC テーブルのインデックスが含まれていることです。この場合、SQL はテーブル内のレコードが一意であることを保証できず、テーブル内のフィールドの値がクエリによって変化します。
• 信頼できる代替手段が実際に存在するのには理由があります。 「1 対多」クエリの「1」側の結合フィールドを更新しようとすると、カスケード更新を有効にしない限り、操作は失敗します。そうすれば、参照整合性を JET エンジンに委任できるからです。