web-dev-qa-db-ja.com

vb.netでのdbnullデータの処理

MS-Accessデータベースから取得され、DataTableオブジェクト/変数myDataTableに格納されたデータのフォーマットされた出力を生成したい。ただし、myDataTableの一部のフィールドには、dbNullデータが含まれています。そのため、次のVB.netコードスニペットは、フィールドlastnameintialsのいずれかの値が、またはsIDdbNull

   dim myDataTable as DataTable
   dim tmpStr as String
   dim sID as Integer = 1

   ...
   myDataTable = myTableAdapter.GetData() ' Reads the data from MS-Access table
   ...

   For Each myItem As DataRow In myDataTable.Rows

    tmpStr = nameItem("lastname") + " " + nameItem("initials")

    If myItem("sID")=sID Then
        ' Do something
    End If

    ' print tmpStr

   Next

したがって、フィールドにdbNullが含まれている場合に、上記のコードを機能させるには、データがdbNullであるかどうかを毎回確認する必要はありません- この質問

72
Azim

私が知っている唯一の方法は、それをテストすることです。それを簡単にするために、組み合わせることもできます。

If NOT IsDbNull(myItem("sID")) AndAlso myItem("sID") = sId Then
   'Do success
ELSE
   'Failure
End If

言語が混在していても、必要なように見えるので、私はVBで書きました。

編集

IsDbNullを使用して読みやすくするためにクリーンアップ

128
Mitchel Sellers

この問題に対処するのにうんざりしたので、私を助けるためにNotNull()関数を書きました。

Public Shared Function NotNull(Of T)(ByVal Value As T, ByVal DefaultValue As T) As T
        If Value Is Nothing OrElse IsDBNull(Value) Then
                Return DefaultValue
        Else
                Return Value
        End If
End Function

使用法:

If NotNull(myItem("sID"), "") = sID Then
  ' Do something
End If

私のNotNull()関数は、長年にわたっていくつかのオーバーホールを経てきました。 Genericsの前は、すべてをオブジェクトとして指定していました。しかし、私はジェネリック版を大いに好みます。

33
Steve Wortham

Convert.ToString()およびConvert.ToInteger()メソッドを使用して、DB nullを持つアイテムを効果的に変換することもできます。

8
Mitchel Sellers

Steve Worthamのコード のバリエーションで、名目上nullableタイプで使用されます:

Private Shared Function GetNullable(Of T)(dataobj As Object) As T
    If Convert.IsDBNull(dataobj) Then
        Return Nothing
    Else
        Return CType(dataobj, T)
    End If
End Function

例えば.

mynullable = GetNullable(Of Integer?)(myobj)

その後、mynullable(たとえば、mynullable.HasValue)をクエリできます

5
Greg May

Microsoftは、データベースのNULLを表すために.NET 1.0でDBNullを考案しました。ただし、厳密に型指定された変数を作成して真の値またはnullを格納することはできないため、使用するのは面倒です。 Microsoftは、.NET 2.0でnull許容型を使用してこの問題を解決しました。ただし、依然としてDBNullを使用するAPIの大きなチャンクが残っており、変更することはできません。

ただの提案ですが、私が通常行うことはこれです:

  1. データベースから読み取られた、またはデータベースに書き込まれたデータを含むすべての変数は、null値を処理できる必要があります。値型の場合、これはそれらをNullable(Of T)にすることを意味します。参照型(StringおよびByte())の場合、これは値をNothingにすることを意味します。
  2. 「DBNullを含む可能性のあるオブジェクト」と「nullable .NET変数」の間で相互に変換する一連の関数を記述します。これらの関数でDBNullスタイルのAPIへの呼び出しをすべてラップし、DBNullが存在しないふりをします。
3

BLL/DALセットアップを使用している場合、DALのオブジェクトを読み取るときにiifを試してください。

While reader.Read()
 colDropdownListNames.Add(New DDLItem( _
 CType(reader("rid"), Integer), _
 CType(reader("Item_Status"), String), _
 CType(reader("Text_Show"), String), _
 CType( IIf(IsDBNull(reader("Text_Use")), "", reader("Text_Use")) , String), _
 CType(reader("Text_SystemOnly"), String), _
 CType(reader("Parent_rid"), Integer)))
End While
2
John B

文字列を含む行については、変更のように文字列に変換できます

tmpStr = nameItem("lastname") + " " + nameItem("initials")

tmpStr = myItem("lastname").toString + " " + myItem("intials").toString

ifステートメントmyItem( "sID" sID)==の比較では、次のように変更する必要があります。

myItem("sID").Equals(sID)

その後、コードはvbNullデータによる実行時エラーなしで実行されます。

1
Azim

IsDbNull関数を使用できます。

  If  IsDbNull(myItem("sID")) = False AndAlso myItem("sID")==sID Then
    // Do something
End If
1
brendan
   VB.Net
   ========
    Dim da As New SqlDataAdapter
    Dim dt As New DataTable
    Call conecDB()        'Connection to Database
    da.SelectCommand = New SqlCommand("select max(RefNo) from BaseData", connDB)

    da.Fill(dt)

    If dt.Rows.Count > 0 And Convert.ToString(dt.Rows(0).Item(0)) = "" Then
        MsgBox("datbase is null")

    ElseIf dt.Rows.Count > 0 And Convert.ToString(dt.Rows(0).Item(0)) <> "" Then
        MsgBox("datbase have value")

    End If

私はこれがはるかに使いやすいと思う:

テーブル名からISNULL(sum(field)、0)を選択します

コピー元: http://www.codeproject.com/Questions/736515/How-do-I-avoide-Conversion-from-type-DBNull-to-typ

0
Sabbir Hassan

これはBY FARDBNullを文字列に変換する最も簡単な方法です。秘isは、データベースからフィールドを参照するときにCANNOTTRIM関数(これは最初の問題でした)を使用することです。

の前の(生成されたエラーメッセージ):

Me.txtProvNum.Text = IIf(Convert.IsDBNull(TRIM(myReader("Prov_Num"))), "", TRIM(myReader("Prov_Num")))

の後(これ以上エラーメッセージはありません:-)):

Me.txtProvNum.Text = IIf(Convert.IsDBNull(myReader("Prov_Num")), "", myReader("Prov_Num"))
0
user3284874

ハローフレンズ

これは、DataGridでdb Nullをチェックし、文字列に変換する最短の方法です

  1. セル検証イベントを作成し、このコードを記述します
  2. Convert.ToString(dgv.CurrentCell.Value)= "" If
  3. CurrentCell.Value = ""
  4. 終了する
0
JAY SINGH