- PR -

Datasetの抽出時、子テーブルも同時に抽出させたい。

1
投稿者投稿内容
mikki
会議室デビュー日: 2005/01/20
投稿数: 6
投稿日時: 2007-11-08 16:24
C#2005 Framework2.0dで開発中です。

多階層のXMLをDataSetにReadXmlで読み込むと1つのDataSetにいくつかのTableができ、それぞれリレーションが張られると思います。

その中から、Table[0]の最初のカラム、IDを指定して、リレーションされている子テーブルの行も持った、1件だけのDataSetを作成したいと思っています。

複製後のDataSetは元のDataSetと同じ構成にしたいです。
XMLですので、元のDataSetの構成はファイルにより変わりますので、テーブル数も可変です。

どのように実装すればいいのでしょうか。
Table[0]にデータをコピーすることはできたのですが、子テーブルを持ってくる簡単な方法はありませんか?

よろしくお願いします。

[ メッセージ編集済み 編集者: mikki 編集日時 2007-11-08 16:24 ]
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2007-11-08 21:02
簡単かどうかは分かりません。

まずスキーマでリレーション(System.Data.DataRelation)を作成する。
# これはできてる?

次いで、親テーブルから行(DataRow)を取得する。
DataRow.GetChildRows(DataRelation)で関連先の行を取得する。

すべてのリレーションはDataSetが保持しているので、
コード:
DataRow row = ....; // 親テーブルから行取得
foreach (DataRelation relation in dataset.Relations) {
    DataRow[] rows = row.GetChildRows(relations);
    ....
}


とすれば、OKかな?

未確認なので、実際にうまくいくかどうかは分かりません。
mikki
会議室デビュー日: 2005/01/20
投稿数: 6
投稿日時: 2007-11-09 11:08
かずくんさん、ありがとうございます。

DataRowオブジェクトを新しく生成したテーブルにコピーして、そのリレーションを使おうとしていました。

下記のコードでできました。

//スキーマをコピー
DataSet CopyDataSet = AuthorsDataSet.Clone();
//指定したメタデータIDとリストのメタデータのIDが一致したものを抽出
DataRow[] drTemps = AuthorsDataSet.Tables[0].Select("id = '0001'");

foreach (DataRow drTemp in drTemps)
{
int idxRel = 0;
//CopyDataSetのTable[0]にIDで抽出したものを1recごとコピー
CopyDataSet.Tables[idxRel].ImportRow(drTemp);
foreach (DataRelation relation in AuthorsDataSet.Tables[0].ChildRelations)
{
idxRel++;//リレーションが変わると入れるテーブルが変わる
DataRow[] drChildRows = drTemp.GetChildRows(relation);
foreach (DataRow drChildRow in drChildRows)
{
//CopyDataSetのTableにChildRowsをコピー
CopyDataSet.Tables[idxRel].ImportRow(drChildRow);
}
}
}

[ メッセージ編集済み 編集者: mikki 編集日時 2007-11-09 11:09 ]
mikki
会議室デビュー日: 2005/01/20
投稿数: 6
投稿日時: 2007-11-12 16:42
すみません。3階層までのXMLデータには上記のコードで対応できたのですが、それ以上、4階層とか5階層まで無限にある場合の実装方法がわかりません。

何度も考えているのですが、はまってしまって・・・。

もしわかる方、いらっしゃったら教えてください。
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2007-11-12 17:20
引用:

mikkiさんの書き込み (2007-11-12 16:42) より:
すみません。3階層までのXMLデータには上記のコードで対応できたのですが、それ以上、4階層とか5階層まで無限にある場合の実装方法がわかりません。

何度も考えているのですが、はまってしまって・・・。

もしわかる方、いらっしゃったら教えてください。



まずは、再帰構文について勉強してください。
再帰構文が理解できれば、
コード:
	{
		idxRel++;//リレーションが変わると入れるテーブルが変わる
		DataRow[] drChildRows = drTemp.GetChildRows(relation);
		foreach (DataRow drChildRow in drChildRows)
		{
			//CopyDataSetのTableにChildRowsをコピー
			CopyDataSet.Tables[idxRel].ImportRow(drChildRow);
		}
	}


を再帰的に処理してくだけで、実現できると思います。
mikki
会議室デビュー日: 2005/01/20
投稿数: 6
投稿日時: 2007-11-12 20:29
かずくんさん

ありがとうございました。
再帰させればいいんですね。

再帰の概念がよくわかっていませんでした。
勉強させていただきありがとうございます。
おかげで処理を完成させることができました。
1

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