DOBON.NET DOBON.NETプログラミング掲示板過去ログ

データはあるのにNULLが返る(Oracle)

環境/言語:[VB.net2003 Framework 1.1.4322]
分類:[.NET]

現在OracleConnectionクラスを使用して、オラクルに接続しています。
OracleCommandを作成し、CommandTextにSQLをセットして、
OracleDataAdapterのFillメソッドで、DataSetに結果を取得しています。


トランザクション中に、あるテーブルからデータを取得しているのですが、
Where句で設定した条件のデータは存在するのに、Nullで返ってくることが
あります。VBから流しているSQLをSQL/PLUSなどで流すと、
正常にデータは取れてきます。

このの現象は、起きるDBユーザと起きないDBユーザがあります。
これらのユーザは同じテーブル構造ですが、データの内容、件数は違います。

流しているSQLは

Select MAX(AAA) FROM BTable WHERE Code = 'NNN0001'

というような構造の極単純なものです。

なお、うまくいかない環境で、以下のような
異なるパターンのSQLを試してみました。

Select AAA FROM BTable WHERE Code = 'NNN0001'

ではダメでしたが、

Select AAA FROM BTable ORDER BY AAA

ではうまくいきました。
WHERE句があるとダメなようです。
Btableには50〜120件ほどしかデータは入っていません。

上記以外のSQLも同じトランザクション内で発行していますが、
正常にデータが取れてきます。が、このSQLだけ、何故かRowが
NULLで帰ってきてしまいます。


このような現象について、何か知っている方がいらっしゃれば、
情報をお願いできないでしょうか。
よろしくお願いします。
>
> このような現象について、何か知っている方がいらっしゃれば、
> 情報をお願いできないでしょうか。
> よろしくお願いします。

SQLServerでも同じような現象がおきたことがあります。

私の時はWHERE句に該当するレコードが単純に無かったため、
集計クエリーで該当するレコードが無い時はNullが返るのかと
自分なりに整理して、NULL対応した処理を入れましたが、
今回のはちょっと違うのかな?
> トランザクション中に、あるテーブルからデータを取得しているのですが、
> Where句で設定した条件のデータは存在するのに、Nullで返ってくることが
> あります。VBから流しているSQLをSQL/PLUSなどで流すと、
> 正常にデータは取れてきます。

このVBから流しているSQLというのは、
ソースコード上のSQLを作成している個所で、そのSQL文用の変数を
Debug.WriteLineで出力に表示させるなどして取得したものを流されていますか?

> このの現象は、起きるDBユーザと起きないDBユーザがあります。
> これらのユーザは同じテーブル構造ですが、データの内容、件数は違います。
>
> 流しているSQLは
>
> Select MAX(AAA) FROM BTable WHERE Code = 'NNN0001'
>
> というような構造の極単純なものです。

Codeの属性はどうなってますか?char/varchar、桁数などです。
実は空白が入っていて・・・というような可能性はありませんか?

> なお、うまくいかない環境で、以下のような
> 異なるパターンのSQLを試してみました。
>
> Select AAA FROM BTable WHERE Code = 'NNN0001'
>
> ではダメでしたが、
>
> Select AAA FROM BTable ORDER BY AAA
>
> ではうまくいきました。

うまくいったとは??
後者のSQLだと'NNN0001' と思われるコードのデータを表示できた、
ということでしょうか?

Select AAA FROM BTable WHERE TRIM(Code) = 'NNN0001'

だとデータは取れますか?
みなさん、お手数おかけしおります。
Tom'sさんのいうとおり、Nullでよかったのでした。
というのも、
BTable
Code(VARCHAR2) AAA(NUMBER) Suryo(NUMBER) Zcode(VARCHAR2)
123 1 300 Z01

というデータに対して、他テーブル(YTableとします)と
組み付いているZcodeが変更されたときに、
YTableの変更前の数量をBTableの数量からマイナスしてUPDATEするが、
BTableの数量が0になった時点でそのレコードを物理的削除してます。

その後に同じトランザクション内で Code=123、ZCode=Z02 のデータを
BTableに新規挿入するため、前述のSQLを発行して,AAA(いわゆる明細
番号です)の新規採番をしていたのですが、この時、同トランザクション内
でのCode=123のデータが存在しないためにNullで返ってきていました。

この、0になったら物理的削除する、というのは採番の部分よりも
後からつけた機能でして(その前は数量0のデータを残していた)、
採番する時にCode=123のデータが既にない、ということを想定
していませんでした。Nullで返ってくるのはおかしいと思い込んでいたのです。


>> Select AAA FROM BTable ORDER BY AAA
>>
>>ではうまくいきました。
>
> うまくいったとは??

レコード件数しか見ていませんでした。(- -;)
件数が1件以上あったので、「あー、データが取れてきているなー」
と思い込んでしまいました。

ほんとに、私の凡ミスで皆様にお手数おかけしてすみませんでした。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板