在C#中从数据集中删除行时出现问题

时间:2010-09-06 07:40:06

标签: c# dataset rows

我遇到这种情况:我必须创建一个从另一个数据集中获取所有数据的数据集。在某些情况下,我必须从每个新数据集中删除一些行。当两个foreach循环都完成时,两个数据集都是空的,即使只完成第一个数据集,第一个数据集也有一些行。

知道为什么,......或者告诉我代码的错误。

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();

3 个答案:

答案 0 :(得分:3)

正如Marc已经指出你在这里使用引用类型值,所以你实际上用ds,dsFirst和dsSecond指向同一个数据集。您必须复制数据集才能实现您想要的目标。

dsFirst = ds.Copy(); 
dsSecond = ds.Copy();
而是,它将克隆结构并复制数据。

答案 1 :(得分:1)

您只有一个数据集(来自您的代码):

DataSet dsFirst = ds;
DataSet dsSecond = ds;

复制引用不会克隆数据 - 它只是对相同数据集的另一个引用。所以你只需删除所有数据。您可以查看Clone()方法(但请注意,复制结构,而不是数据)。

答案 2 :(得分: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列完全相同。这会将那些行只导入符合 not 被删除条件的dsFirst

您可以使用ds创建包含相应表格和列定义的ds.Clone()副本,但我还没有尝试过。使用类型化数据集可以为您节省大量工作,因为您可以根据需要创建任意数量的实例,并且已经定义了所有表和列。