- - PR -
型指定されたDataSetで複数テーブルの操作
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2007-01-11 15:44
型指定されたDataSetについて質問させて下さい。
親子関係の2つのテーブルを2つのDataTableとして作成し、それら2つに対して リレーションを張ったDataSetを作るとします。 そこで「SELECT * FROM A LEFT OUTER JOIN B ON...」のような実行結果を取得 したい場合、 DataSetTest dtSet = new DataSetTest(); ParestTableAdapter parentAdap = new ParestTableAdapter(); ChildTableAdapter childAdap = new ChildTableAdapter(); parentAdap.Fill(DataSetTest.Parent); // ←SQL1回目 childAdap.Fill(DataSetTest.Child); // ←SQL2回目 DataRow dr = _dtSet.Parent.Rows[0]; DataRow[] drs; drs = dr.GetChildRows("Parent_Child_Relation"); というソースを書くとします。 これは親テーブルと子テーブルに対して2回SQLを投げていることになると思います。 これを1回のSQLで取得する方法はありますでしょうか? また、更新等のトランザクション管理は一つ目のSQLが成功したことを確認して、 次のSQLを投げるといった形になるのでしょうか? 以上、宜しく御願い致します。 | ||||
|
投稿日時: 2007-01-11 20:10
NAL-6295です。
私の場合ですが 何かの仕様を実現したくてJOINする必要があるときは、 そのJOINの意味を示したビューを作成して、そのVIEWの 型付DataSetを作成します。 そうすることで、仕様をより見えやすい場所に置いておく 事ができますので。 直接的な回答でなくて申し訳ありません。 | ||||
|
投稿日時: 2007-01-11 20:41
リミットさん、こんばんは。
1つのDataSetの中に2つのDataTableがあるんですよね? でしたら、JOINをせずに親のTable、子のTableの2つに対してSELECTする ストアドプロシージャを作成すれば良いと思います。
[ メッセージ編集済み 編集者: 梶 編集日時 2007-01-11 20:41 ] | ||||
|
投稿日時: 2007-01-11 22:30
複数の問い合わせを、1回の SQL で投げることが出来ますか?
_________________ | ||||
|
投稿日時: 2007-01-12 00:59
リレーションが絡んでくると1回のSQL実行で全てのデータを取得、という
理想的な処理は汎用的なコンポーネントであるほど難しいと思います。 複数の結果セットを1度の実行で取得、というのは不可能ではないですので そこまでするくらいなら自前でデータクラス的な物を構築する方が早いと 思います。発生するリレーションのパターンが1:nに限定されるとかでしたら 十分に実装できる範疇だと思いますよ。 個人的には今回のケースですと、NAL-6295さんの言われている更新可能なビュー を定義するのが最も楽な対処かと考えます。 | ||||
|
投稿日時: 2007-01-12 10:01
皆様、レス有難う御座います。
NAL-6295さんの言われている方法は私も思いつきました。 確かに仕様がより分かりやすくなると思いますが、今回ではDBの テーブルのイメージをそのまま維持したいのです。 梶さんの言われているストアドの使用は有効的ですね。少し検討 してみたいと思います。 Ahfさんの言われていること、たしかにそうだと思います。 更新可能なビューを作成するのが最も良い方法でしょうね。 もうひとつの質問についてもお伺いしても宜しいでしょうか? > また、更新等のトランザクション管理は一つ目のSQLが成功したことを確認して、 > 次のSQLを投げるといった形になるのでしょうか? 1つ目のSQLの更新結果を取得して、それをif文か何かで評価した後で、 2つ目の更新SQLを投げる形になるのでしょうか? 以上、宜しく御願い致します。 | ||||
|
投稿日時: 2007-01-12 10:58
NAL-6295です。
通常、 IDbConnectionを実装したクラスでBeginTransactionをしてIDbTransactionを保持し、 最後までうまくいったら、IDbTransaction.Commit 例外が発行されたら、IDbTransaction.Rollback 最後にFinallyで後始末 となります。 | ||||
|
投稿日時: 2007-01-15 18:03
NAL-6295さん、再びレス有難う御座います。
返事が送れたこと、誠に申し訳御座いません。 そうですかぁ、型指定有の場合でもIDbTransaction を使用して、トランザクション管理をするのですね。 それを踏まえたうえで、色々検討してみたいと思います。 |