我遇到这种情况:我必须创建一个从另一个数据集中获取所有数据的数据集。在某些情况下,我必须从每个新数据集中删除一些行。当两个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();
答案 0 :(得分:3)
正如Marc已经指出你在这里使用引用类型值,所以你实际上用ds,dsFirst和dsSecond指向同一个数据集。您必须复制数据集才能实现您想要的目标。
试
dsFirst = ds.Copy();
dsSecond = ds.Copy();
而是,它将克隆结构并复制数据。
答案 1 :(得分:1)
您只有一个数据集(来自您的代码):
DataSet dsFirst = ds;
DataSet dsSecond = ds;
复制引用不会克隆数据 - 它只是对相同数据集的另一个引用。所以你只需删除所有数据。您可以查看Clone()
方法(但请注意,复制结构,而不是数据)。
答案 2 :(得分:1)
正如您的代码现在,dsFirst
和dsSecond
不是原始数据集的副本,而是“指向”同一数据集!
要复制数据集并随时删除行,我会执行以下操作:
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()
副本,但我还没有尝试过。使用类型化数据集可以为您节省大量工作,因为您可以根据需要创建任意数量的实例,并且已经定义了所有表和列。