2

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

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

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

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

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

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

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

4

2 回答 2

3

You didn't provide a ton of detail, but I hope this is comprehensive.

If you need a single column to be unique, then in your Columns collection in your datatable, specify the column like this:

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

If the uniqueness needs to span multiple rows, this is the method:

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

That will enforce the constraints BEFORE you try to commit back to the source database.

于 2012-08-09T20:30:53.967 回答
1

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

于 2012-08-09T20:20:13.053 回答