【问题标题】:How to avoid adding duplicate rows to a datatable如何避免向数据表中添加重复行
【发布时间】:2012-08-07 02:58:24
【问题描述】:

我正在使用 SqlDataReader 将逐行添加到数据表中,如下所示:

while (reader.Read())
{
    dataTable.LoadDataRow(reader.CurrentRow(), LoadOption.PreserveChanges);
}

这可行,但我需要能够避免向数据表添加重复的行。我希望能够使用 dataTable 中的 Contains 或 Find 方法,但是我找不到将 reader.CurrentRow() 中的 object[] 转换为 DataRow 以进行比较而不将其添加到数据表的方法。

我已经研究过制作 object[]s 的哈希集,然后在最后一次将它们全部添加到数据表中的选项,但我忘记了默认对象 IEqualityComparer 仅比较引用。

有没有一种可行的方法可以做到这一点,而无需在最后删除重复项?

如果删除重复项是唯一的方法,那么最好的方法是什么?

编辑: 我将数据库中的不同行拆分为代码中的单独数据表。查询结果中的每一行不同的,但每一行的部分不是。不幸的是,我需要完全按照我的问题来做,因为查询的结果已经不同了。

【问题讨论】:

  • 为什么不让数据库来处理呢?
  • @Gorgsenegger:我正在处理一个连接多个表的查询,并处理与一个共同因素相关的每个结果块。有几行包含来自某些表的重复项,但每一行实际上是不同的。
  • 使用 SQL DISTINCTGROUP BY 保证不同的行

标签: c# datatable sqldatareader


【解决方案1】:

最简单的方法是真正确保根本没有重复的行 - 如果您正在查询关系数据库,请使用 DISTINCT - 这将只返回唯一的行。

【讨论】:

  • 我正在处理的查询是来自多个表的连接查询。我将结果分解回它们最初所属的表的数据表表示形式。所以每一行都是不同的,但是该行中有重复的部分,我需要避免添加到它们各自的数据表中。
【解决方案2】:

你没有提供很多细节,但我希望这是全面的。

如果您需要单个列是唯一的,那么在数据表的 Columns 集合中,像这样指定列:

 DataTable appeals = new DataTable("Appeals");
 appeals.Columns["PriorAppealNumber"].Unique = true;
 DataColumn keyField = new DataColumn("AppealNumber", typeof(string));
 appeals.Columns.Add(keyField);

如果唯一性需要跨越多行,方法如下:

 var myUniqueConstraint = new UniqueConstraint( new DataColumn[] {appeals.Columns[0], appeals.Columns[1], appeals.Columns[2]} );
 appeals.Constraints.Add(myUniqueConstraint);

这将在您尝试提交回源数据库之前强制执行约束。

【讨论】:

  • 感谢您解决我的实际问题。我正在做的绝对是一种解决方法,但是在与几个人交谈之后,它似乎是必要的。我现在正在尝试您的答案,看看它是否有效。
  • @GrayGox374:有没有更好的方法将表中的所有数据列传递给 UniqueConstraint 的构造函数?我有大约 90 列需要指定...
  • ???在 90 列中,所有内容都需要独一无二吗?我从来没有见过这样的事情。你如何在数据库中强制执行?
  • 创建 UniqueConstraints 确实奏效了。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-23
  • 1970-01-01
相关资源
最近更新 更多