在vb.net中处理dbnull数据


75

我想生成一些从MS-Access数据库检索并存储在DataTable对象/变量myDataTable中的数据的格式化输出。但是,myDataTable中的某些字段包含dbNull数据。因此,如果任何字段lastnameintialssID的值为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在时间来检查这个问题

Answers:


135

我知道的唯一方法是对其进行测试,如果可以简化操作,则可以组合使用。

If NOT IsDbNull(myItem("sID")) AndAlso myItem("sID") = sId Then
   'Do success
ELSE
   'Failure
End If

我用VB编写,因为即使您混合使用多种语言,也可以满足您的需要。

编辑

清理以使用IsDbNull使其更具可读性


感谢您的回答。我猜它看起来像是混合的languanges,因为我用“ //”而不是VB.net注释的勾号编码注释的方式?
Azim

对!和==在比较中
Mitchel Sellers

我想我将问题中的代码固定为纯VB.Net代码。感谢您的回答。
Azim

10年后。以及“ +”。:P
约翰尼·普雷斯科特

DataRow班有自己的IsNull方法。该代码也不会使用编译Option Strict On
jmcilhinney

34

我已经厌倦了处理这个问题,所以写了一个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()函数经过了两次大修。在泛型之前,我只是将所有内容指定为对象。但是我非常喜欢通用版本。


2
+1效果很好,根据SQL Server,我已将其命名为IsNull()。
Lazlow

5
我更喜欢将2nd变量Public Shared Function NotNull(Of T)(ByVal Value As T, Optional ByVal DefaultValue As T = Nothing) As T设为可选,以便签名是这样的:它可以按If NotNull(myItem("sID")) = sID Then或上面的名称进行调用。
丹尼尔(Daniel)

使用VS 2008对我不起作用:尝试将此方法与数据集生成的dataTable一起使用,但不起作用。NotNull(rw.computer)失败,因为Dataset.Designer.vb代码在作为参数传递之前尝试转换为字符串。我想它将与通用DataTable一起使用。
D_Bester

(?BYVAL值作为整数):使用空整数时,要把它放到它的公共职能NOTNULL作为整数返回NOTNULL(数值,0)端功能
理查德·格里菲思

我喜欢这种方法。简洁有效。+1
杰西卡(Jessica)

10

您还可以使用Convert.ToString()和Convert.ToInteger()方法有效地转换DB为null的项目。


6

史蒂夫·沃瑟姆(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


3

Microsoft在.NET 1.0中提出了DBNull来表示数据库NULL。但是,这很难在后面使用,因为您无法创建强类型变量来存储真实值或null。Microsoft通过使用可为空的类型在.NET 2.0中解决了该问题。但是,您仍然受制于使用DBNull的大量API,并且无法更改它们。

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

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

2

您可以使用IsDbNull函数:

  If  IsDbNull(myItem("sID")) = False AndAlso myItem("sID")==sID Then
    // Do something
End If

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

1

对于包含字符串的行,我可以将它们转换为字符串,就像更改

tmpStr = nameItem("lastname") + " " + nameItem("initials")

tmpStr = myItem("lastname").toString + " " + myItem("intials").toString

对于在比较,如果语句myItem(“ sID”)= sID,需要将其更改为

myItem("sID").Equals(sID)

然后,由于vbNull数据,代码将运行而没有任何运行时错误。


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

0

你好朋友

这是在DataGrid中检查db Null并转换为字符串的最短方法

  1. 创建单元验证事件并编写此代码
  2. 如果Convert.ToString(dgv.CurrentCell.Value)=“”然后
  3. CurrentCell.Value =“”
  4. 万一

0

这是BY FAR转换DBNull为字符串的最简单方法。诀窍是您不能使用TRIM功能指的是从数据库中的字段时(这是我最初的问题):

之前(产生的错误消息):

Me.txtProvNum.Text = IIf(Convert.IsDBNull(TRIM(myReader("Prov_Num"))), "", TRIM(myReader("Prov_Num")))

之后(没有更多错误味精:-)):

Me.txtProvNum.Text = IIf(Convert.IsDBNull(myReader("Prov_Num")), "", myReader("Prov_Num"))

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.