2007年1月13日土曜日

スキーマの異なるDataTable間でのデータコピー

同じようなレイアウトの帳票を作成する際にぶちあたってしまった問題がこれ。今現在利用している、ReportViewerテクノロジでは帳票定義であるrdl(またはrdlc)ファイルにてデータ取得対象となるDataSetの情報(というかDataSetに限らず取得元の情報)を保持してしまっているので、プレビューなり印刷する際にはフィールド名などが帳票定義で保持している情報と一致していなければならないのよ。

データベースから取得したデータだけが帳票の対象だ、ってならSQL実行時に別名をふってあげれば済む話なんだけど、実際はそうでもなくプログラム的に生成したデータや、別途保存してあるファイルから取得したデータも対象になる場合が多いので、単純に「別名ふって取得すればいいじゃん」とできないのよ。
となると、取得結果がDataSetとして生成された「 」にカラム名を変更するか、という方向を考えたんだけどここもなかなか問題が多い。

面倒なのは取得したDataSetの中で、直接DataTableが保持しているカラム名を書き換える方法。この方法がうまいこといけば一番レスポンス的にはいいんだよね。んじゃあ、何が問題になるかというと、変更後のカラム名が既存のカラム名と重複する場合。この場合は単純に行かなく、重複しているカラムを先に適当な名称に置き換える必要がある。ここから先はまだ試していないけど、DataColumnクラスでは元々の取得元情報であるTableプロパティもあるのでそことの関連がちょっと不明。ここも書き換えるのか、そもそもTableプロパティで参照できる取得元情報自体を消してしまえばいいのか。

このあたりが全然解決というか調査しきれていなかったので、今現在はカラム名を変更するのではなく、新しいDataTableを生成してそっちにデータコピーして返却するようにしているんだけど、このデータコピーが・・・素直に書くと速度的にキツイ。
スキーマが同じならImportRowメソッドやらDataTableのCopyやら手段はあるんだけど・・・。

なんかうまいこと行く方法を見つけておかないと、あとあと大量データでカラム名の変更なんてやろうとした日には確実に泣けるなぁ・・・。

0 件のコメント:

コメントを投稿