- - PR -
OracleとDataSet間でboolean型設定は可能!?
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2006-10-05 23:20
お世話になっております。
件名の件で対策案をご教示頂きたいと思っています。 SELECT文を発行し、その戻り値をDataSetで取得しFlexGridに セットして画面に表示しています。 ここで一つ問題があり頭を悩ませています。 SQL文 SELECT 'False' A ColumnName1, ..... FROM TableName WHERE ..... 'False' A は、画面に表示する時にチェックボックスとして (データタイプをbool型)表示するためにカラムを設定しています。 DataSet上では、string型となります。 FlexGrid上では、上記に有るとおり、DataTypeをbool に設定して表示してます。 一括で、チェックボックスをON/OFFする機能があるのですが、 その処理が異常に速度が遅く感じています。 データは、6万件以上もあります。 原因は、DataSetとFlexGrid間で同カラムのデータタイプが 異なるためかと思っています。 (string型同士だと、すぐに処理が終わります。) SELECT文を発行後、DataSetにFILL設定される時点で、 Aカラムのデータタイプをbool型にしたいのですが 可能でしょうか? オラクルには、bool型としての型がないため悩んでいます。 アドバイス宜しくお願いします。 | ||||
|
投稿日時: 2006-10-06 09:13
string から bool への変換は明示的にコーディングしているのですか?
DataSet とグリッドの連携機能に任せているのですか? string からの変換よりは int/byte など数値からの変換のほうが速いのではないかと思いますが、 Oracle から 0/1( -1? ) で値を返すようにしてみたらどうでしょうか。 | ||||
|
投稿日時: 2006-10-06 09:24
PL/SQLなら可能でしょうね
| ||||
|
投稿日時: 2006-10-07 01:30
masaさん、ぶさいくろうさん、返信ありがとうございます。
>string から bool への変換は明示的にコーディングしているのですか? >DataSet とグリッドの連携機能に任せているのですか? DataSetはオラクルツール(OracleClient)に任せています。 GRIDは、コード上で指定しています。 表示上では、チェックボックスでもDataSource上では string型という状況です。 少ないデータではなんとも無かったのですが、 データ数が大きくなるにつれて、処理が異常にかかると分かってきた 状況で対策をせねばらないのです。 PL/SQLは、プロシージャ(関数内)では、boolean型として 扱えますが、oracleからデータをDataSetに設定する時点で booleanとしては扱えません。型でSQLエラー(ワーニング?)が 出てしまいます。何か良い方法があるのでしょうか? ORACLECLIENTのツールで、SQL文を発行する前に、特定のカラムは booleanとして戻り値を変換してくれればよかったのですが。。。。 ご教示宜しくお願いします。 | ||||
|
投稿日時: 2006-10-08 21:47
「boolean 型を用意して欲しい」ならともかく、無茶言うなよ〜 INT の 0/1 なら、false/true と扱ってくれると思います。 ってか、DataType かなにかのリファレンスに、Oracle での型と、.NET Framework での型の対応表が載っていたと思います。ODP.NET のマニュアルだったかもしれません。それを見れば、あるいは細工しなくても対応できるかもしれません。 また、SELECT 文で CASE だっけ?で分けるとか、DataTable 側で expression 指定をした列をひとつ余分にもうけるなどで対応することも可能です。 _________________ | ||||
|
投稿日時: 2006-10-10 23:31
Jittaさん、返信ありがとうございます。
いろいろ試したのですが、うまくいきませんでした。 DataSetをプログラムで生成して Oracleからの戻り値のDataSetをコピーする形にしました。 検索速度が若干犠牲になってしまいますが やむなしと思っています。 アドバイス頂いた方、ありがとうございました。 | ||||
|
投稿日時: 2006-10-11 22:20
「いろいろ試したましたが」とだけ書いて、具体的に何をしたかが書かれていないものは、「何もしていない」と理解されます。ご注意を。
私が試したところ、次のコードで実現できます。もっとも、どこかで“変換”が入るので、そこで遅くなるのは避けられませんが。少なくとも、DataSet をデュプリケートするより高速なはずです。
実際の値が入る前に、DataColumn.DataType を設定するのがミソです。 受け付ける文字列は、Boolean.TrueString と、Boolean.FalseString です。 型指定された DataSet を作っておいてそこに流し込むとか、Expression を指定した DataColumn を追加するとかしてください。 つまり、DataSet.Fill メソッドで、テーブルも構成してもらうという使用方法は出来ません。 クラスやメンバのリファレンスは、一通り読んでから使用してください。 _________________ | ||||
|
投稿日時: 2006-10-12 20:42
Jittaさん、返信ありがとうございます。
手を抜いてしまいましたm(_ _)m。 Jittaさんがご教示して頂いた方法で対策しました。 検索後の処理を優先しました。 多謝。 |
1