- - PR -
Datasetの抽出時、子テーブルも同時に抽出させたい。
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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 ] | ||||||||
|
投稿日時: 2007-11-08 21:02
簡単かどうかは分かりません。
まずスキーマでリレーション(System.Data.DataRelation)を作成する。 # これはできてる? 次いで、親テーブルから行(DataRow)を取得する。 DataRow.GetChildRows(DataRelation)で関連先の行を取得する。 すべてのリレーションはDataSetが保持しているので、
とすれば、OKかな? 未確認なので、実際にうまくいくかどうかは分かりません。 | ||||||||
|
投稿日時: 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 ] | ||||||||
|
投稿日時: 2007-11-12 16:42
すみません。3階層までのXMLデータには上記のコードで対応できたのですが、それ以上、4階層とか5階層まで無限にある場合の実装方法がわかりません。
何度も考えているのですが、はまってしまって・・・。 もしわかる方、いらっしゃったら教えてください。 | ||||||||
|
投稿日時: 2007-11-12 17:20
まずは、再帰構文について勉強してください。 再帰構文が理解できれば、
を再帰的に処理してくだけで、実現できると思います。 | ||||||||
|
投稿日時: 2007-11-12 20:29
かずくんさん
ありがとうございました。 再帰させればいいんですね。 再帰の概念がよくわかっていませんでした。 勉強させていただきありがとうございます。 おかげで処理を完成させることができました。 |
1