【问题标题】:How to check IS NULL on DataTable?如何在 DataTable 上检查 IS NULL?
【发布时间】:2013-03-20 12:44:58
【问题描述】:

在我的情况下,我正在传递一个 sql 查询并获取数据集中的数据,但是当我尝试获取 ParentId 列包含 NULL 的行时出现问题。这是一段代码。

   DataSet ds = GetDataSet("Select ProductId,ProductName,ParentId from ProductTable");

   //ds is not blank and it has 2 rows in which ParentId is NULL

   DataRow[] Rows = ds.Tables[0].Select("ParentId IS NULL");

但我仍然没有得到任何行。 需要帮忙。谢谢。

【问题讨论】:

  • 您的做法对我来说似乎是正确的,它应该可以工作,但请确保它具有 null 而不是空白值。

标签: c# asp.net linq datatable


【解决方案1】:

使用强类型DataRow 扩展方法Field,它也支持可空类型:

IEnumerable<DataRow> rows = ds.Tables[0].AsEnumerable()
    .Where(r => !r.Field<int?>("ParentId").HasValue);

请注意,我使用了Enumerable.Where,这是一种 Linq 扩展方法来过滤表格。

如果您想要一个数组,请使用ToArray,如果您想要一个新的DataTable,请使用CopyToDataTable。如果您只是想枚举结果,请使用foreach。

foreach(DataRow row in rows)
{
    // ...
}

【讨论】:

  • 仍然显示这个-base {System.SystemException} = {"Specified cast is not valid."}。当我写字符串而不是 int 时,它显示 - {类型'string'必须是不可为空的值类型才能将其用作泛型类型或方法'System.Nullable}中的参数'T'}.i我不熟悉 linq。
  • @Anand;那么DataColumn 的类型是string 而不是int(正如我假设的那样)。您必须改用.Where(r =&gt; r.Field&lt;string&gt;("ParentId")==null)。
  • 现在它显示了- {Empty = "Enumeration yielded no results"}...为什么会这样? :(
  • @Anand:因为没有 ParentId=null 的行?!您能显示您尝试过的最后一个查询吗?
  • DataSet ds = GetDataSet("Select ProductId,ProductName,ParentId from ProductTable"); IEnumerable Rows = ds.Tables[0].AsEnumerable().Where(r => r.Field("ParentId")==null);这两行之间没有代码,相信我的数据集包含 10 行,其中两行在 parentid 列中为空。即使我不知道问题是什么,也厌倦了这样做。
【解决方案2】:
var rowsWithoutParent = dt.AsEnumerable().Where(r => r["ParentId"] == null);

var rowsWithParent = dt.AsEnumerable().Where(r => r["ParentId"] != null);

【讨论】:

  • 正在统计所有行,如何只统计null
  • 这个答案指导我在从 csv 文件读取时检查列值是否为空。对我来说就像 - data.AsEnumerable().Where(r =&gt; r["SHORT_CODE"].ToString() == "").Any();
【解决方案3】:
var rows = ds.Tables[0].AsEnumerable()
    .Where(r => r.IsNull("ParentId"));

【讨论】:

    【解决方案4】:

    检查

    ds.Tables.Count
    

    然后

    ds.Tables[0].Rows.Count
    

    【讨论】:

      【解决方案5】:

      您可以像这样访问项目:

       String value = ds.Tables[0].Rows[RowNum][ColNum].ToString();
      

      【讨论】:

        【解决方案6】:

        为我工作:

           DataTable newDt = dt.AsEnumerable().Where(r => r["column name"] == DBNull.Value).CopyToDataTable();
        

        如果等于null 则无效,因为返回DBNull

        【讨论】:

        • 虽然这段代码可能会回答这个问题,但好的答案应该始终包含对代码的解释。
        猜你喜欢
        • 2012-01-29
        • 1970-01-01
        • 2011-11-04
        • 1970-01-01
        • 2021-05-16
        • 2023-03-29
        • 2017-05-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多