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

IsDBNullでエラー

  • 題名: IsDBNullでエラー
  • 著者: ぽくお
  • 日時: 2008/08/08 16:47:54
  • ID: 22637
  • この記事の返信元:
    • (なし)
  • この記事への返信:
  • ツリーを表示
環境/言語:[WinXP VB.NET2002、2003 NET Framework1.1]
分類:[.NET]

データリーダーで、値を読み込むときに、フィールドの値がNULLであるか事前にチェックしています。
そこで、以下のようなエラーがでます。

'System.InvalidCastException' のハンドルされていない例外が Microsoft.VisualBasic.dll で発生しました。
追加情報 : 型 'DBNull' から型 'String' へのキャストが有効ではありません。

Dim dtReader As SqlDataReader
Dim sStr as String
If IsDBNull(dtReader.Item("フィールド名")) Then
sStr = dtReader.Item("フィールド名"))
 End If

このような感じで、読み取りますが、今までは、うまくいったのに、
ある日突然、上のエラーになるようになって、どうにもならなくなります。
なにか環境がかわったせいなのかもしれませんが、回避する方法がなくて困っています。
dtReader.Item("フィールド名")自体は、値が入っていても、
NULLの場合でも、両方エラーになります。
フィールド名が、JANコードや○○コードのようにカタカナ交じりの場合になるような気がします。
dtReader.Item("フィールド名")をdtReader.Item("[フィールド名]")
と変えても、状況は同じです。
今のところ、該当する部分をスキップさせるした対処法がありません。
データベースを入れ換えるとうまくいきます。
ダメになったデータベースは、ずっとダメなままです。
データベースはMSDEです。

データが壊れているわけでもないのに、何かが変わってしまったのだと思うのですが、何が原因かわかりません。

どなたか分かる方、よろしくお願いします。
■No22637に返信(ぽくおさんの記事)
とりあえず、提示されたコードは、わざわざ NULL の時に文字列に変換しているので
エラーになるのが当然だと思いますが?

こんなコードを見せられると、質問者の説明を全て疑わしく思ってしまいます。
推測ですが、なにかの拍子にIf文からNotが抜け落ちてしまったのでしょうか?
すると、Null値を含むデータベースが「ダメ」になって、その後ずっと「ダメ」なままとなります。

回避策は、Notの代わりに=Falseを使う、とか・・・(誤って抜け落ちにくい)。
■No22638に返信(るしぇさんの記事)
> ■No22637に返信(ぽくおさんの記事)
> とりあえず、提示されたコードは、わざわざ NULL の時に文字列に変換しているので
> エラーになるのが当然だと思いますが?
>
> こんなコードを見せられると、質問者の説明を全て疑わしく思ってしまいます。

ごめんなさい。
コードを書き間違えました。

If IsDBNull(dtReader.Item("フィールド名")) Then
sStr = ""
Else
sStr = dtReader.Item("フィールド名"))
End If


If IsDBNull(dtReader.Item("フィールド名")) Then
の行でエラーになってしまうということです。
普段はここでの評価でエラーになることはないのですが、
なぜかエラーになったしまうことがあるのです。
■No22641に返信(ぽくおさんの記事)
> If IsDBNull(dtReader.Item("フィールド名")) Then
> の行でエラーになってしまうということです。
> 普段はここでの評価でエラーになることはないのですが、
> なぜかエラーになったしまうことがあるのです。

例外の詳細を見れば何で NullReferenceException が発生しているかわかります。
■No22642に返信(じゃんぬねっとさんの記事)

> 例外の詳細を見れば何で NullReferenceException が発生しているかわかります。

'System.InvalidCastException' のハンドルされていない例外が Microsoft.VisualBasic.dll で発生しました。
追加情報 : 型 'DBNull' から型 'String' へのキャストが有効ではありません。

ということですが、
dtReader.Item("フィールド名")={System.DBNULL}
の場合でも、
dtReader.Item("フィールド名)=0
のように値が入っている場合でも、同じエラーがでます。
どこで、型 'DBNull' から型 'String' へのキャストが行われているのかわかりませんが、必ず、デバッグすると
If IsDBNull(dtReader.Item("フィールド名")) Then
の行が緑になって、上のメッセージが出ます。
■No22643に返信(ぽくおさんの記事)
> 'System.InvalidCastException' のハンドルされていない例外が Microsoft.VisualBasic.dll で発生しました。
> 追加情報 : 型 'DBNull' から型 'String' へのキャストが有効ではありません。

あー、間違えました。 InvalidCastException でしたね。
とりあえず IsDBNull メソッドの中身を見せてください。

# 引数の型が DBNull.Value を許容しないような型だったら卒倒。
先ほどは勘違い失礼しました。
IsDBNullという名前のメソッドがあなたのプログラムのどこかに書かれていて、そちらが呼び出されているのかもしれません。
とりあえず、If dtReader.Item("フィールド名") Is DBNull.Value Then 〜 で 試してみてはいかがでしょうか?
>とりあえず IsDBNull メソッドの中身を見せてください。

IsDBNull メソッドの引数はdtReader.Item("フィールド名)です。
エラーになったときに、マウスのカーソルを持っていって、中身を見ると、
{System.DBNULL}、または、0などの数値です。
データベースの中身をNULLにしたり、数値を入れたりして、試しています。
いままで、この現象が発生したときの列名、データ型は
列名:表示ページ データ型:int
列名:JANコード データ型:nvarchar(13)
です。

エラーになったという連絡を受けて、自分のPCで、適当なデータファイルを使って、試しても大丈夫なのに、
実際にエラーになった現地のデータファイルをとってきて試すをエラーになります。
エラーになるものと、ならないもののデータファイルの違いがわかりません。

>とりあえず、If dtReader.Item("フィールド名") Is DBNull.Value Then 〜 で 試してみてはいかがでしょうか?

If dtReader.Item("フィールド名") Is DBNull.Value Then
とか
If TypeOf dtReader.Item("フィールド名") Is DBNull Then
とか試してみたのですが、同じ状態です。
思いつきで恐縮ですが、
 Dim o as Object = dtReader.Item("フィールド名")
 If o Is DBNull.Value Then 〜
と書いた場合、どちらの行でエラーが出ますでしょうか?(多分前者だと思いますが)

あるいは、dtReader.IsDBNull(列番号)ではどうなるでしょうか?
  • 題名: Re[6]: IsDBNullでエラー
  • 著者: ぽくお
  • 日時: 2008/08/11 9:32:30
  • ID: 22654
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
2008/08/11(Mon) 09:33:04 編集(投稿者)
2008/08/11(Mon) 09:33:01 編集(投稿者)

自己解決しました。

私の勘違いでした。
エラーが発生したときに
If IsDBNull(dtReader.Item("フィールド名")) Then
の行が緑になるので、そこでエラーが発生しているのかと思ったら、
その1行前で、
データがNullのものをStringにキャストしていました。
すみませんでした。
解決済み!

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