【问题标题】:avoid checking for DataRow.IsDBNull on each column?避免在每一列上检查 DataRow.IsDBNull?
【发布时间】:2013-01-02 07:14:14
【问题描述】:

我的代码比我可以自动将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 然后输出一个空字符串。

我该怎么做?

非常感谢!

【问题讨论】:

    标签: vb.net dataset datarow dbnull


    【解决方案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方法,它支持空值并返回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

    MSDN:

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

    【讨论】:

    • 一句话:没有经验
    • @gracchus:我删除了我的评论;)
    【解决方案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"));
    

    【讨论】:

    • 好吧,OP 会寻找 vb.net,但是使用 if() 函数可能会起作用(但不是 iif,因为它会引发空引用异常)
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      Ceres 的答案可能是最好的,因为它避免了任何类型的空测试,但值得注意的是,“IIF”功能也可以很好地工作。它仍然会为 null 进行测试,但它比 Joe 最初的方式要紧凑得多。像这样的东西应该可以解决问题:

      For Each rs As DataRow In sqlDataset.Tables(0).Rows
      
          Response.Write( IIF( IsDBNull(rs("column")), "", rs("column") ) )
      
      Next
      

      这样做的好处是,如果该值实际上为 null,您可以将“”替换为您想要输出的任何内容(一个不错的小额外奖励。)

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

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

      【讨论】:

      • Iif()Microsoft.VisualBasic 命名空间的一部分,不是 .NET 函数。 If() 应该使用到位,并避免整个函数调用。
      猜你喜欢
      • 2019-04-18
      • 1970-01-01
      • 2016-12-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-22
      • 2018-11-28
      • 2019-11-06
      • 2021-03-19
      相关资源
      最近更新 更多