避免在每列上检查DataRow.IsDBNull?

时间:2013-01-18 14:43:01

标签: vb.net dataset datarow dbnull

如果我可以自动将IsDBNull设置为""或只是简单地滚动它而没有错误,我的代码会长2倍。

这是我的代码:

Dim conn As New SqlConnection
conn.ConnectionString = Module1.DBConn2
Dim sqlCommand = New SqlCommand("SELECT * FROM table", conn)
conn.Open()
Dim sqlDataset As DataSet = New DataSet()
Dim sqlDataAdapter As SqlDataAdapter = New SqlDataAdapter(sqlCommand)
sqlDataAdapter.Fill(sqlDataset)
conn.Close()

For Each rs As DataRow In sqlDataset.Tables(0).Rows
    If Not IsDBNull(rs("column")) Then
        Response.Write(rs("column"))
    Else
        Response.Write("")
    End If

    Response.Write("some stuff to write")

    If Not IsDBNull(rs("column2")) Then
        Response.Write(rs("column2"))
    Else
        Response.Write("")
    End If
Next

在这种情况下,我只想输入Response.Write(rs("column"))而不是If语句,如果column IsDBNull则输出一个空字符串。

我该怎么做?

非常感谢提前!

4 个答案:

答案 0 :(得分:5)

您只需使用String.Join并传递row.ItemArray

即可
For Each row As DataRow In sqlDataset.Tables(0).Rows
    Response.Write(String.Join("", row.ItemArray))
Next

这是有效的,因为DBNull.ToString返回一个空字符串。

如果要处理每一列,可以使用支持nullables的强类型DataRowExtensions.Field方法,并返回null / Nothing作为字符串。然后,您可以使用null-coalescing operator(C#中的??,VB中的If

Dim rowInfo = String.Format("{0}{1}{2}",
                            If(row.Field(Of String)("Column1"), ""),
                            If(row.Field(Of String)("Column2"), ""),
                            If(row.Field(Of String)("Column3"), ""))

但请注意,String.Format无论如何都会隐含地将null / Nothing转换为"",因此If是多余的,只是 fyi < / em>的

MSDN

  

如果index指定的对象是空引用(Nothing in   Visual Basic),然后格式项被空字符串替换   ( “”)。

答案 1 :(得分:3)

这是一个单行:

Response.Write(rs.IsNull("column") ? "" : rs("column"));

或将其作为扩展方法:

public string GetValueOrBlankString(this DataRow rs, string column)
{
    return rs.IsNull(column) ? "" : rs(column).ToString();
}

然后将其称为:

Response.Write(rs.GetValueOrBlankString("column"));

答案 2 :(得分:1)

数据集扩展为您提供了一种干净的方式,并且它也是强类型的。该类型必须与数据库中的列类型匹配。如果数据库列可以为null,则使用如下所示的可空类型。对于返回的可空类型,null值变为Nothing。

For Each rs As DataRow In sqlDataset.Tables(0).Rows

    'If string, you can use this. Null becomes nothing for the string.
    Response.Write(rs.field(of String)("column"))

    'if it's another type
    Response.Write(rs.field(of Integer?)("column"))


Next

答案 3 :(得分:1)

Ceres的答案可能是最好的,因为它避免了任何类型的空测试,但值得注意的是'IIF'功能也能很好地适用于她。它仍然会对null进行测试,但它比Joe最初做的更紧凑。这样的事情可以解决问题:

For Each rs As DataRow In sqlDataset.Tables(0).Rows

    Response.Write( IIF( IsDBNull(rs("column")), "", rs("column") ) )

Next

如果这个值实际上是空的(一个很好的小额外奖励),你可以用“”代替你想输出的任何内容。

以下是关于“IIF”功能的一些信息,供那些不知道它是什么的人使用:

http://msdn.microsoft.com/en-ca/library/27ydhh0d(v=vs.71).aspx