• ベストアンサー

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」を書き込もうと思いましたが出来ませんでした。 良い方法がございましたらご教授いただけると助かります。 宜しくお願いいたします。

  • MIKAHA
  • お礼率90% (107/118)

質問者が選んだベストアンサー

  • ベストアンサー
  • ttkai00
  • ベストアンサー率58% (18/31)
回答No.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

MIKAHA
質問者

お礼

ご返事が遅れてすみません。 ご回答ありがとうございます。 「なるほどーー」と理解できました。 本当にたすかりました。 また何かありましたら、宜しくお願いいたします。

その他の回答 (3)

  • AlexSuns
  • ベストアンサー率67% (78/115)
回答No.3

下記のどちらかかな //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

MIKAHA
質問者

お礼

こちらもエラーとなりました。 エラーは「ハンドルされませんでした。」と嫌われます。 貴重なご意見ありがとうございました。

回答No.2

直接の回答になっていないかもしれませんが、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 も排除できます。

MIKAHA
質問者

お礼

そうですね。この手は良いですね。 ありがとうございました。

  • AKARI0418
  • ベストアンサー率67% (112/166)
回答No.1

IF String.Compare(dr("tana_type"),"") <> 0 then END IF 判定を追加してみてもだめでしょうか?

MIKAHA
質問者

お礼

ありがとうございます。 うん?私の理解不足もあると思うのですがエラーになりました。

関連するQ&A

  • null 判定について

    javascriptに関して質問させて下さい。 accessのDBのデータをHTML上で表示・追加・削除・更新を行っています。 DB上のデータで空欄の項目を表示させたときに null が表示されます。 nullではなく空欄にしておきたいので、null判定チェックを 行っているのですが、ひっかかってくれない状態です。 ------------- var database; database = new ActiveXObject("ADODB.Connection"); database.Open("Driver={Microsoft Access Driver (*.mdb)}; DBQ=c:\\mydb.mdb;"); var mySql = "select 種別, 内容 from Aテーブル; var recordSet = database.Execute(mySql); var tempHtml = "種別=" + recordSet(0); if(recordSet(1) != null){ tempHtml = tempHtml + "<br>内容=" + recordSet(1); }else{ tempHtml = tempHtml + "<br>内容="; } (略) --------------- recordSet(0)=種別 recordSet(1)=内容 上記のように普通にnull判定をしてるつもりなのですが、 recordSet(1)=内容 が access上で空欄の場合=null もif文内に入り、 「null」という文字列が表記されます。 ※accessからとってきたデータではなく、  javascript内で null を設定した場合はチェックにひっかかっています。 var tmp = null; if(tmp == null){ alert("nullである"); } 何が悪いかお分かりになる方、ご回答お願いします。

  • AccessVBA NULLについて

    いつもお世話になっております。 AccessVBAでコーディングを始めたのですが、 NULLの判定で分からない点がでてきました。 データベースより If rs.Fields(0) = Null Then Else 区分 = rs.Fields(0) End If この場合、rs.Fields(0)の中身がNULLの場合は rs.Fields(0)のデータを入れるとエラーになるので ELSEで逃がしたいのですが、 中身のデータがNULLにもかかわらずELSEの方を通ってしまいます。 If rs.Fields(0) Is Null Then Else シール = rs.Fields(0) End If こちらかとも思いましたが、オブジェクトが必要とエラーが返ってきました。 NULLをIF分で判定したい場合どのような記述を行えばよいでしょうか。 どうぞよろしくお願い致します。

  • VBA null判定

    Accessでテキストボックスの値をテーブルへ書き込むVBAを作成しているのですが、Null判定がうまくいきません。 ◎環境 OS:Windows7Pro Var:Access2010 DB:MySQL5.6 Private Sub cmdSubmit_Click() Dim Rst As DAO.Recordset Dim ErrT As String Set Rst = CurrentDb.OpenRecordset("m_plan", dbOpenDynaset) '各テキストボックス、Null判定 If IsNull(txtPid) Then MsgBox "プランID[" & txtPid & "]が未入力です" Call txtCrer Exit Sub End If If IsNull(txtPName) Then MsgBox "プラン名が未入力です" Call txtCrer Exit Sub End If If IsNull(txtPsdate) Then Me!txtPsdate = #01/01/2010# End If If IsNull(Me!txtPedate) Then Me!txtPedate = #01/01/2010# End If Debug.Print "プランID["; Me.txtPid & "]" Debug.Print "プラン名[" & Me!txtPName & "]" Debug.Print "開始日[" & Me!txtPsdate & "]" Debug.Print "終了日[" & Me!txtPedate & "]" ↑↑↑↑↑↑↑↑↑ ここで、Null判定を行ってますが、データがあるにも関わらず、処理が続行されたり、Null判定結果が起動するたびに変わります。 On Error GoTo err With Rst .MoveLast .AddNew .Fields("PlanID") = Me!txtPid .Fields("PlanName") = Me!txtPName .Fields("PlanSt") = CDate(Me!txtPsdate) .Fields("PlanEn") = CDate(Me!txtPedate) .Fields("P_Remaks") = Me!txtPbikou .Update End With Rst.Close Set Rst = Nothing err: MsgBox "DBエラー" Debug.Print Rst.Type Debug.Print err.Description Call txtCrer End Sub ただし、下記判定だけのボタンとプロシージャーでは、正常に判定されます。 判定だけの、プロシージャー 'Null判定テスト Private Sub cmdtest_Click() If IsNull(txtPid) Then Debug.Print "[" & txtPid & "]" & "Nullです。" Else Debug.Print "[" & txtPid & "]" & "Not Nullです。" End If If IsNull(txtPName) Then Debug.Print "[" & txtPName & "]" & "Nullです。" Else Debug.Print "[" & txtPName & "]" & "Not Nullです。" End If If IsNull(txtPsdate) Then Debug.Print "[" & txtPsdate & "]" & "Nullです。" Else Debug.Print "[" & txtPsdate & "]" & "Not Nullです。" End If Debug.Print "===============================" End Sub どこが間違っているかまったくわかりません、アドバイスを頂けましたら幸いです。

  • NULLが返ってこない…。

    原因がわからないため質問をさせて頂きます。 <%-- JSP <input type="text" name="name"> //名前 String name = request.getParameter("name"); Data data = new Data(); //コンストラクタをnew data.setName(name); --%> <%-- class(Bean) private String n = null; public void setName(String name){ if(name != null){ n = name; }else{ n = null; } public String getName(){ if(name != null){ return name; }else{ return name; } } --%> 値をgetParameter()メソッドで取得をして 値をsetName(name);でセットをしています。 セットした側でもし値があるのであれば その値を変数に格納。 もし値がなければnullを変数に格納しています。 しかし System.out.println(data.getName().equals("");//true System.out.println(data.getName().equals(null);//false; となりnullを返してくれません…。 このコードに何を足したらnullを返してくれるのか わかりません。 わかる方がいらっしゃいましたらよろしくお願い致します。

    • ベストアンサー
    • Java
  • VB6とVB.NETでNullの扱いが違う?

    いつもお世話になっております。 VB6.0で開発していたプログラムをVB.NETに変更することになりました。 そこで、以下の所で困っています。 VB6.0で   If IsNull(T_RYOSYU!cnt) = True Or T_RYOSYU!cnt = 0 Then と書いていた箇所をVB.NETで   If IsDBNull(T_RYOSYU.Fields("cnt").Value) = True Or T_RYOSYU.Fields("cnt").Value = 0 Then と変更しました。 このプログラムでT_RYOSYU.Fields("cnt").ValueがNullのとき、エラーが発生しました。 原因はOrの後で、Nullと0を=で比較していたからなのですが、 VB6.0の場合はNullでもそのようなエラーは発生しませんでした。 OrをOrElseに変更することで、Nullの場合には後ろの式は判定されなくなったので、VB.NET側でも動くようになりました。 VB6.0の場合はNullと0の比較が出来たということでしょうか? それとも、VB6.0の場合はOrの前が真の場合、後ろは判定されないのでしょうか? よろしくお願いします。

  • 「Nullの使い方が不正です」のエラー

    AccsessとVB間でデータの参照・登録・削除を行うプログラムを作成中です。 テキストボックスにデータを入力せずに更新するとAccess側はNull値が入るので、参照をした際に 「Nullの使い方が不正です」のエラーが表示されます。 Null値が表示可能ならその方法を教えてください。

  • VB2010 DBから値取得→パス指定で画像表示

    VB2010でPictureBoxを使用してデータベースから値を取得して PictureBox1.Image =System.Drawing.Image.FromFile("取得した値" & ".jpg") という形でPictureBoxに画像を表示させたいのですが FileNotFoundExceptionはハンドルされませんでした。とエラーが出てできません。 Dim command As SqlClient.SqlCommand = connection.CreateCommand() connection.Open() Dim dr As SqlClient.SqlDataReader command.CommandText = "SELECT s_code FROM テーブル名 ORDER BY s_code" dr = command.ExecuteReader() PictureBox1.Image =System.Drawing.Image.FromFile("..\..\pict" & "dr(s_code)" & ".jpg") データベースのs_codeとpictのフォルダ内にあるパスは一緒です。

  • ASP C# データベースから1行取得

    IDをキーにしてデータを1行セレクトし、各列の情報を個別のテキストボックスに表示したいのですが、どうすればいいかわかりません。。 SqlDataReader dr = cmd.ExecuteReader(); dr.????? こっからわかりません。。。

  • VCでJetによるCSVファイルの読み込み

    VCでJetによるCSVファイルを読み込む時、test_1=1,(2.0,3.0)で の”(2.0”を読み込めないです。”(”のせいかと思いますが、対処 方法を教えてください。 String^ test = gcnew String("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + csvdir + ";Extended Properties=\"text;HDR=Yes;FMT=Delimited\""); ...... csvSelect = gcnew String("SELECT * FROM [" + csvname + "]"); ....... OleDbDataReader^ reader = cmd->ExecuteReader(); //読み込みデータ test_1=1,(2.0,3.0) testdata1 = (String ^)reader[0]->ToString(); ”test_1=1”を読み込める。 testdata2 = (String ^)reader[1]->ToString(); ”(2.0”を読み込めない testdata2 は””となります。 testdata3 = (String ^)reader[2]->ToString(); ”3.0)”を読み込める >>>回答者:edp3142 Extended Properties の右辺に IMEX=1 を追加するといけるかな? IMEX=1を追加してもだめでした。 テキストなので、以下のように設定していますが、問題がないでしょうか ;Extended Properties=\"text;HDR=Yes;IMEX=1;FMT=Delimited\" >>>回答者:redfox63 当方の環境では うまく取得できるようですが ・・・ >>>VC2005/2008/2010 デバッグ環境での検証ですけど >>>reader->IsDBNull(1) は falseを返すんでしょうか? >>>testdata2 = reader->GetString(1);でも同じ結果ですか VC2008デバッグ環境で行っていました。reader->IsDBNull(1) は1となっています。 testdata2 = reader->GetString(1);で追加すると、実行するとcatch(Exceptionまで 直接にいき、読み込みがそのままで終了します。

  • SQLServerのNULLのデータと空文字のデータを抽出する方法を教

    SQLServerのNULLのデータと空文字のデータを抽出する方法を教えてください! いつもお世話になっております。 下記のコードで、空文字とNULLのデータがないときはデータが抽出できました。 どなたかご教授お願いいたします! ==開発環境== SQLServer2000 VB6.0 =================================================== 【VB6.0】 '■リストボックスがあり、チェックが入っている場合は、NULL値を渡し、チェックが入っていない場合はチェックボックスのデータ(名称)をパラメータとして渡します。 '■ただし、リスト名の「(空)」にチェックが入っている場合はNULLと空文字(” ”)のデータを抽出しなければなりません!! If objList.Selected(lngListCnt) = True Then If objList.List(lngListCnt) = "(空)" Then '★★★ここが分かりません!!! .Parameters("@Ivch" & strArry(intCnt) & "List" & lngListCnt) = "NULL"←??? Else '■チェックが入っているものは検索対象の為、NULLを渡す .Parameters("@Ivch" & strArry(intCnt) & "List" & lngListCnt) = Null End If Else '■チェックが入っていないものは検索対象外の為、リストボックス内のデータの名称を渡す。 .Parameters("@Ivch" & strArry(intCnt) & "List" & lngListCnt) = objList.List(lngListCnt) End If ========================================= 【SQLServer2000】 CREATE Procedure … ( @IvchList0 VARCHAR(10), @IvchList1 VARCHAR(10), @IvchList2 VARCHAR(10) @Oint件数 INT OUTPUT) AS --■条件に合致する件数を取得し、返します SELECT @Oint件数 = COUNT(*) FROM TB取込 WHERE ((Aテーブル.あ列 <> @IvchList0) OR (@IvchList0 IS NULL)) AND (((Aテーブル.あ列 <> @IvchList1) OR (@IvchList1 IS NULL)) AND (((Aテーブル.あ列 <> @IvchList2) OR (@IvchList2 IS NULL)) ・ ・ ・ 以上です。よろしくお願いします!

専門家に質問してみよう