- PR -

OracleとDataSet間でboolean型設定は可能!?

1
投稿者投稿内容
さく
ベテラン
会議室デビュー日: 2004/06/11
投稿数: 74
投稿日時: 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型としての型がないため悩んでいます。

アドバイス宜しくお願いします。



masa
大ベテラン
会議室デビュー日: 2004/10/28
投稿数: 161
投稿日時: 2006-10-06 09:13
string から bool への変換は明示的にコーディングしているのですか?
DataSet とグリッドの連携機能に任せているのですか?

string からの変換よりは
int/byte など数値からの変換のほうが速いのではないかと思いますが、
Oracle から 0/1( -1? ) で値を返すようにしてみたらどうでしょうか。
ぷさいくろう
ぬし
会議室デビュー日: 2006/08/30
投稿数: 1034
投稿日時: 2006-10-06 09:24
PL/SQLなら可能でしょうね
さく
ベテラン
会議室デビュー日: 2004/06/11
投稿数: 74
投稿日時: 2006-10-07 01:30
masaさん、ぶさいくろうさん、返信ありがとうございます。

>string から bool への変換は明示的にコーディングしているのですか?
>DataSet とグリッドの連携機能に任せているのですか?

DataSetはオラクルツール(OracleClient)に任せています。
GRIDは、コード上で指定しています。
表示上では、チェックボックスでもDataSource上では
string型という状況です。
少ないデータではなんとも無かったのですが、
データ数が大きくなるにつれて、処理が異常にかかると分かってきた
状況で対策をせねばらないのです。

PL/SQLは、プロシージャ(関数内)では、boolean型として
扱えますが、oracleからデータをDataSetに設定する時点で
booleanとしては扱えません。型でSQLエラー(ワーニング?)が
出てしまいます。何か良い方法があるのでしょうか?

ORACLECLIENTのツールで、SQL文を発行する前に、特定のカラムは
booleanとして戻り値を変換してくれればよかったのですが。。。。

ご教示宜しくお願いします。

Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-10-08 21:47
引用:

さくさんの書き込み (2006-10-07 01:30) より:

ORACLECLIENTのツールで、SQL文を発行する前に、特定のカラムは
booleanとして戻り値を変換してくれればよかったのですが。。。。


「boolean 型を用意して欲しい」ならともかく、無茶言うなよ〜

INT の 0/1 なら、false/true と扱ってくれると思います。
ってか、DataType かなにかのリファレンスに、Oracle での型と、.NET Framework での型の対応表が載っていたと思います。ODP.NET のマニュアルだったかもしれません。それを見れば、あるいは細工しなくても対応できるかもしれません。

また、SELECT 文で CASE だっけ?で分けるとか、DataTable 側で expression 指定をした列をひとつ余分にもうけるなどで対応することも可能です。
_________________
さく
ベテラン
会議室デビュー日: 2004/06/11
投稿数: 74
投稿日時: 2006-10-10 23:31
Jittaさん、返信ありがとうございます。

いろいろ試したのですが、うまくいきませんでした。
DataSetをプログラムで生成して
Oracleからの戻り値のDataSetをコピーする形にしました。

検索速度が若干犠牲になってしまいますが
やむなしと思っています。

アドバイス頂いた方、ありがとうございました。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-10-11 22:20
「いろいろ試したましたが」とだけ書いて、具体的に何をしたかが書かれていないものは、「何もしていない」と理解されます。ご注意を。


 私が試したところ、次のコードで実現できます。もっとも、どこかで“変換”が入るので、そこで遅くなるのは避けられませんが。少なくとも、DataSet をデュプリケートするより高速なはずです。
コード:
DataTable dt = new DataTable("テーブル");
dt.Columns.Add("真偽値", typeof(bool));
dt.Rows.Add(new object[] {"False"});
dt.Rows.Add(new object[] {"True"});
dataGrid1.DataSource=dt;


 実際の値が入る前に、DataColumn.DataType を設定するのがミソです。
受け付ける文字列は、Boolean.TrueString と、Boolean.FalseString です。
 型指定された DataSet を作っておいてそこに流し込むとか、Expression を指定した DataColumn を追加するとかしてください。
つまり、DataSet.Fill メソッドで、テーブルも構成してもらうという使用方法は出来ません。

 クラスやメンバのリファレンスは、一通り読んでから使用してください。

_________________
さく
ベテラン
会議室デビュー日: 2004/06/11
投稿数: 74
投稿日時: 2006-10-12 20:42
Jittaさん、返信ありがとうございます。

手を抜いてしまいましたm(_ _)m。

Jittaさんがご教示して頂いた方法で対策しました。

検索後の処理を優先しました。

多謝。
1

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