在VB.NET中将dbNull转换为字符串的简单方法

时间:2015-10-28 20:26:25

标签: vb.net dbnull

我正在寻找一种更简单的方法来检查一个值是否为dbNull并将其转换为空字符串(如果是这样)。

我需要这种情况的一个例子是:

Dim dt As New DataTable
Dim conn As New OleDbConnection(someConnStr)
Dim adap As New OleDbDataAdapter(qryCSSInfo, cssConn)
adap.Fill(dt)


Dim someStr As String = "The first column of the first row returned: " & dt.rows(0).item(0)
Msgbox(someStr)

问题是如果dt.rows(0).item(0)在数据库中为空,它将作为dbNull值返回,这显然不会附加到字符串。

我对此问题的解决方案是使用if语句将值替换为空字符串:

Dim dt As New DataTable
Dim conn As New OleDbConnection(someConnStr)
Dim adap As New OleDbDataAdapter(qryCSSInfo, cssConn)
adap.Fill(dt)


If Not isDBNull(dt.rows(0).item(0)) then
     Dim someStr As String = "The first column of the first row returned: " & dt.rows(0).item(0)
Else
     Dim someStr As String = "The first column of the first row returned: " & ""
End If
Msgbox(someStr)

这适用于我的目的,但如果我必须对表中需要使用的每一列进行此检查,它会变得无法控制。假设我有10个列,我想用这个字符串显示。我必须对每一个进行检查以确保它们不为空。这样做有更简单或更简单的方法吗?

5 个答案:

答案 0 :(得分:7)

对于字符串类型,您可以直接以dt.rows(0).item(0).ToString()方式使用它,而不使用If条件

adap.Fill(dt)

Dim someStr As String = "The first column of the first row returned: " & dt.rows(0).item(0).ToString()

MsgBox(somestr)

即。你可以完全省略if语句。根据{{​​3}},任何DBNull值都将转换为带.ToString()

的EmptyString

另请查看此SO帖子MSDN

但是,对于非字符串数据库列类型(如整数,双精度数),必须使用IsDBNull应用检查以避免任何异常。

答案 1 :(得分:2)

您可以利用If Operator减少几行代码:

Dim someStr As String = "The first column of the first row returned: " & _
                        If(dt.rows(0).item(0) Is DbNull.Value, String.Empty, dt.rows(0).item(0))

答案 2 :(得分:1)

您应该能够将空字段与字符串连接 - 它应该转换为空字符串。那就是说row.IsNull(index)是一个很好用的测试。

    SQL = "Select top 10 Region, CompanyName FROM Suppliers"
    Dim dt As DataTable = Gen.GetDataTable(SQL, scon)
    For Each row As DataRow In dt.Rows
        MsgBox(row("companyName") & " region: " & row("Region")) ' null allowed
        If row.IsNull("region") Then ' .Net test for Null
            MsgBox(row("companyName") & " region is null")
        Else
            'continue
        End If
    Next

您还可以在查询中解决此问题 - 将空值隐藏为有用(或空)字符串。示例查询来自SQL Server,我不知道您的数据库是否支持COALESCE。

    MsgBox("COALESCE") ' SQL Server - may not be the same in ODBC databases
    SQL = "Select top 10 COALESCE(Region,'na') Region, CompanyName FROM Suppliers"
    dt = Gen.GetDataTable(SQL, scon)
    For Each row As DataRow In dt.Rows
        MsgBox(row("companyName") & " region: " & row("Region"))
    Next

一些编码说明:

    Dim dt As New DataTable
    Dim conn As New OleDbConnection(someConnStr)
    Dim adap As New OleDbDataAdapter(qryCSSInfo, cssConn)
    adap.Fill(dt)

    If Not IsDBNull(dt.Rows(0).Item(0)) Then ' in OP
        '...
    End If

    ' save some typing if you know there will be only one record
    ' will throw exception is no rows are returned, check for expected count
    Dim row As DataRow = dt.Rows(0)
    If Not IsDBNull(row(0)) Then
        '...
    End If
    ' or 
    If Not row.IsNull(0) Then
        '...
    End If

    ' note the fields can be accessed by name so you can avoid hard coding field position
    If Not row.IsNull("FieldName") Then
        '...
    End If

答案 3 :(得分:0)

最简单的方法是在字段或字符串后添加“”。 例如:

  dim EmptyString as string = Nullfield() & ""
  if EmptyString = ""
     ' in the sample, it should.
  end if

因此,在您的代码中,您可以使用:

 If dt.rows(0).item(0) & "" = "" then
      ' it should be...
 end if

答案 4 :(得分:0)

我将一些空数据放入数据网格的单元格中;正确检索该数据 我将 "" 字符串连接到单元格值:

Dim readVal As String = "" & row.Cells(2).Value