如何在DataTable中检查IS NULL?

3

在我的情况下,我正在传递一个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 而不是 blank 值。 - Nilesh Thakkar
6个回答

13

使用强类型的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} = {"指定的转换无效。"}。当我写入字符串而不是int时,它显示 - {在泛型类型或方法'System.Nullable <T>中使用它作为参数'T'必须是非可空值类型 'string'类型}。我不熟悉Linq。 - Mogli
@Anand;那么DataColumn的类型应该是字符串而不是整数(就像我所假设的那样)。你必须使用.Where(r => r.Field<string>("ParentId")==null) - Tim Schmelter
现在它显示- {Empty = "枚举未产生结果"}...为什么?:( - Mogli
DataSet ds = GetDataSet("Select ProductId,ProductName,ParentId from ProductTable"); IEnumerable<DataRow> Rows = ds.Tables[0].AsEnumerable().Where(r => r.Field<string>("ParentId")==null); 这两行之间没有任何代码,相信我数据集包含10行,其中两行的parentid列为null。我不知道问题出在哪里,已经做了很多尝试。 - Mogli
你能帮我解决这个问题吗?http://stackoverflow.com/questions/15631203/how-to-create-a-simple-diagram-in-c-net - Mogli
显示剩余3条评论

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

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

它正在计算所有行,如何仅计算空行? - Mogli
这个答案指导我在从CSV文件读取时检查列值是否为空。对我来说,它的表达方式是这样的- data.AsEnumerable().Where(r => r["SHORT_CODE"].ToString() == "").Any(); - quasar

3
var rows = ds.Tables[0].AsEnumerable()
    .Where(r => r.IsNull("ParentId"));

0

为我工作:

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

如果等于null是不起作用的,因为它会返回DBNull


3
尽管这段代码可能回答了问题,但一个好的答案应该始终包含对代码的解释。 - BDL

-1

检查

ds.Tables.Count

然后

ds.Tables[0].Rows.Count

-1

您可以像这样访问项目:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接