我想生成从MS-Access数据库检索并存储在 DataTable 对象/变量myDataTable中的数据的格式化输出。但是,myDataTable中的某些字段包含 dbNull 数据。因此,如果任何字段 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 而不必每次都检查数据是否为this question中的dbNull时,如何使上述代码生效?
答案 0 :(得分:125)
我所知道的唯一方法就是测试它,你可以做一个综合的,如果让它变得容易。
If NOT IsDbNull(myItem("sID")) AndAlso myItem("sID") = sId Then
'Do success
ELSE
'Failure
End If
我在VB中写道,即使你混合了语言,这就是你需要的东西。
修改强>
清理使用IsDbNull使其更具可读性
答案 1 :(得分:32)
我厌倦了处理这个问题所以我写了一个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。但我更喜欢通用版本。
答案 2 :(得分:8)
您还可以使用Convert.ToString()和Convert.To Integer()方法有效地转换带有DBnull的项目。
答案 3 :(得分:5)
Steve Wortham's code的变体,名义上与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
e.g。
mynullable = GetNullable(Of Integer?)(myobj)
然后,您可以查询mynullable
(例如mynullable.HasValue
)
答案 4 :(得分:3)
Microsoft在.NET 1.0中提出了DBNull来表示数据库NULL。但是,使用后台很麻烦,因为您无法创建强类型变量来存储真值或null。微软通过可空类型解决了.NET 2.0中的问题。但是,您仍然遇到使用DBNull的大块API,并且无法更改它们。
只是一个建议,但我通常做的是:
答案 5 :(得分: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
答案 6 :(得分:1)
对于包含字符串的行,我可以像更改
一样将它们转换为字符串tmpStr = nameItem("lastname") + " " + nameItem("initials")
到
tmpStr = myItem("lastname").toString + " " + myItem("intials").toString
要在 if 语句 myItem(“sID”)= sID 中进行比较,需要将其更改为
myItem("sID").Equals(sID)
然后,由于 vbNull 数据,代码将运行时没有任何运行时错误。
答案 7 :(得分:1)
您可以使用IsDbNull函数:
If IsDbNull(myItem("sID")) = False AndAlso myItem("sID")==sID Then
// Do something
End If
答案 8 :(得分:1)
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
答案 9 :(得分:0)
朋友你好
这是在DataGrid中检查db Null并转换为字符串的最短方法
答案 10 :(得分:0)
BY FAR 是将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"))
答案 11 :(得分:0)
我认为这应该更容易使用:
从tablename
中选择ISNULL(sum(field),0)
复制自:http://www.codeproject.com/Questions/736515/How-do-I-avoide-Conversion-from-type-DBNull-to-typ