.NETのSqlConnectionクラスを使用してSQLServerデータベースと通信するクライアントコードがいくつかあります。このエラーで断続的に失敗しています:
「ExecuteReaderには、開いていて利用可能な接続が必要です。接続の現在の状態は閉じています。」
「一時的な」解決策は、プロセスを再起動することです。その後、すべてが機能しますが、それは明らかに不十分です。
コードは、データベースごとに1つずつ、SqlConnectionインスタンスのキャッシュを保持しています。
コードを書き直したいのですが、その前に、いくつかのことを知っておく必要があります。
私の最初の質問は次のとおりです。SqlConnectionオブジェクトを繰り返し接続および切断するのは非効率的ですか、それとも基盤となるライブラリが私たちに代わって接続プールを実行しますか?
// Is this bad/inefficient?
for(many-times)
{
using(SQLConnection conn = new SQLConnection(connectionString))
{
// do stuff with conn
}
}
私たちのコードは上記を行わないため、問題の原因として考えられるのは、接続の「存続期間」中に基盤となるSQLServerデータベースに何かが発生し、接続が閉じられることです。
SqlConnectionオブジェクトを「キャッシュ」する価値があることが判明した場合、データベースに「再接続」するだけで解決できるすべてのエラーを処理するための推奨される方法は何ですか。私は次のようなシナリオについて話している:
- データベースがオフラインになり、オンラインに戻りますが、これが発生している間、クライアントプロセスには開いているトランザクションがありませんでした
- データベースは「切断」され、次に「再接続」されました
SqlConnectionに「State」プロパティがあることに気付きました...それを照会する適切な方法はありますか?
最後に、完全なアクセス権でセットアップされたテストSQLServerインスタンスがあります。「ExecuteReaderには開いた使用可能な接続が必要です。接続の現在の状態は閉じています」という正確なエラーを再現するにはどうすればよいですか。