79

MS-Accessデータベースから取得され、 DataTableオブジェクト/変数myDataTableに格納されたデータのフォーマットされた出力を生成したいと思います。ただし、myDataTableの一部のフィールドにはdbNullデータが含まれています。したがって、次のVB.netコードスニペットでは、lastnameinitals、または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であるかどうかを毎回チェックすることなく、フィールドにdbNullが含まれている可能性がある場合に、上記のコードを機能させるにはどうすればよいですか?

4

13 に答える 13

139

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

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

言語を混ぜても、VBで書いたので、必要なように見えます。

編集

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

于 2008-10-21T18:07:57.860 に答える
35

この問題に対処するのにうんざりしたので、私を助けるために 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 の前は、単純にすべてをオブジェクトとして指定していました。しかし、私はジェネリック版の方がずっと好きです。

于 2009-11-12T17:10:10.680 に答える
11

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

于 2008-10-21T18:09:57.543 に答える
6

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)

于 2012-03-31T05:52:58.543 に答える
3

Microsoftは、データベースのNULLを表すために.NET1.0でDBNullを考案しました。ただし、強い型の変数を作成して真の値またはnullを格納することはできないため、使用するのは面倒です。Microsoftは、null許容型を使用して.NET2.0でその問題を解決しました。ただし、DBNullを使用するAPIの大きなチャンクにとどまっており、変更することはできません。

単なる提案ですが、私が通常行うことはこれです:

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

IsDbNull関数を使用できます。

  If  IsDbNull(myItem("sID")) = False AndAlso myItem("sID")==sID Then
    // Do something
End If
于 2008-10-21T18:08:41.137 に答える
2

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
于 2012-09-05T12:25:03.700 に答える
1

文字列を含む行については、変更する場合と同じように文字列に変換できます

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

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

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

myItem("sID").Equals(sID)

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

于 2008-10-21T18:08:01.060 に答える
0

これは、文字に変換する最も簡単な方法DBNullです。秘訣は、データベースからフィールドを参照するときに関数を使用できない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"))
于 2014-02-07T17:07:44.580 に答える
0

これはもっと使いやすいはずだと思います:

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

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

于 2016-09-26T20:33:43.147 に答える
0

皆さん、こんにちは

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

  1. セル検証イベントを作成し、このコードを記述します
  2. If Convert.ToString(dgv.CurrentCell.Value) = "" その後
  3. CurrentCell.Value = ""
  4. 終了条件
于 2013-08-11T10:10:41.370 に答える