データベース呼び出しを行うために利用する Linq-to-SQL DataClasses オブジェクトがあります。私はそれを次のようにラップしました:
public class DataWrapper {
private DataClassesDataContext _connection = null;
private static DataWrapper _instance = null;
private const string PROD_CONN_STR = "Data Source=proddb;Initial Catalog=AppName;User ID=sa;Password=pass; MultipleActiveResultSets=true;Asynchronous Processing=True";
public static DataClassesDataContext Connection {
get {
if (Instance._connection == null)
Instance._connection = new DataClassesDataContext(DEV_CONN_STR);
return Instance._connection;
}
}
private static DataWrapper Instance {
get {
if (_instance == null) {
_instance = new DataWrapper();
}
return _instance;
}
}
}
このラッパーを使用して、次のようにストアド プロシージャ呼び出しを行うスレッドがいくつかあります。
DataWrapper.Connection.Remove_Message(completeMessage.ID);
ごくまれに、DataClasses オブジェクトが例外をスローします。
ExecuteNonQuery には、オープンで使用可能な接続が必要です。接続の現在の状態は閉じています。
私は接続の状態をまったく管理していません-Linq-to-SQLがこれを処理する必要があると考えました。電話をかけるたびに接続の接続状態を確認し、閉じている場合は開くことができましたが、それはハックのようです。
SQL が接続を強制的に閉じる可能性を処理するために、接続文字列にMultipleActiveResultSets=true
andを付けてみましたが、それは役に立たなかったようです。Asynchronous Processing=True
何か案は?