我想生成从MS-Access数据库检索并存储在DataTable对象/变量myDataTable中的一些格式化数据输出.但是,myDataTable中的一些字段包含dbNull数据.因此,如果任何字段lastname,intials或sID的值为dbNull,则以下VB.net代码段将给出错误.
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之前,我只是将所有内容都指定为Object.但我更喜欢通用版本.
您还可以使用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
)