- PR -

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

投稿者投稿内容
そうまさん
常連さん
会議室デビュー日: 2003/07/17
投稿数: 27
お住まい・勤務地: ジャポン
投稿日時: 2005-08-08 11:18
おはようございます。

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

引用:

Java僧さんの書き込み (2005-08-08 08:48) より:

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

CREATE VIEW name [ ( column_name [, ...] ) ] AS select '' as dummy1, '' as dummy2, * from 実表



このビュー表というものですが、とってきているデータセットに対して、
ビューを作るということでしょうか?

すいませんが、いまいち理解できていません。。

引用:

trapemiyaさんの書き込み (2005-08-08 09:57) より:

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


ほんとうにいろいろと調べてもらってありがとうございます。
それにしても簡単に出来そうで、なかなかうまくいかないものですね。。

こういうことはできないときちんと理解した上で、
次からは設計できるように心がけたいと思います。
Java僧
ぬし
会議室デビュー日: 2003/11/06
投稿数: 261
投稿日時: 2005-08-08 12:38
共通関数は以下のような仕様だと推測して書きました。

Dataset fx(String tableName, String where) ;

「ビュー表」というのはRDBMSのビュー表という意味で書きました。

なので、RDMBSサーバで、

CREATE VIEW viewTable AS select '' as dummy1, '' as dummy2, * from 実表

としておいてから、

dataSet = fx("viewTable", "col1='x'");

でアクセスできれば INSERT の時間は不要になりますね。
ビュー表ならば、「実データ=select用のデータ」の保障もできます。
そうまさん
常連さん
会議室デビュー日: 2003/07/17
投稿数: 27
お住まい・勤務地: ジャポン
投稿日時: 2005-08-08 15:40
Java僧さんお返事ありがとうございます。

引用:

Java僧さんの書き込み (2005-08-08 12:38) より:

Dataset fx(String tableName, String where) ;

「ビュー表」というのはRDBMSのビュー表という意味で書きました。

なので、RDMBSサーバで、

CREATE VIEW viewTable AS select '' as dummy1, '' as dummy2, * from 実表

としておいてから、

dataSet = fx("viewTable", "col1='x'");

でアクセスできれば INSERT の時間は不要になりますね。
ビュー表ならば、「実データ=select用のデータ」の保障もできます。



なるほど。こういう共通関数だったら、
Viewを用意しておくことも可能だったかもしれませんね。

ただし現在渡すものはWHERE句のみでありまして、
上記のようにとても汎用的とはいえない状況です。

今後の為にいろいろと勉強になります。
アドバイスありがとうございます。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-08-08 21:28
> 3.データを編集する際に、(1)でとってきた状態に対して、
>   先頭に2つカラムが必要になる。
 なぜでしょう?なぜ、先頭でなければならないのでしょう?ダミーであり、計算に使うだけであるなら、先頭である必要も、ましてカラムを追加する必要も無いと思います。

 「先頭に追加したい」という質問からは外れますが、先頭である必要がないなら、質問の目的が無くなり、問題の解決となると思います。

こういうことがあるので、質問は出来るだけ、背景も含めて詳しく書いて欲しい、と思っています。


> この共通化されている関数は条件(WHERE句)を渡すと、
 ご質問とはまったく関係がないのですが、ここがとっても気になります。"WHERE ID = 256" など、文字列で渡すのでしょうか?その場合、エスケープするなどの、SQL インジェクション対策は取られているのでしょうか?
 「エンドユーザに SQL の知識がないから大丈夫」と反論をいただいたこともありますが、意図せず引き起こすこともありますので。
そうまさん
常連さん
会議室デビュー日: 2003/07/17
投稿数: 27
お住まい・勤務地: ジャポン
投稿日時: 2005-08-08 22:52
Jittaさんこんばんわ。書込みありがとうございます。

引用:

Jittaさんの書き込み (2005-08-08 21:28) より:
> 3.データを編集する際に、(1)でとってきた状態に対して、
>   先頭に2つカラムが必要になる。
 なぜでしょう?なぜ、先頭でなければならないのでしょう?ダミーであり、計算に使うだけであるなら、先頭である必要も、ましてカラムを追加する必要も無いと思います。



共通化されていると書くことで説明を省略してしまって大変申し訳ありません。
先頭カラムである必要性は、編集する為のメソッドが、
データテーブルを渡すものになっているからです。

1.データ取得(共通関数:引数がWHERE句)

2.データ編集のためにカラムの編集
 ⇒ いままではTempテーブルにInsert⇒Select
 ⇒ 現在は新しくDataTableを作って編集

3.データ編集(共通関数:引数がDataTable)

この3の処理の時に、規定のカラム順にしておかなければなりません。
そのために、先頭に追加する必要がありました。

引用:

 ご質問とはまったく関係がないのですが、ここがとっても気になります。"WHERE ID = 256" など、文字列で渡すのでしょうか?その場合、エスケープするなどの、SQL インジェクション対策は取られているのでしょうか?
 「エンドユーザに SQL の知識がないから大丈夫」と反論をいただいたこともありますが、意図せず引き起こすこともありますので。



正確にはWHERE句を生成するためのクラスが用意されており、
そのクラスを渡すようになっています。
そのクラスに設定されているものでWHERE句を生成し、
SQLコマンドオブジェクトのパラメータに追加されるようなしくみになっております。

言葉でうまく説明できていないかもしれませんが、危険でしょうか?
ina
ベテラン
会議室デビュー日: 2005/04/14
投稿数: 58
投稿日時: 2005-08-09 02:00
なんか、本当にやりたいことがイマイチ理解できていないのですが、
ひょっとしてこういうことですか?

 ・「入力中に使用したマスタの値(など)」を利用して、値を計算しなおしたい
 (ただし、入力データを格納するデータテーブルには
  「入力中に使用したマスタの値(など)」用のフィールドが無い)
 →さて、どうしたものか....


だったら、単純に以下のようなクラスを作ってしまえばやりたいことが
できると思います。

【フィールド】
 1.既存データテーブル
 2.マスタデータテーブル
【メソッド】
 ・「calc(既存データテーブルの行)」
  →引数の行に適した値などをマスタデータテーブルから取得して、
   計算を行って、値を書き換える
にしざき
ぬし
会議室デビュー日: 2003/06/30
投稿数: 304
投稿日時: 2005-08-09 06:38
で、私がずっと疑問に思っている (たぶん Jitta さんも) のは、
なぜ
> この3の処理の時に、規定のカラム順にしておかなければなりません。
なのでしょうか、です。

逆にそっちを解消したほうが早いのではないでしょうか。

#ここも共通処理?
そうまさん
常連さん
会議室デビュー日: 2003/07/17
投稿数: 27
お住まい・勤務地: ジャポン
投稿日時: 2005-08-09 09:15
inaさん、にしざきさん書き込みありがとうございます。

引用:

inaさんの書き込み (2005-08-09 02:00) より:
なんか、本当にやりたいことがイマイチ理解できていないのですが、
ひょっとしてこういうことですか?

 ・「入力中に使用したマスタの値(など)」を利用して、値を計算しなおしたい
 (ただし、入力データを格納するデータテーブルには
  「入力中に使用したマスタの値(など)」用のフィールドが無い)
 →さて、どうしたものか....


だったら、単純に以下のようなクラスを作ってしまえばやりたいことが
できると思います。

【フィールド】
 1.既存データテーブル
 2.マスタデータテーブル
【メソッド】
 ・「calc(既存データテーブルの行)」
  →引数の行に適した値などをマスタデータテーブルから取得して、
   計算を行って、値を書き換える



上手く説明できないのですが、
必要なデータを取得する為のメソッドがあります。
そのメソッドがデータを取得する共通関数(1)です。

そしてデータ編集を行う(取得されたものにカラムを2個追加する必要がある)
ということですが、編集する際にデータが横に並んでいるものを
条件によってはレコードを追加するといったように、
縦に展開する必要があります。

1 AAAAA CCCCC 10 20 30
2 AAAAA CCCCC 10 30
 ↓
1 AAAAA CCCCC 10
1 AAAAA CCCCC 20
1 AAAAA CCCCC 30
2 AAAAA CCCCC 10
2 AAAAA CCCCC 30

たとえばこんな感じです。
このときにキーとなるものが重複してしまうため、
あらかじめカラムを追加してキーを重複させないようにしています。
このように並べ替えて編集しています。

(1)のメソッドは当初は編集を考慮せず、
画面に一覧で出せば言いという状態で作られました。

そして機能追加という形で、編集処理が入ったわけですが、
当初は1件単位で編集が行われる予定でした。

というわけで、一番最初に言いましたINSERT⇒SELECTという
DBを介しての処理が行われていました。

で今回、さらに追加という形で複数件に対応するといったことになりました。
基本的には同じことをすればいいという設計で行われたわけですが、
いざ、レスポンステストというところまで来て
処理時間の遅さが問題視されるようになりました。

というわけで現在の状態に至りました。

引用:

にしざきさんの書き込み (2005-08-09 06:38) より:
で、私がずっと疑問に思っている (たぶん Jitta さんも) のは、
なぜ
> この3の処理の時に、規定のカラム順にしておかなければなりません。
なのでしょうか、です。

逆にそっちを解消したほうが早いのではないでしょうか。

#ここも共通処理?


はい。データ取得もデータ編集もすべて共通化され、
各所で利用している状態です。
また、何よりも大前提となるのがとにかく時間が無いということでした。
設計を見直せというお叱りだけは今回は勘弁してください。。

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