在vb.net中处理dbnull数据

时间:2008-10-21 18:03:09

标签: vb.net dbnull

我想生成从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时,如何使上述代码生效?

12 个答案:

答案 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,并且无法更改它们。

只是一个建议,但我通常做的是:

  1. 包含从数据库读取或写入数据的数据的所有变量都应该能够处理空值。对于值类型,这意味着将它们设为Nullable(Of T)。对于引用类型(String和Byte()),这意味着允许该值为Nothing。
  2. 编写一组函数,在“可能包含DBNull的对象”和“可以为空的.NET变量”之间来回转换。在这些函数中包含对DBNull样式API的所有调用,然后假装DBNull不存在。

答案 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并转换为字符串的最短方法

  1. 创建单元格验证事件并编写此代码
  2. 如果Convert.ToString(dgv.CurrentCell.Value)=“”那么
  3. CurrentCell.Value =“”
  4. 结束如果

答案 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