- PR -

DBのデータのNull判定について

1
投稿者投稿内容
One.net
大ベテラン
会議室デビュー日: 2008/03/01
投稿数: 202
投稿日時: 2008-04-20 15:07
WindowsXP VB2005EEでDbはAccess2003を使ってWindowsアプリケーションを作っています。
DBから読み込んだデータにNULLがあるかどうかの判定方法をお尋ねします。
下記過去ログで次のようなテストを行いましたがうまく動作しません。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=3956&forum=7
引用:

Dim obj As Object = Me.DataSet1.n0販売(0).備考
If obj Is DBNull.Value Then
MessageBox.Show("備考データはNullです。Nullの処理をして下さい。")
Else
MessageBox.Show("Nullではありません。通常の処理をして下さい。")
End If



エラー内容は「「テーブル() 'n0販売' にある列 '備考' の値は DBNull です。」
確かにインデックスゼロの備考はヌルですがコンパイルエラーで上記のエラーメッセージが
出てしまいます。ソースに何か問題があるのでしょうか。よろしくお願いいたします。
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2008-04-20 15:16
NAL-6295です。
型付DataSetの場合、特に設定をしなければ備考プロパティ内でDBNullの時、例外を発行するようになっていますので、その前にIs備考NullでNullかどうかの検証をする必要があります。
具体的には以下のような感じです。
コード:
If Me.DataSet1.n0販売(0).Is備考Null Then
	MessageBox.Show("備考データはNullです。Nullの処理をして下さい。") 
Else 
	MessageBox.Show("Nullではありません。通常の処理をして下さい。") 
End If

One.net
大ベテラン
会議室デビュー日: 2008/03/01
投稿数: 202
投稿日時: 2008-04-20 15:41
NAL-6295さん、早速の回答ありがとうございました。
何度もURLのテストを行ったのにうまくいかなかったのですが、NAL-6295さんの具体例で
見事に判定できました。回答いただきました内容をまだ理解できていませんが、次のように理解して
いいのでしょうか。

・「型付」とは型指定したDataSetの意味でしょうか?
・「備考プロパティ内でDBNullの時、例外を発行するようになっています」とは
「Dim obj As Object = Me.DataSet1.n0販売(0).備考」などとオブジェクトに入れるのではなく
備考を直接Is備考Null で判定する。という意味でしょうか。

どちらにしても解決できました。もし回答いただけなくても自分で勉強いたします。
本当にありがとうございました。

NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2008-04-20 18:17
NAL-6295です。

引用:

・「型付」とは型指定したDataSetの意味でしょうか?
・「備考プロパティ内でDBNullの時、例外を発行するようになっています」とは
「Dim obj As Object = Me.DataSet1.n0販売(0).備考」などとオブジェクトに入れるのではなく
備考を直接Is備考Null で判定する。という意味でしょうか



そういう理解で良いと思います。
Null許可の項目については、Is項目名Nullというのが一緒に作られていますので、そちらで判断しましょう。
直接項目名のプロパティにアクセスする前にIs項目名Nullでチェックした方が良いというのは、自動生成されているロジックを見ると(項目名のプロパティに合わせて右クリックで定義に飛べます。)よくわかると思います。
もしくは、型付DataSetを作る過程でString型の項目に関しては、Null時の動作を設定できますので(例外を発行するのか(Default)、何もしないのか、String.Emptyを返すのか)そちらで設定するのもありです。
One.net
大ベテラン
会議室デビュー日: 2008/03/01
投稿数: 202
投稿日時: 2008-04-20 20:19
NAL-6295さん、ありがとうございました。自動生成されているロジックを見てもそれを解読する力がありませんが「Public Property 備考() As String」のロジックよりも先にIs項目名Nullを使って判定しないと例外的エラーが発行されるように理解いたしました。
本当にありがとうございました。

[ メッセージ編集済み 編集者: One.net 編集日時 2008-04-20 20:20 ]
1

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