处理vb.net中的dbnull数据

我想生成一些从MS-Access数据库检索到的数据的格式化输出,并存储在DataTable对象/variablesmyDataTable中。 但是,myDataTable中的一些字段包含dbNull数据。 因此,如果任何字段的姓氏intialssID的值为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议,但我通常做的是这样的:

  1. 包含从数据库读取或写入数据库的数据的所有variables应该能够处理空值。 对于值types,这意味着使它们可以为空(T)。 对于引用types(String和Byte()),这意味着允许该值为Nothing。
  2. 编写一组函数在“可能包含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的最短方法

  1. 创build单元validation事件并编写该代码
  2. 如果Convert.ToString(dgv.CurrentCell.Value)=“”那么
  3. CurrentCell.Value =“”
  4. 万一

这是BY FARDBNull转换为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