如何检查空的DataTable

51

我有一个DataSet,我需要使用以下代码找出有多少行已被更改:

dataTable1 = dataSet1.Tables["FooTable"].GetChanges();

foreach (DataRow dr in dataTable1)
{
  // ...
}

DataSetDataSet.HasRow方法,但DataTable没有此类方法。如果没有更改的行,则changedDT1将为null值,导致循环抛出异常。

我该如何检查DataTable是否为空?我尝试使用Rows.Count - 但它不起作用...

9个回答

72

首先确保 DataTable 不为 null,然后检查行数

if(dt!=null)
{
  if(dt.Rows.Count>0)
  {
    //do your code 
  }
}

2
如果没有行,foreach循环会直接跳过,所以你不需要检查行数。 - Ben Robinson
@Ben,那是我的最初问题-当没有行时,循环会抛出异常,因为循环的内容为空。 - KMC
@KMC 关键不在于循环没有抛出异常是因为没有行,而是变量为空,它不存在,你无法向其中添加行,它永远不可能有任何行,也无法进行循环遍历,它是空的。如果它不是空的但是没有行,则循环不会抛出异常。 - Ben Robinson
1
数据表格不能为null,但仍可能不包含任何行。这个解决方案更完整,因为它同时检查了两者。 - Diomedes
1
一个foreach循环不会遍历空集合,显式检查它是否为空也是多余的。 - Ben Robinson

50
如果dataTable1为null,则它不是一个空的datatable。
只需在foreach语句外部加上if语句,检查dataTable1是否为null。 确保您的foreach循环计数器遍历DataTable1.Rows,否则会出现编译错误。
    if (dataTable1 != null)
    {
       foreach (DataRow dr in dataTable1.Rows)
       {
          // ...
       }
    }

您忘记了放置dataTable1.Rows。如果不这样做,将会出现编译错误。请纠正。 - Willy

25

通常使用SQL查询数据库并用其结果填充数据表时,它永远不会是空数据表。即使返回0条记录,您也可以将列标题填充为列信息。当试图处理具有0条记录但具有列信息的数据表时,将引发异常。在处理数据表之前,可以像这样检查数据表。

if (DetailTable != null && DetailTable.Rows.Count>0)

如果您在数据绑定到 GridView 时返回了 0 条记录但获取了列标题,则不会抛出异常,因为 EmptyDataTemplate 应用于 GridView 控件。在这种情况下,仅检查是否为空即可。 - user1431356
这是最优雅的解决方案。 - Max Alexander Hanna

15

不要使用rows.Count。那是在询问有多少行存在。如果有很多,计数会花费一些时间。你真正想知道的只是“是否至少有一个?”你不在乎是否有10个、1000个或十亿个。你只想知道是否至少有一个。如果我给你一个盒子,问你里面是否有弹珠,你会把盒子倒在桌子上并开始数吗?当然不是。使用LINQ,你可能认为这样可以:

bool hasRows = dataTable1.Rows.Any()

但不幸的是,DataRowCollection 没有实现 IEnumerable 接口。 因此,请尝试以下方法:

bool hasRows = dataTable1.Rows.GetEnumerator().MoveNext()

当然,你需要首先检查dataTable1是否为空。如果不是空的,这将告诉你是否有任何行而不枚举整个数据表。


你当然需要首先检查dataTable1是否为空。如果不是空的,这将告诉你是否有任何行而不枚举整个数据表。

5
您也可以简单地编写:

 if (dt.Rows.Count == 0)
     {
         //DataTable does not contain records
     }        

2
但如果数据库为空,这将抛出异常。 - devlin carnate
是的,你说得对。因此,你总是需要检查datable是否为NULL。 - RSB

5

这个问题很老了,但是因为这可能会对许多C#程序员有所帮助,现在有一种简单的解决方法,如下:

if ((dataTableName?.Rows?.Count ?? 0) > 0)

4

从MSDN获取GetChanges的信息:

DataTable的过滤副本,可以对其执行操作,稍后使用Merge将其合并回DataTable。如果未找到所需的DataRowState行,则该方法返回空值(null)

dataTable1为空,因此在迭代之前请先检查。


1
Sub Check_DT_ForNull()
Debug.Print WS_FE.ListObjects.Item(1).DataBodyRange.Item(1).Value
If Not WS_FE.ListObjects.Item(1).DataBodyRange.Item(1).Value = "" Then
   Debug.Print WS_FE.ListObjects.Item(1).DataBodyRange.Rows.Count
End If
End Sub

这将检查DataBodyRange中第一行的值是否为Null并计算总行数。对我来说,这很有效,因为我从服务器下载我的数据表时,它没有数据,但是表格已经创建了空白行,而Rows.Count不为0,而是空白行。


-1
bool empty = !DataTableExtensions.AsEnumerable(DataTableToCheck).Any()

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