处理vb.net中的dbnull数据
我想生成一些从MS-Access数据库检索到的数据的格式化输出,并存储在DataTable对象/variablesmyDataTable中。 但是,myDataTable中的一些字段包含dbNull数据。 因此,如果任何字段的姓氏 , 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在这个问题 ?
我知道的唯一方法就是testing它,如果可以使其变得容易,可以进行组合。
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()方法有效地转换带有数据库空间的项目。
Steve Wortham的代码的一个变种,名义上用于可空types:
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
微软在.NET 1.0中提出了DBNull来表示数据库NULL。 然而,使用后面的一个痛苦,因为你不能创build一个强types的variables来存储一个真正的价值或null。 微软在.NET 2.0中用可为空的types来解决这个问题。 然而,你仍然坚持使用DBNull的大块的API,他们不能改变。
只是一个build议,但我通常做的是这样的:
- 包含从数据库读取或写入数据库的数据的所有variables应该能够处理空值。 对于值types,这意味着使它们可以为空(T)。 对于引用types(String和Byte()),这意味着允许该值为Nothing。
- 编写一组函数在“可能包含DBNull的对象”和“可空的.NETvariables”之间来回转换。 将所有对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
对于包含string的行,我可以将它们转换为string
tmpStr = nameItem("lastname") + " " + nameItem("initials")
至
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并转换为string的最短方法
- 创build单元validation事件并编写该代码
- 如果Convert.ToString(dgv.CurrentCell.Value)=“”那么
- CurrentCell.Value =“”
- 万一
这是BY FAR将DBNull
转换为string的最简单方法。 诀窍是,当引用数据库中的字段时, 不能使用TRIM
函数(这是我最初的问题):
之前 (产生错误信息):
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"))
我认为这应该更容易使用:
从表名中selectISNULL(sum(field),0)
复制来自: http : //www.codeproject.com/Questions/736515/How-do-I-avoide-Conversion-from-type-DBNull-to-typ
- 在Perl比较“eq”和“==”的string
- 无法加载模块描述符类:未find类“com.google.android.gms.dynamite.descriptors.com.google.firebase.auth.ModuleDescriptor”