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が含まれている場合に、上記のコードを機能させるには、データがdbNullであるかどうかを毎回確認する必要はありません- この質問 ?
私が知っている唯一の方法は、それをテストすることです。それを簡単にするために、組み合わせることもできます。
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
私のNotNull()関数は、長年にわたっていくつかのオーバーホールを経てきました。 Genericsの前は、すべてをオブジェクトとして指定していました。しかし、私はジェネリック版を大いに好みます。
Convert.ToString()およびConvert.ToInteger()メソッドを使用して、DB nullを持つアイテムを効果的に変換することもできます。
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
)をクエリできます
Microsoftは、データベースのNULLを表すために.NET 1.0でDBNullを考案しました。ただし、厳密に型指定された変数を作成して真の値またはnullを格納することはできないため、使用するのは面倒です。 Microsoftは、.NET 2.0でnull許容型を使用してこの問題を解決しました。ただし、依然としてDBNullを使用するAPIの大きなチャンクが残っており、変更することはできません。
ただの提案ですが、私が通常行うことはこれです:
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
文字列を含む行については、変更のように文字列に変換できます
tmpStr = nameItem("lastname") + " " + nameItem("initials")
に
tmpStr = myItem("lastname").toString + " " + myItem("intials").toString
ifステートメントmyItem( "sID" sID)==の比較では、次のように変更する必要があります。
myItem("sID").Equals(sID)
その後、コードはvbNullデータによる実行時エラーなしで実行されます。
IsDbNull関数を使用できます。
If IsDbNull(myItem("sID")) = False AndAlso myItem("sID")==sID Then
// Do something
End If
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
これはBY FARがDBNull
を文字列に変換する最も簡単な方法です。秘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"))
ハローフレンズ
これは、DataGridでdb Nullをチェックし、文字列に変換する最短の方法です