避免在每一列检查DataRow.IsDBNull?(avoid checking for DataR

2019-07-18 10:18发布

我的代码是2倍长于这将是,如果我能自动设置IsDBNull""或简单地在推出它没有一个错误。

这是我的代码:

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再输出一个空字符串。

我怎样才能做到这一点?

提前谢谢了!

Answer 1:

你可以简单地使用String.Join并通过row.ItemArray

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

该工程自DBNull.ToString返回一个空字符串。

如果你想解决每一个列,你可以使用强类型DataRowExtensions.Field支持nullables方法并返回null / Nothing字符串。 然后,你可以使用null-coalescing operator??在C#中, If在VB中)。

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是多余的, 仅供参考

MSDN :

如果由索引指定的对象为空引用(Visual Basic中没有),则格式项被替换为空字符串(“”)。



Answer 2:

这里是一个班轮:

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"));


Answer 3:

数据集扩展给你做一个干净的方式,它也是强类型的。 该类型必须尽管在数据库中的列类型相匹配。 如果数据库列可以为空,然后使用可空类型如下图所示。 空值将成为返回可空类型没有。

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


Answer 4:

谷神星的回答可能是最好的因为它避免了任何形式的空测试,但值得注意的是,“IIF”功能也将工作得很好了。 它仍然会做的空测试,但它要比乔如何原来做更紧凑。 这样的事情应该做的伎俩:

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



文章来源: avoid checking for DataRow.IsDBNull on each column?