2012-08-09 75 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