ASP.NET プロジェクトがあります。DB に接続してから、接続オブジェクトを閉じて破棄しています。しかし、だれかが私のサイトにアクセスすると、MS Access は一時的な dbname.ldb を作成します。サーバーからオリジナルの mdb ファイルをダウンロードしたいのですが、mdb ファイルにアクセスできません。サーバーにldbファイルがあると何もできません。mdb ファイルがロックされており、移動できません。だから問題は何ですか?接続を開いて閉じています。では、接続が閉じられた後にこのldbファイルが削除されないのはなぜですか。
6 に答える
IIS 内の Web アプリケーションは、接続プールを使用して接続を開いたままにしています。IIS が Web アプリケーションを終了するように設定されている時間内にそれ以上の接続がない場合、IIS アプリケーションは最終的に閉じます。または、アプリケーションを再起動することができます (そして、誰かが侵入する前にファイルをコピーします)。
これは、Access がこの種のアプリケーションのデータベースとして適していない理由の 1 つにすぎません。
接続を閉じる前にスクリプトが何らかのエラーを生成した場合、接続を開いたままにすることができます。テキスト ファイルにエラーを記録するカスタマイズされたエラー 500 ページでスクリプトを確認すると、これが該当するかどうかがわかります。とにかく、ldb ファイルは危険ではないので、スクリプトを作成して 1 日に 1 回ほど削除できます。これは、MS Access で Web アプリケーションを操作する際の欠点の 1 つです。可能であれば MSSQL に移行するか、MySQL に移行してみてください。これは、.NET または従来の ASP から、適切なドライバーを使用して ADO または ADO.NET で問題なく使用できます。
また、接続プーリングを検討することもできます-接続を閉じると、再利用できる場合に備えて、実際に接続を閉じる前に、c# は実際にはしばらくの間 (30 秒? 60 秒?) 開いたままにします。これは問題になる可能性があります。
このファイルは、 Access データベース.ldb
のロック ファイルです。.mdb
データベースを開くたびに、Jet エンジンはロック ファイルを作成し、誰かが接続している限り開いたままにします。データベースに接続している他のクライアントがなくなると、Jet はロック ファイルを削除します。
したがって、次の 2 つの理由のいずれかでロック ファイルが表示されます。
- 開いている接続があります。
- 接続が切断されており、ロック ファイルを削除できませんでした。
サーバーのエラー ログを確認しても何も得られない場合は、アプリケーション内からのすべてのデータベース アクセスをファイルに記録してみてください。時間、接続、およびその他の有用なデバッグ情報に関する情報を追加します。
これは、問題をすばやくデバッグし、接続がいつどこで開いたままになっているのかを確認する簡単な方法です。
または、この CodeProject の記事を参照することもできます: ASP.NET Web アプリケーションで "リークされた" データベース接続を検索する。
.ldb ファイルを削除するハックな回避策の 1 つは、次の手順を実行することです。
- Access データベースのコピーを作成する
- 元のアクセス データベースを削除する
- .ldb ファイルを削除します
- アクセス データベースのコピーの名前を元のデータベースの名前に変更します。