質問

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

   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 が含まれる場合に上記のコードを機能させるには.com / questions / 105671 / any-systemdbnullvalue-vs-any-is-systemdbnull ">この質問?

役に立ちましたか?

解決

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

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

VBで記述したのは、言語が混在している場合でも、必要なように見えるためです。

編集

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

他のヒント

この問題に対処するのにうんざりしたので、私を助けるために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

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

Convert.ToString()およびConvert.To Integer()メソッドを使用して、DBnullを使用してアイテムを効率的に変換することもできます。

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

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

e.g。

mynullable = GetNullable(Of Integer?)(myobj)

その後、 mynullable (たとえば、 mynullable.HasValue )を照会できます

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が存在しないふりをします。

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

IsDbNull関数を使用できます:

  If  IsDbNull(myItem("sID")) = False AndAlso myItem("sID")==sID Then
    // Do something
End If

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

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

to

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

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

myItem("sID").Equals(sID)

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

   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

こんにちは友人

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

  1. セル検証イベントを作成し、このコードを記述します
  2. Convert.ToString(dgv.CurrentCell.Value)=&quot;&quot;の場合その後
  3. CurrentCell.Value =&quot;&quot;
  4. 終了する場合

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

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

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

AFTER (エラーメッセージはもうありません:-)):

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

これははるかに使いやすいと思います:

  

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top