- ベストアンサー
DBへNULLの書き込みって出来ますか?
いつもお世話になっております。 VB初心者で「BV2008EE」を使っています。よろしくお願いします。 データリーダーが気に入ってよく使っています。 使い方に問題があるのかもしれませんが ***<< ソース例 >>***************************************** 'データコマンドの定義 command.CommandText = "SELECT tana_type FROM tbl_tana ORDER BY tana_type" 'データリーダーからのデータの読み出し dr = command.ExecuteReader() Do While dr.Read '読み出したデータ(Null以外)をコンボボックスに追加する If Not IsDBNull(dr("tana_type")) Then cmbTana.Items.Add(dr("tana_type")) End If Loop 'データリーダーを閉じる dr.Close() *********************************************************** データベースの情報をコンポボックスに追加していくものですが 空白を追加する場合があります。 原因は「NULL」ではなく「""(0文字)」が登録された為です。 一度文字を書いて削除した場所はNULLではなく""になるようです。 データリーダーで""の判定がエラーになるためNULL判定にしたのですが 入力間違いで削除するケースは多いと思う為、どうしようか困っています。 ""判定が出来ないのは私のプログラム構造のミスなのかもしれません。 苦肉の策で""だったら「NULL」を書き込もうと思いましたが出来ませんでした。 良い方法がございましたらご教授いただけると助かります。 宜しくお願いいたします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
> データリーダーで""の判定がエラーになるためNULL判定にした 考え方ですが、まずこの発想が違う気がします。NULL(この場合は Nothing ではなくDBのNull)の判定と空文字("")の判定とは別物です。具体的には NULL は DBNull という型になりますし、空文字は String 型です。両方除く必要があるのなら、両方の条件を書く必要があります。 空文字かどうかというのは文字列だとわかってからの話です。dr("tana_type") の戻り値は Object 型なので、まず文字列に変換(キャスト)して初めて、"" と比較することができます。 "" は文字列ですが DBNull は文字列ではないので、文字列にキャストしようとするとエラーになります。そのため先に DBNull かどうかを判定して、DBNull でない場合は文字列に変換して、空文字でないかを確認するという流れになるでしょう。 DBNull かどうかの判定は、IsDBNull(dr("tana_type") で問題ないと思います。あとは、dr("tana_type") を文字列にキャストしてから、文字列と比較します。つまり If Not IsDBNull(dr("tana_type")) Then Dim s As String = DirectCast(dr("tana_type"), String) If s <> String.Empty Then cmbTana.Items.Add(s) End If End If 別解として、DbDataReader には文字列型で値を取得する GetString メソッドがあるのでそれを使う手もあると思います。個人的にはこちらがお勧めです。ただしこれは、NULLのときは例外が発生するので、先に DataReader の IsDBNull でチェックします。また引数の 0 というのは列の番号です。 If Not dr.IsDBNull(0) Then Dim s As String = dr.GetString(0) If s <> String.Empty Then cmbTana.Items.Add(s) End If End If
その他の回答 (3)
- AlexSuns
- ベストアンサー率67% (78/115)
下記のどちらかかな //Nullの書込みにて対応する方法、フィールドにNULLを代入する更新SQLサンプル UPDATE "テーブル名" SET "フィールド名" = NULL //条件文の変更で対応する方法 If Not IsDBNull(dr("tana_type")) AndAlso String.IsNullOrEmpty(dr("tana_type")) Then cmbTana.Items.Add(dr("tana_type")) End If
お礼
こちらもエラーとなりました。 エラーは「ハンドルされませんでした。」と嫌われます。 貴重なご意見ありがとうございました。
- irija_bari
- ベストアンサー率73% (70/95)
直接の回答になっていないかもしれませんが、SQL 文の WHERE 句で「""(0文字)」を排除してしまってはどうでしょうか。 SELECT tana_type FROM tbl_tana WHERE tana_type <> '' ORDER BY tana_type あるいは SELECT tana_type FROM tbl_tana WHERE LENGTH(tana_type) > 0 ORDER BY tana_type でどうでしょうか? あと、"WHERE tana_type IS NOT NULL" で NULL も排除できます。
お礼
そうですね。この手は良いですね。 ありがとうございました。
- AKARI0418
- ベストアンサー率67% (112/166)
IF String.Compare(dr("tana_type"),"") <> 0 then END IF 判定を追加してみてもだめでしょうか?
お礼
ありがとうございます。 うん?私の理解不足もあると思うのですがエラーになりました。
お礼
ご返事が遅れてすみません。 ご回答ありがとうございます。 「なるほどーー」と理解できました。 本当にたすかりました。 また何かありましたら、宜しくお願いいたします。