- PR -

型指定されたDataSetで複数テーブルの操作

投稿者投稿内容
リミット
会議室デビュー日: 2004/02/04
投稿数: 17
投稿日時: 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を投げるといった形になるのでしょうか?

以上、宜しく御願い致します。
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2007-01-11 20:10
NAL-6295です。

私の場合ですが

何かの仕様を実現したくてJOINする必要があるときは、
そのJOINの意味を示したビューを作成して、そのVIEWの
型付DataSetを作成します。
そうすることで、仕様をより見えやすい場所に置いておく
事ができますので。

直接的な回答でなくて申し訳ありません。
ベテラン
会議室デビュー日: 2005/05/16
投稿数: 85
お住まい・勤務地: 千葉県在住
投稿日時: 2007-01-11 20:41
リミットさん、こんばんは。

1つのDataSetの中に2つのDataTableがあるんですよね?
でしたら、JOINをせずに親のTable、子のTableの2つに対してSELECTする
ストアドプロシージャを作成すれば良いと思います。

コード:

CREATE PROCEDURE dbo.P_SELECT_PARENT_AND_CHILD
AS
SELECT * FROM PARENT_TABLE
SELECT * FROM CHILD_TABLE
return




[ メッセージ編集済み 編集者: 梶 編集日時 2007-01-11 20:41 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-01-11 22:30
複数の問い合わせを、1回の SQL で投げることが出来ますか?
_________________
Ahf
大ベテラン
会議室デビュー日: 2006/08/16
投稿数: 172
投稿日時: 2007-01-12 00:59
リレーションが絡んでくると1回のSQL実行で全てのデータを取得、という
理想的な処理は汎用的なコンポーネントであるほど難しいと思います。

複数の結果セットを1度の実行で取得、というのは不可能ではないですので
そこまでするくらいなら自前でデータクラス的な物を構築する方が早いと
思います。発生するリレーションのパターンが1:nに限定されるとかでしたら
十分に実装できる範疇だと思いますよ。

個人的には今回のケースですと、NAL-6295さんの言われている更新可能なビュー
を定義するのが最も楽な対処かと考えます。
リミット
会議室デビュー日: 2004/02/04
投稿数: 17
投稿日時: 2007-01-12 10:01
皆様、レス有難う御座います。

NAL-6295さんの言われている方法は私も思いつきました。
確かに仕様がより分かりやすくなると思いますが、今回ではDBの
テーブルのイメージをそのまま維持したいのです。

梶さんの言われているストアドの使用は有効的ですね。少し検討
してみたいと思います。

Ahfさんの言われていること、たしかにそうだと思います。
更新可能なビューを作成するのが最も良い方法でしょうね。



もうひとつの質問についてもお伺いしても宜しいでしょうか?
> また、更新等のトランザクション管理は一つ目のSQLが成功したことを確認して、
> 次のSQLを投げるといった形になるのでしょうか?

1つ目のSQLの更新結果を取得して、それをif文か何かで評価した後で、
2つ目の更新SQLを投げる形になるのでしょうか?

以上、宜しく御願い致します。
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2007-01-12 10:58
NAL-6295です。

通常、
IDbConnectionを実装したクラスでBeginTransactionをしてIDbTransactionを保持し、
最後までうまくいったら、IDbTransaction.Commit
例外が発行されたら、IDbTransaction.Rollback
最後にFinallyで後始末
となります。
リミット
会議室デビュー日: 2004/02/04
投稿数: 17
投稿日時: 2007-01-15 18:03
NAL-6295さん、再びレス有難う御座います。
返事が送れたこと、誠に申し訳御座いません。

そうですかぁ、型指定有の場合でもIDbTransaction
を使用して、トランザクション管理をするのですね。

それを踏まえたうえで、色々検討してみたいと思います。

スキルアップ/キャリアアップ(JOB@IT)