- PR -

Datarelationについて

投稿者投稿内容
1co
常連さん
会議室デビュー日: 2005/08/10
投稿数: 39
投稿日時: 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/08/13
投稿数: 1019
投稿日時: 2005-09-29 22:08
こんにちは。

まだ、コードを深く見ていませんが、ひとつ訊きたいことが。
引用:

詳しく説明すると、
dataset1.Tables("tableA").Rows(0).item("col1") = 1
かつ
dataset1.Tables("tableA").Rows(0).item("col2") = "A"
の条件に該当するdataset1.Tables("tableB")の行数は2行のはずなのに、


というのは、もちろん、Server2 と Server3 の tableB のデータを合わせて2行という意味ですよね?
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-09-29 22:24
ん〜?書き間違いかな?
リレーションのはり方がおかしいような…。

リレーションシップの子列の方は本当にそれでよいですか?
tableB の col1 と 何?

それと、l_dstWk がいきなり現れてますけど…?


[ メッセージ編集済み 編集者: 囚人 編集日時 2005-09-29 22:25 ]
1co
常連さん
会議室デビュー日: 2005/08/10
投稿数: 39
投稿日時: 2005-09-30 09:27
ご返信が遅れまして申し訳ありません。

引用:

というのは、もちろん、Server2 と Server3 の tableB のデータを合わせて2行という意味ですよね?


はい、Server2 と Server3 の tableB のデータを合わせて2行という意味です。

引用:

ん〜?書き間違いかな?
リレーションのはり方がおかしいような…。

リレーションシップの子列の方は本当にそれでよいですか?
tableB の col1 と 何?

それと、l_dstWk がいきなり現れてますけど…?


[ メッセージ編集済み 編集者: 囚人 編集日時 2005-09-29 22:25 ]



ごめんなさい、実際のコードと投稿用に書き直したコードが
ごちゃまぜになってしまいました。

正しくは以下です。
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)

原因となる誤りがありましたら、教えてください。
よろしくお願いいたします。
なおこ(・∀・)
大ベテラン
会議室デビュー日: 2004/04/08
投稿数: 174
お住まい・勤務地: 東京都
投稿日時: 2005-09-30 23:37
お世話になります。

引用:

1coさんの書き込み (2005-09-30 09:27) より:

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)



http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemdatadatarelationcollectionclassaddtopic5.asp

うーん、ばらしてみてもダメですか?
コード:

dataset1.Relations.Add("relation1", dataset1.Tables("tableA").Columns("col1"), dataset1.Tables("tableB").Columns("col1"))
dataset1.Relations.Add("relation1", dataset1.Tables("tableA").Columns("col2"), dataset1.Tables("tableB").Columns("col2"))



# 明らかに間違ってたので修正。

[ メッセージ編集済み 編集者: なおこ(・∀・) 編集日時 2005-10-01 00:01 ]
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2005-10-01 00:03
引用:

なおこ(・∀・)さんの書き込み (2005-09-30 23:37) より:
お世話になります。

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemdatadatarelationcollectionclassaddtopic5.asp
↑をみると、
コード:

Dim datacol1() As System.Data.DataColumn = {dataset1.Tables("tableA").Columns("col1"), dataset1.Tables("tableB").Columns("col1")}
Dim datacol2() As System.Data.DataColumn = {dataset1.Tables("tableA").Columns("col2"), dataset1.Tables("tableB").Columns("col2")}



のような気がするんですが…
違ってたらすみません。



その指摘は違います。
Relations.Addの引数は
第1引数がリレーション名
第2引数が親テーブルの該当項目の配列
第3引数が子テーブルの該当項目の配列
となっていますので、スレ主のコードで問題ありません。

追記:
それにしてもRelations.Addに関するMSDNのサンプルコード
百害あって一理無しな感じがする。
だから、サンプルコードを見るとミスリードされても仕方ないかも
しれません。
MSDNのあのページは説明だけを読んだ方が無難かも。


話は変わりますがスレ主さん
引用:


' 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")



で、tableBに2回fillしているようですが、本当に、
引用:

dataset1.Tables("tableA").Rows(0).item("col2") = "A"
の条件に該当するdataset1.Tables("tableB")の行数は2行のはずなのに、


ですか?
今一度、該当条件でdataset1.Tables("tableB")に対するDataViewを作成し、
該当する行数を調べてみませんか?
既に調査済みでしたら申し訳ありません。

[ メッセージ編集済み 編集者: NAL-6295 編集日時 2005-10-01 00:08 ]
なおこ(・∀・)
大ベテラン
会議室デビュー日: 2004/04/08
投稿数: 174
お住まい・勤務地: 東京都
投稿日時: 2005-10-01 00:08
引用:

NAL-6295さんの書き込み (2005-10-01 00:03) より:
引用:

なおこ(・∀・)さんの書き込み (2005-09-30 23:37) より:
お世話になります。

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemdatadatarelationcollectionclassaddtopic5.asp
↑をみると、
コード:
Dim datacol1() As System.Data.DataColumn = {dataset1.Tables("tableA").Columns("col1"), dataset1.Tables("tableB").Columns("col1")} 
Dim datacol2() As System.Data.DataColumn = {dataset1.Tables("tableA").Columns("col2"), dataset1.Tables("tableB").Columns("col2")} 



のような気がするんですが…
違ってたらすみません。



その指摘は違います。


ぐはっ…。すみません、ん?これは間違いだ!と思って
NAL-6295さんの投稿の2分前に修正しました…
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2005-10-01 00:23
引用:

なおこ(・∀・)さんの書き込み (2005-10-01 00:08) より:
ぐはっ…。すみません、ん?これは間違いだ!と思って
NAL-6295さんの投稿の2分前に修正しました…



んー、訂正後の案だと、
リレーションそれぞれについて条件が緩くなるので、むしろ取得される子供の件数が増えてしまうように思います。

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