之前发了个贴,因为怕问题太复杂就简单表达了下,但发现跟实际的遇到的问题有很大出入,所以再次向大家求助下。。
个人表达能力不是很好,麻烦各位有心的朋友可以看清楚我的问题,谢谢了!
我有两个数据结构一样的两个DataTable(dt1、dt2),dt1有49000多条数据,dt2有47000多条数据,现在想将dt1和dt2做比较,把新的数据都存入dt2的数据库,更新过的数据更新,已删除的数据删除。
因两个DataTable数据来源于不同数据库,数据库结构有不一样(更新、删除dt2数据库的数据需要id,但dt1数据库没有id,DataTable的id列数据为空)。
我写了个方法来判断,方法如下:
foreach (DataRow dr1 in dt1.Rows)
{
foreach (DataRow dr2 in dt2.Rows)
{
if (dr1["No"].ToString() == dr2["No"].ToString())//数据编号,不是id值
{
//判断其它列数据是否一样
if (相同)
dr1.Delete();
else
dr1["id"] = dr2["id"];//id用更新dt2数据库
dr2.Delete();
dr2.AcceptChanges();//这里有点问题
break;
}
}
}
dt1.AcceptChanges();
以上方法简略了一下,但实际运行没问题的。
奇怪的是,要是2个DataTable数据都来源于Access数据库,一个新的,一个旧的,对比耗时10秒就完成了,但要是两个数据库一个是Access,另外一个是MySql,对比耗时就需要3~5分钟(因项目需要,新的数据来源于Access数据库,而需要用的数据即旧数据存放在MySql)。
另外一个奇怪的是,dr2.AcceptChanges();这里,要是我直接利用OleDbDataAdapter da = new OleDbDataAdapter();da.Fill(dt2)这样生成dt2的时候,dr2删除后是要调用AcceptChanges()来确认删除的,不调用会报错,但要是我是通过其他方法获取数据,然后逐条dt2.Rows.Add(dr)插入,就不需调用AcceptChanges()来删除dr2了,调用还会报错:不存在改行,不是dr2.Delete()只是标记删除吗?会什么就直接删除了?两种创建DataTable方法有什么不同??
麻烦大家帮帮忙,主要是两个DataTable数据过滤耗时问题,请问如果可以做得快速点?耗时10秒跟耗时3~5分钟为什么相差这么大?