- PR -

外部結合させて取り込んだdatasetをDBにUpdateする方法

投稿者投稿内容
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-03-08 21:30
引用:

ポートスさんの書き込み(2006-03-08 01:38)より:

>Jittaさん
>「外部結合」って、“どこで”やってます?ちゃんとデータベース側でやってますか?
 VBのコード中に、メソッド(Private Function)として外部結合してSELECTさせるSQLを記述しています。
 そのSQL文を文字列として、
dataAda.SelectCommand = New OracleCommand(CreateSQL, cnn)
の CreateSQL に格納させています。
 「DB側で」とおっしゃる意味がよく分からないのですが、以上の解答で構いませんでしょうか。


 すみません、私が間違ってていました。外部「結合」ですね。外部「参照」(リレーション、外部キー)と間違っていました。

引用:

>2つのテーブルを DataSet に取り込まないといけませんよ。
 ということは、TBLHEAD と TBLBODY の2つを、別々の DataSet に取り込まないといけないのでしょうか?


そういうことです。その上で、DataSet 内で外部参照(リレーションシップ、関連)を張り、親テーブルから削除すると、子テーブルも削除されます。

 流れとしては、このようになります。

DataSet 作成
親テーブル取得※
子テーブル取得※
リレーション作成
親テーブルから削除
子テーブル更新※
親テーブル更新※

“※”でマークしたところが、データベースとの交信です。

 ここで、TBL_HEAD と TBL_BODY にリレーションシップが張られており、変更制約が CASCADE になっているなら、次のようになります。

結合したテーブル取得※
TBL_HEAD から削除する DeleteCommand 作成
テーブルから削除
テーブル更新※


これを、OracleDbCommand を使うようにするなら、プライマリキーがわかっているという前提で、次のようになります。

*リレーションシップがない場合
*または、リレーションシップがあって、CASCADE でない場合
子テーブルから削除※
親テーブルから削除※

*リレーションシップがあり、CASCADE の場合
親テーブルから削除※


 リレーションシップを張って、CASCADE にすると楽に見えます。しかし、いつもこうするのがいいとは限りません。
 例えば、取引表と社員マスタがあります。取引表には担当者を示す、社員マスタへの参照があります。このとき、このリレーションを CASCADE にしてはいけません。社員が退職するからマスタから削除すると、取引の記録も消えてしまうからです。

〆 written by Jitta@わんくま同盟 on 2006/03/08
□ Microsoft MVP for Visual Developer ASP/ASP.NET October, 2005 - September, 2006

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