- PR -

DataTableで先頭にカラムを追加したい

投稿者投稿内容
そうまさん
常連さん
会議室デビュー日: 2003/07/17
投稿数: 27
お住まい・勤務地: ジャポン
投稿日時: 2005-08-06 19:37
こんにちは。いつもお世話になっております。

もしご存知の方がいましたらご教授ください。

DBサーバからすでにDataTableにデータが
取り込まれている状態のものがあります。

このDataTableの先頭フィールドにカラムを追加したいのですが、
どのようにしたらいいのでしょうか?

dt.Columns.Add(***); だと最後尾に追加されてしまいます。

簡単ではありますが何かヒントとなるようなことでも
知っている方がいましたら、よろしくお願いします。

VS.NET 2003 C#, WinXP Proにて開発を行っています。
trapemiya
大ベテラン
会議室デビュー日: 2005/07/30
投稿数: 102
投稿日時: 2005-08-07 00:28
引用:

このDataTableの先頭フィールドにカラムを追加したいのですが、
どのようにしたらいいのでしょうか?


なんか無さそうな感じですね。
代替案として、
1.データベースから抜いてくるときにダミーで先頭カラムを作成しておく。
  (あらかじめ、ダミーのカラム数がわかっている必要があります。)
2.先頭にカラムを追加した新しいデータテーブルを作成し、そこにデータを持っていく。

でも、そもそも、どうして先頭に追加しなければならないんでしょうか?
ほげた
ベテラン
会議室デビュー日: 2002/05/08
投稿数: 67
お住まい・勤務地: なごやん
投稿日時: 2005-08-07 06:31
DataTableではできませんが
trapemiyaさんの指摘のように、やりたいことの本質は、
DataTableの先頭にカラムを追加することとは違うんじゃないでしょうか。

表示順序を制御したいなら、Gridなどの表示コントロール側でやればいいですし。
#表示が単一の場合、データが表示と同じ順序になっていれば簡単ではあるけど・・・

本当の目的も書いておくと、もっと違ういい方法が教えてもらえるかもしれませんよ。
そうまさん
常連さん
会議室デビュー日: 2003/07/17
投稿数: 27
お住まい・勤務地: ジャポン
投稿日時: 2005-08-07 10:45
trapemiyaさん、ほげたさんご返答ありがとうございます。

今回、DataTableの先頭にカラムを追加したかった目的は、

1.データを取得する関数は共通化されているため、
  ダミーカラムを作ることは出来ない。

2.データを表示したいのではなく、データを編集したい。

3.データを編集する際に、(1)でとってきた状態に対して、
  先頭に2つカラムが必要になる。

4.1−3を今までは、データベース上にTempテーブル(先頭に2つカラム追加)を作成し、
  INSERT⇒SELECTの処理を行っていた。

のことが前提となります。

問題点は、(4)の処理でデータが大量になってしまうと、
非常に時間がかかっていることです。

あまり時間が無いため、設計をかえることもできず、
なんとかデータベースにアクセスせず、
メモリ上で処理することでスピードアップを狙っていました。

現在、trapemiyaさんの代替案(2)でデータベースにアクセスしないでいいように、
とりあえずの改修はできました。(これでもだいぶ早くなりました。)
が、もっとスマートに出来ないかと思い、相談させて頂きました。

きちんと目的をかかず、
返答しづらい状態で申し訳ありませんでした。
trapemiya
大ベテラン
会議室デビュー日: 2005/07/30
投稿数: 102
投稿日時: 2005-08-07 13:05
引用:

そうまさんさんの書き込み (2005-08-07 10:45) より:

1.データを取得する関数は共通化されているため、
  ダミーカラムを作ることは出来ない。
らい状態で申し訳ありませんでした。


ちょっと私が勘違いしているのかもしれませんが、ダミーカラムとは、例えば、
select '' as dummy1, '' as dummy2, * from テーブル
のような感じで、必要になった時にデータテーブルを再作成するということです。
運用的にこれで逃げられれば、これがパフォーマンス的にも有利かもしれません。
そうまさん
常連さん
会議室デビュー日: 2003/07/17
投稿数: 27
お住まい・勤務地: ジャポン
投稿日時: 2005-08-07 15:25
引用:

trapemiyaさんの書き込み (2005-08-07 13:05) より:

ダミーカラムとは、例えば、
select '' as dummy1, '' as dummy2, * from テーブル
のような感じで、必要になった時にデータテーブルを再作成するということです。




trapemiyaさん、たびたび返答ありがとうございます。

私のダミーカラムの認識もtrapemiyaさんと同じです。

共通化されているということしか書いていないので誤解を招いてしまったようですが、
この共通化されている関数は条件(WHERE句)を渡すと、
データセットが返ってくるといような感じです。
そのデータセットのカラムがこちらから指定できず、
決まった形(カラム・カラム順)で返ってきます。

さらにややこしいことにこの関数は他社さんの担当部分であり、
中身は完全にブラックボックスです。。

根本的な見直しが必要なことは理解しております。
が、実際すでにこの関数の変更依頼をすることは時期的に不可です。

とてもおかしな条件でのご質問でもうしわけありませんが、
いろいろなアドバイスほんとうにありがとうございます。
Java僧
ぬし
会議室デビュー日: 2003/11/06
投稿数: 261
投稿日時: 2005-08-08 08:48
> 4.1−3を今までは、データベース上にTempテーブル(先頭に2つカラム追加)を作成し、
>   INSERT⇒SELECTの処理を行っていた。

これの性能が問題とのことなので、実表ではなくてビュー表にしたらどうでしょうか?

CREATE VIEW name [ ( column_name [, ...] ) ] AS select '' as dummy1, '' as dummy2, * from 実表
trapemiya
大ベテラン
会議室デビュー日: 2005/07/30
投稿数: 102
投稿日時: 2005-08-08 09:57
引用:

そうまさんさんの書き込み (2005-08-07 15:25) より:
共通化されているということしか書いていないので誤解を招いてしまったようですが、
この共通化されている関数は条件(WHERE句)を渡すと、
データセットが返ってくるといような感じです。
そのデータセットのカラムがこちらから指定できず、
決まった形(カラム・カラム順)で返ってきます。


なるほど。そういう事情があったのですね。わかりました。

ところで、ADO.NET 2.0のAddを調べてみたのですが、そのオーバーロードを見る限り、不可能のようです。また、DataView.ToTable メソッドで、ダミーカラムを作ろうとしてみたのですが、認めてくれませんでした。orz

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