- - PR -
Datarelationについて
投稿者 | 投稿内容 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-09-29 21:49
こんばんは。いつもお世話になっております。
別々のDBサーバにある3テーブルを結合し、結果を出力したいと思います。 Server1 tableA Server2 tableB Server3 tableB ※Server2.tableBとServer3.tableBはまったく同じテーブル(スキーマ)です。 DBサーバが別なため、それぞれデータを抽出し、Datasetに格納後、DatarelationをAddして親子関係をつくります。 ' Server1-tableA dataadapter.selectcommand.commandtext = "select col1,col2,col3 from tableA" dataadapter.fill(dataset1,"tableA") ' Server2-tableB dataadapter.selectcommand.commandtext = "select col1,col2,col4 from tableB" dataadapter.fill(dataset1,"tableB") ' Server3-tableB dataadapter.selectcommand.commandtext = "select col1,col2,col4 from tableB" dataadapter.fill(dataset1,"tableB") Dim datacol1() As System.Data.DataColumn = {dataset1.Tables("tableA").Columns("col1"), dataset1.Tables("tableA").Columns("col2")} Dim datacol2() As System.Data.DataColumn = {dataset1.Tables("tableB").Columns("col1"), dataset1.Tables("tableA").Columns("colB")} l_dstWk.Relations.Add("relation1", datacol1, datacol2) この後、dataset1.Tables("tableA").Rows(0).GetChildRows("relation1").Lengthを取ると、 実際のtableBの行数の2倍の数値が返ってきます。 詳しく説明すると、 dataset1.Tables("tableA").Rows(0).item("col1") = 1 かつ dataset1.Tables("tableA").Rows(0).item("col2") = "A" の条件に該当するdataset1.Tables("tableB")の行数は2行のはずなのに、 dataset1.Tables("tableA").Rows(0).GetChildRows("relation1").Lengthの結果は4行となってしまいます。 環境はVB.net + DB2です。 情報が不足しておりましたら、追記いたしますのでご指摘ください。 どなたか原因がおわかりの方がいらっしゃいましたら、お教えください。 よろしくお願いいたします。 | ||||||||||||||||
|
投稿日時: 2005-09-29 22:08
こんにちは。
まだ、コードを深く見ていませんが、ひとつ訊きたいことが。
というのは、もちろん、Server2 と Server3 の tableB のデータを合わせて2行という意味ですよね? | ||||||||||||||||
|
投稿日時: 2005-09-29 22:24
ん〜?書き間違いかな?
リレーションのはり方がおかしいような…。 リレーションシップの子列の方は本当にそれでよいですか? tableB の col1 と 何? それと、l_dstWk がいきなり現れてますけど…? [ メッセージ編集済み 編集者: 囚人 編集日時 2005-09-29 22:25 ] | ||||||||||||||||
|
投稿日時: 2005-09-30 09:27
ご返信が遅れまして申し訳ありません。
はい、Server2 と Server3 の tableB のデータを合わせて2行という意味です。
ごめんなさい、実際のコードと投稿用に書き直したコードが ごちゃまぜになってしまいました。 正しくは以下です。 Dim datacol1() As System.Data.DataColumn = {dataset1.Tables("tableA").Columns("col1"), dataset1.Tables("tableA").Columns("col2")} Dim datacol2() As System.Data.DataColumn = {dataset1.Tables("tableB").Columns("col1"), dataset1.Tables("tableB").Columns("col2")} dataset1.Relations.Add("relation1", datacol1, datacol2) 原因となる誤りがありましたら、教えてください。 よろしくお願いいたします。 | ||||||||||||||||
|
投稿日時: 2005-09-30 23:37
お世話になります。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemdatadatarelationcollectionclassaddtopic5.asp うーん、ばらしてみてもダメですか?
# 明らかに間違ってたので修正。 [ メッセージ編集済み 編集者: なおこ(・∀・) 編集日時 2005-10-01 00:01 ] | ||||||||||||||||
|
投稿日時: 2005-10-01 00:03
その指摘は違います。 Relations.Addの引数は 第1引数がリレーション名 第2引数が親テーブルの該当項目の配列 第3引数が子テーブルの該当項目の配列 となっていますので、スレ主のコードで問題ありません。 追記: それにしてもRelations.Addに関するMSDNのサンプルコード 百害あって一理無しな感じがする。 だから、サンプルコードを見るとミスリードされても仕方ないかも しれません。 MSDNのあのページは説明だけを読んだ方が無難かも。 話は変わりますがスレ主さん
で、tableBに2回fillしているようですが、本当に、
ですか? 今一度、該当条件でdataset1.Tables("tableB")に対するDataViewを作成し、 該当する行数を調べてみませんか? 既に調査済みでしたら申し訳ありません。 [ メッセージ編集済み 編集者: NAL-6295 編集日時 2005-10-01 00:08 ] | ||||||||||||||||
|
投稿日時: 2005-10-01 00:08
ぐはっ…。すみません、ん?これは間違いだ!と思って NAL-6295さんの投稿の2分前に修正しました… | ||||||||||||||||
|
投稿日時: 2005-10-01 00:23
んー、訂正後の案だと、 リレーションそれぞれについて条件が緩くなるので、むしろ取得される子供の件数が増えてしまうように思います。 |