4

複数の関数とクラスで多くの SQL 呼び出しを行う C# アプリケーションがあります。データベースは SQL Server 2008 R2 です。現在、各クラスまたは関数は、データベースへのデータの読み取り/書き込みが必要になるたびに、独自の SQL 接続を開きます。

using (SqlConnection connection = new SqlConnection(connectionString))

これは接続管理を処理する正しい方法ですか? また、トランザクションを追加し始めたばかりなので、間違っていなければ、同じ接続でトランザクションを完了する必要があります。コードの例を次に示します。

try
{
   Class1 class1 = new Class1();
   class1.data = "somedata";
   class1.save(); // new sql connnection

   Class2 class2 = new Class2();
   class2.data = GetSomeData(); // new sql connection
   class2.save(); // new sql connection
}

catch (Exception e)
{
}

TransactionScope と SqlTransaction を見てきましたが、現在の接続構造がこの実装に最適かどうかはわかりません。ガイダンスをいただければ幸いです。

4

4 に答える 4

2

トランザクションを開始する using 句内に両方の保存呼び出しを囲むことができます。

システムが接続を開始したいときはいつでも、親トランザクションがあれば検査します。

http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspxでサンプルを確認してください

于 2013-05-20T13:46:53.757 に答える
0

はい、usingオブジェクトと SQL サーバーの間でデータの実際のマーシャリングを実行する同じコード ブロック内に句を含めるのが正しい方法です。その理由は単純に、エラーが発生した場合に、他の非常に困難な問題を特定する原因となる可能性のある接続がリークしていないためです。

問題は、save個々のクラスごとに呼び出しを行うべきか、それともデータ アクセス プロバイダーのようなものを使用してデータベース サーバーとの通信を処理するべきかということです。

エンティティ B がエンティティ A に依存している場合、つまり A を保存し、B が適切に保存する前に ID を返さなければならない場合、選択肢があります。A が B への参照を持ち、その保存を処理する必要があるか、適切な保存を処理するデータ アクセス クラスに両方のオブジェクトを渡す必要があります。ここでの例は、エンティティ A が注文ヘッダーであり、B が品目である場合です。この状況では、A は B のコレクションへの参照を持つ必要があります。A.Save()が呼び出されると、そのコレクションを反復してB.Save()自分自身を呼び出す必要があります。

どちらの方法でも、単一の接続のコンテキスト内でトランザクションを実装するのはかなり簡単になります。

于 2013-05-20T13:56:15.347 に答える