4

我的代码比我可以自动设置或简单地翻转它而没有错误的时间长 2IsDBNull""

这是我的代码:

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

4 回答 4

5

您可以简单地使用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""隐式,因此 theIf是多余的,仅供参考

MSDN

如果 index 指定的对象是空引用(在 Visual Basic 中为 Nothing),则格式项将替换为空字符串 ("")。

于 2013-01-18T14:45:09.470 回答
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"));
于 2013-01-18T14:49:15.200 回答
1

数据集扩展为您提供了一种干净的方式,而且它也是强类型的。该类型必须与数据库中的列类型匹配。如果数据库列可以为空,则使用如下可为空的类型。对于返回的可空类型,空值变为 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
于 2013-01-18T15:29:55.650 回答
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

于 2013-03-04T17:50:01.230 回答