1. ホーム
  2. データベース
  3. アクセス

アクセスは、レジストリのキーワードエラー処理方法を開くことができません(80004005エラー)。

2022-01-16 02:42:30

エラーメッセージは以下の通りです。
----------------------------------
Microsoft OLE DB Provider for ODBC Drivers エラー '''80004005 '''です。
[Microsoft][ODBC Microsoft Access Driver] 共通エラー レジストリキーワード '''Temporary (volatile) Jet DSN for process 0x728 Thread 0x854 DBC 0x276fb44 Jet''' を開くことができない。
----------------------------------

考えられる原因としては、以下のようなものがあります。
1. マイクロソフトはODBCの更新を停止しており、ACCESSデータベースファイルへのJET接続に切り替える必要があります。
2.システムディレクトリのパーミッションが変更されたこと。
また、古い書き込みによると、ACCESSのデータベースファイルがACCESS97のバージョンであることが原因とのことですが、これは考慮する必要がなく、私はACCESS2000のデータベースを使用しています。

1つ目の理由ですが、元の接続文字列は以下の通りです。
--ODBC接続方法 ------------------------
mdbpath=server.MapPath("my.mdb.asp")です。
CnnStr = "DBQ=" & mdbpath & ";DRIVER={Microsoft Access Driver (*.mdb)};uid=admin;pwd="
-------------------------------------

JET接続に変更した後の接続文字列は
--- JET 接続方法 ----------------------
CnnStr = "Provider=Microsoft.Jet.OLEDB.4.0;User Id=admin;データソース="& mdbpath &" ''';Password=luntanbbs";
-------------------------------------

プロンプトのエラーメッセージは少し違いますが、テストして無効でした:。
----------------------------------
Microsoft JET Database Engine エラー '''80004005 '''です。未指定のエラー
----------------------------------

最後に、2つ目の理由である「システムディレクトリのパーミッションが不十分であること」を確認します。聞いてみると、セキュリティ上の理由から、同僚がサーバーのWINNTディレクトリをAdministrators、system "full control"、users read-onlyに設定したことが判明したのです。
winntsystem32ディレクトリにあるodbcで始まる全てのDLLファイルに"execute"権限を付与したところ、同じエラーメッセージが表示されました。その後、system32ディレクトリ全体を誰でも実行できるように設定しただけですが、テストしてもまだうまくいきません。
ODBCやJETから呼び出されるが、このsystem32ディレクトリになく、失敗するほどの権限を持たないファイルが他にあるのでしょうか?
そんなことを考えながら、ちらっとwinnttempディレクトリを覗いてみました。そうだ、temp ディレクトリを誰でも "書き込み可能" に設定して、何が起こるか見てみよう。

テスト、ねぇ、うまくいった。ODBC接続を使ったプログラムは、ACCESSデータベースのレコードを正常に読み込んで更新している。