【问题标题】:Best way to check if a Data Table has a null value in it检查数据表中是否包含空值的最佳方法
【发布时间】:2011-06-04 00:21:59
【问题描述】:

检查数据表中是否包含空值的最佳方法是什么?

在我们的场景中,大多数情况下,一列将包含所有空值。

(此数据表由第 3 方应用程序返回 - 我们正在尝试在我们的应用程序处理数据表之前进行验证)

【问题讨论】:

标签: c# .net validation datatable null


【解决方案1】:
public static class DataRowExtensions
{
    public static T GetValue<T>(this DataRow row, string fieldName)
    {
        if (row.IsNull(fieldName))
        {
            return default(T);
        }

        var value = row[fieldName];
        if (value == DBNull.Value)
        {
            return default(T);
        }

        if (typeof(T) == typeof(string))
        {
            return (T)Convert.ChangeType(value.ToString(), typeof(T));
        }

        return (T)Convert.ChangeType((T)value, typeof(T));
    }
}

用法:

string value = row.GetValue<string>("ColumnName");

【讨论】:

    【解决方案2】:
    DataTable dt = new DataTable();
    foreach (DataRow dr in dt.Rows)
    {
        if (dr["Column_Name"] == DBNull.Value)
        {
            //Do something
        }
        else
        {
            //Do something
        }
    }
    

    【讨论】:

    • 虽然这段代码可以回答问题,但最好解释一下如何解决问题,并提供代码作为示例或参考。仅代码的答案可能会令人困惑且缺乏上下文。
    【解决方案3】:

    您可以使用 LinQ 为空/空白/空格等值 使用以下查询

       var BlankValueRows = (from dr1 in Dt.AsEnumerable()
                                      where dr1["Columnname"].ToString() == ""
                                      || dr1["Columnname"].ToString() == ""
                                       || dr1["Columnname"].ToString() == ""
                                      select Columnname);
    

    这里将 Columnname 替换为表列名和 "" 您在上面的代码中的搜索项,我们查找空值。

    【讨论】:

      【解决方案4】:

      我会喜欢的......

      (!DBNull.Value.Equals(dataSet.Tables[6].Rows[0]["_id"]))
      

      【讨论】:

        【解决方案5】:

        尝试将该列的值与DBNull.Value 值进行比较,以您认为合适的任何方式过滤和管理空值。

        foreach(DataRow row in table.Rows)
        {
            object value = row["ColumnName"];
            if (value == DBNull.Value)
                // do something
            else
                // do something else
        }
        

        More information about the DBNull class


        如果要检查表中是否存在空值,可以使用这种方法:

        public static bool HasNull(this DataTable table)
        {
            foreach (DataColumn column in table.Columns)
            {
                if (table.Rows.OfType<DataRow>().Any(r => r.IsNull(column)))
                    return true;
            }
        
            return false;
        }
        

        这会让你写这个:

        table.HasNull();
        

        【讨论】:

        • 这种扩展方法的最佳实践是什么?
        • 我通常在一些公共库或我的 DAL 中创建一个“扩展”文件夹。创建一个名为“DataTableExtensions.cs”的文件并添加该方法。接下来,您只需将“使用 Name.Space.Extensions”添加到您的 cs 文件并可以访问所有定义的扩展方法。
        • 你可以(现在)使用table.AsEnumerable()而不是table.Rows.OfType&lt;DataRow&gt;()
        【解决方案6】:

        你可以循环抛出行和列,检查空值,用布尔值跟踪是否有空值,然后在循环遍历表后检查并处理它。

        //your DataTable, replace with table get code
        DataTable table = new DataTable();
        bool tableHasNull = false;
        
        foreach (DataRow row in table.Rows)
        {
            foreach (DataColumn col in table.Columns)
            {
                //test for null here
                if (row[col] == DBNull.Value)
                {
                    tableHasNull = true;
                }
            }
        }
        
        if (tableHasNull)
        {
            //handle null in table
        }
        

        您也可以使用 break 语句退出 foreach 循环,例如

        //test for null here
        if (row[col] == DBNull.Value)
        {
            tableHasNull = true;
            break;
        }
        

        保存循环遍历表格的其余部分。

        【讨论】:

          【解决方案7】:
          foreach(DataRow row in dataTable.Rows)
          {
              if(row.IsNull("myColumn"))
                  throw new Exception("Empty value!")
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-07-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-10-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多