- - PR -
DataTableで先頭にカラムを追加したい
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-08-08 11:18
おはようございます。
Java僧さん、trapemiyaさんご返答ありがとうございます。
このビュー表というものですが、とってきているデータセットに対して、 ビューを作るということでしょうか? すいませんが、いまいち理解できていません。。
ほんとうにいろいろと調べてもらってありがとうございます。 それにしても簡単に出来そうで、なかなかうまくいかないものですね。。 こういうことはできないときちんと理解した上で、 次からは設計できるように心がけたいと思います。 | ||||||||
|
投稿日時: 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用のデータ」の保障もできます。 | ||||||||
|
投稿日時: 2005-08-08 15:40
Java僧さんお返事ありがとうございます。
なるほど。こういう共通関数だったら、 Viewを用意しておくことも可能だったかもしれませんね。 ただし現在渡すものはWHERE句のみでありまして、 上記のようにとても汎用的とはいえない状況です。 今後の為にいろいろと勉強になります。 アドバイスありがとうございます。 | ||||||||
|
投稿日時: 2005-08-08 21:28
> 3.データを編集する際に、(1)でとってきた状態に対して、
> 先頭に2つカラムが必要になる。 なぜでしょう?なぜ、先頭でなければならないのでしょう?ダミーであり、計算に使うだけであるなら、先頭である必要も、ましてカラムを追加する必要も無いと思います。 「先頭に追加したい」という質問からは外れますが、先頭である必要がないなら、質問の目的が無くなり、問題の解決となると思います。 ↑ こういうことがあるので、質問は出来るだけ、背景も含めて詳しく書いて欲しい、と思っています。 > この共通化されている関数は条件(WHERE句)を渡すと、 ご質問とはまったく関係がないのですが、ここがとっても気になります。"WHERE ID = 256" など、文字列で渡すのでしょうか?その場合、エスケープするなどの、SQL インジェクション対策は取られているのでしょうか? 「エンドユーザに SQL の知識がないから大丈夫」と反論をいただいたこともありますが、意図せず引き起こすこともありますので。 | ||||||||
|
投稿日時: 2005-08-08 22:52
Jittaさんこんばんわ。書込みありがとうございます。
共通化されていると書くことで説明を省略してしまって大変申し訳ありません。 先頭カラムである必要性は、編集する為のメソッドが、 データテーブルを渡すものになっているからです。 1.データ取得(共通関数:引数がWHERE句) 2.データ編集のためにカラムの編集 ⇒ いままではTempテーブルにInsert⇒Select ⇒ 現在は新しくDataTableを作って編集 3.データ編集(共通関数:引数がDataTable) この3の処理の時に、規定のカラム順にしておかなければなりません。 そのために、先頭に追加する必要がありました。
正確にはWHERE句を生成するためのクラスが用意されており、 そのクラスを渡すようになっています。 そのクラスに設定されているものでWHERE句を生成し、 SQLコマンドオブジェクトのパラメータに追加されるようなしくみになっております。 言葉でうまく説明できていないかもしれませんが、危険でしょうか? | ||||||||
|
投稿日時: 2005-08-09 02:00
なんか、本当にやりたいことがイマイチ理解できていないのですが、
ひょっとしてこういうことですか? ・「入力中に使用したマスタの値(など)」を利用して、値を計算しなおしたい (ただし、入力データを格納するデータテーブルには 「入力中に使用したマスタの値(など)」用のフィールドが無い) →さて、どうしたものか.... だったら、単純に以下のようなクラスを作ってしまえばやりたいことが できると思います。 【フィールド】 1.既存データテーブル 2.マスタデータテーブル 【メソッド】 ・「calc(既存データテーブルの行)」 →引数の行に適した値などをマスタデータテーブルから取得して、 計算を行って、値を書き換える | ||||||||
|
投稿日時: 2005-08-09 06:38
で、私がずっと疑問に思っている (たぶん Jitta さんも) のは、
なぜ > この3の処理の時に、規定のカラム順にしておかなければなりません。 なのでしょうか、です。 逆にそっちを解消したほうが早いのではないでしょうか。 #ここも共通処理? | ||||||||
|
投稿日時: 2005-08-09 09:15
inaさん、にしざきさん書き込みありがとうございます。
上手く説明できないのですが、 必要なデータを取得する為のメソッドがあります。 そのメソッドがデータを取得する共通関数(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を介しての処理が行われていました。 で今回、さらに追加という形で複数件に対応するといったことになりました。 基本的には同じことをすればいいという設計で行われたわけですが、 いざ、レスポンステストというところまで来て 処理時間の遅さが問題視されるようになりました。 というわけで現在の状態に至りました。
はい。データ取得もデータ編集もすべて共通化され、 各所で利用している状態です。 また、何よりも大前提となるのがとにかく時間が無いということでした。 設計を見直せというお叱りだけは今回は勘弁してください。。 |