質問
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
だから、
解決
私が知っている唯一の方法は、それをテストすることです。それを簡単にするために、組み合わせることもできます。
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の大きなチャンクが残っているため、変更できません。
単なる提案ですが、私が普段しているのはこれです:
- データベースとの間で読み書きされるデータを含むすべての変数は、null値を処理できる必要があります。値型の場合、これはそれらをNullable(Of T)にすることを意味します。参照型(StringおよびByte())の場合、これは値をNothingにできることを意味します。
- 「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をチェックして文字列に変換する最短の方法です
- セル検証イベントを作成し、このコードを記述します
- Convert.ToString(dgv.CurrentCell.Value)=&quot;&quot;の場合その後
- CurrentCell.Value =&quot;&quot;
- 終了する場合
これは 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