2006年07月03日

ADO.NET2.0のDataSet の Modifier プロパティ

  
ADO.NET2.0 の DataSet には、Modifier プロパティというものがあり、ここを public にすると Connection プロパティが、internal から public に変更できる。
こうすれば、TableAdapter の Connection を自分で設定することが可能だ。

SqlConnection conn = new SqlConnection(...);
MyTableAdapter.Connection = conn;

なぜ、こんなことが必要なのか。
それは、TransaciotnScope でトランザクション処理をするときに必要になる。
分散トランザクションに昇格しても良いのならば、わざわざ Connectionを自分でnew する必要もないのだが、単一のデータベースに対しては、やはり、分散トランザクションを避けたい。
これを避けるには、TransaciotnScope 内のコネクションを一つに限定すればOKだ。
この際に、上記 Modifier プロパティを public にすると良い。
そうすれば、以下のようなコードが書ける。

using ( TransactionScope tx = new TransactionScope() )
using ( SqlConnection conn = new SqlConnection(...) ) {
myTableAdapter1.Connection = conn;
myTableAdapter2.Connection = conn;
... // ここで、TableAdapter を使ったUpdate処理
tx.Complete();
}

ただ、Toyプログラムならばこれで十分なのだけれど、トランザクション処理と、テーブル操作の処理をきれいに分割しようとすると、ちょっと困ってしまう。

using (TransactionScope tx = new TransactionScope()) {
SqlConnection conn = new SqlConnection(...);
MyWork1(); // この中で、TableAdapter を使ったUpdate処理
MyWork2(); // この中で、TableAdapter を使ったUpdate処理
tx.Complete();
}

MyWork1(conn) のように、SqlConnection インスタンスを引数で渡し、MyWork1() のなかで、コネクションをTableAdapterにセットするという手もあるが、どうも、コネクションを引数で受け渡すのは、好みじゃない。

partial クラスを利用し、Modifier プロパティをinternalのまま対応する方法もあるが、結局、Connectionオブジェクトを引き渡すのは同じこと。

マルチスレッド環境を考えなければ、シングルトンを使って、Connectionオブジェクトを操作することもできるけれど、後からマルチスレッドに対応しようとすると苦労することになる。

みんなは、どうしているんだろう。


この記事へのコメント
私(たち)は、
引数で受け渡す実装にしています。
ThreadLocalStorageとの比較検討したのですが、
これでは要件が満たせなかったので・・・。
Posted by PANTO at 2006年07月26日 21:11
コメントありがとうございます。
ThreadLocalStorageって、LocalDataStoreSlot のことでしょうか。これはやったことがありませんでした。
僕の場合、結局、SqlConnection のインスタンスを直接引数に渡すのではなく、SqlConnection の Open ,Close を一元管理するクラスを作って、そのインスタンスを渡すことで対応しました。
Posted by Gushwell at 2006年07月27日 17:59
 

この記事へのトラックバックURL

この記事へのトラックバック
http://blog.livedoor.jp/gushwell/archives/50516891.html using ( TransactionScope tx = new TransactionScope() ) using ( SqlConnection conn = new SqlConnection(...) ) { myTableAdapter1.Connection = conn; myTableAdapter2.Connection = conn; ... // ここ...
♥ ADO.net2.0【marukuma.com:主婦の楽しみ-まるくまママのPC生活】at 2008年02月19日 19:33