2010-09-06 51 views
1

我有這種情況:我必須創建一個從另一個數據集中獲取所有數據的數據集。在某些情況下,我必須從每個新數據集中刪除一些行。當兩個foreach循環結束時,兩個數據集都是空的,即使只完成第一個,第一個數據集也有一些行。從C#中的數據集中刪除行的問題

任何想法爲什麼,...或告訴我的代碼錯了。

Thnx提前。

//Dataset comes as a parameter.  
DataSet dsFirst = ds; 
DataSet dsSecond = ds; 

foreach (DataRow dr in dsFirst.Tables[0].Select()) 
{ 
    int i = Convert.ToInt32(dr["ROWNUMBER"]); 
    //merren vetem veprimet ATM qe jane bere para CoB 
    if (i > x && i < y) 
     dr.Delete(); 
    else 
     dr["NOVATRANSAKCIJA"] = 0;//eshte derguar njehere, per rrjedhoje nuk do te dergohet sms 
} 
dsFirst.AcceptChanges(); 

foreach (DataRow dr1 in dsSecond.Tables[0].Select()) 
{ 
    int i = Convert.ToInt32(dr1["ROWNUMBER"]); 
    //merren veprimet e sistemit dhe veprimet ATM te bera gjate CoB 
    if (i < x || i > y) 
     dr1.Delete(); 
    else 
     dr1["NOVATRANSAKCIJA"] = 1;//nuk eshte derguar asnjehere, per rrjedhoje do te dergohet sms 

} 
dsSecond.AcceptChanges(); 

回答

1

你只需要一個數據集(從您的代碼):

DataSet dsFirst = ds; 
DataSet dsSecond = ds; 

複製引用不復制數據 - 它只是一個參考相同數據集。所以你只需刪除所有的數據。您可能會看到Clone()方法(但請注意,複製結構,但不是數據)。

1

由於您的代碼現在是dsFirstdsSecond不是原始數據集的副本,而是「指向」相同的數據集!

要複製的數據集,並刪除在旅途中的行,我會做到以下幾點:

foreach (DataRow dr in ds.Tables[0].Rows) 
{ 
    int i = Convert.ToInt32(dr["ROWNUMBER"]); 
    if (i <= x || i >= y) 
     dsFirst.Tables[0].ImportRow(row); 
} 

dsFirst必須是數據集一個表完全一樣的列ds。這隻會將那些符合而不是的條件被刪除的條件的行導入dsFirst

您或許可以使用ds.Clone()創建一個ds的副本,其中包含相應的表格和列定義,但我還沒有嘗試過。使用類型化數據集可爲您節省大量工作,因爲您可以根據需要創建任意數量的實例,並且已經定義了所有表和列。

3

正如Marc已經指出的那樣,您正在使用引用類型值,因此您實際上使用ds,dsFirst和dsSecond指向相同的數據集。您必須複製數據集才能實現您想要執行的操作。

嘗試

dsFirst = ds.Copy(); 
dsSecond = ds.Copy(); 

代替,這將克隆的結構和複製數據。