如果我可以自动将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
则输出一个空字符串。
我该怎么做?
非常感谢提前!
答案 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