2012-08-09 74 views
2

我使用一个SqlDataReader按行添加一行到一个DataTable类似如下:如何避免增加重复的行到一个DataTable

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

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

我已经研究过创建对象[] s的哈希集,然后将它们一次添加到数据表的最后,但我忘记默认对象IEqualityComparer只比较引用。

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

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

编辑: 我从数据库拆分不同的行到代码中的单独的数据表。来自查询结果的每一行都是不同,但每行的部分都不是。不幸的是,我需要完成我的问题所要求的,因为查询的结果已经不同。

+2

为什么不让数据库照顾它呢? – Gorgsenegger 2012-08-09 19:54:44

+0

@Gorgsenegger:我正在处理一个连接多个表的查询,并处理与公共因子相关的每个结果块。有些行包含一些表中的重复项,但每行实际上是不同的。 – Jared275 2012-08-09 19:57:44

+1

使用SQL'DISTINCT'或'GROUP BY'来保证不同的行 – PinnyM 2012-08-09 19:58:18

回答

3

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

如果你需要一列是唯一的,然后在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); 

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

+0

感谢您解决我的实际问题。我所做的绝对是一种解决方法,但在与几个人交谈之后,似乎有必要。我正在尝试你的答案,看看它是否有效。 – Jared275 2012-08-09 20:58:34

+0

@ GrayGox374:有没有更好的方法将表中的所有数据列传递给UniqueConstraint的构造函数?我有类似90列的东西,我需要指定... – Jared275 2012-08-10 15:29:35

+0

???整个90列都需要独一无二?我从来没有见过这样的事情。你如何在数据库中执行该操作? – GrayFox374 2012-08-10 16:59:29

1

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

+0

我正在处理的查询是来自多个表的连接查询。我把结果分解成它们原来属于表的数据表示。因此,每一行都是不同的,但是该行内有重复的部分,我需要避免将其添加到其各自的数据表中。 – Jared275 2012-08-09 20:45:21