日期:2014-05-17  浏览次数:20726 次

再次询问关于两个DataTable数据过滤的问题
之前发了个贴,因为怕问题太复杂就简单表达了下,但发现跟实际的遇到的问题有很大出入,所以再次向大家求助下。。
个人表达能力不是很好,麻烦各位有心的朋友可以看清楚我的问题,谢谢了!

我有两个数据结构一样的两个DataTable(dt1、dt2),dt1有49000多条数据,dt2有47000多条数据,现在想将dt1和dt2做比较,把新的数据都存入dt2的数据库,更新过的数据更新,已删除的数据删除。

因两个DataTable数据来源于不同数据库,数据库结构有不一样(更新、删除dt2数据库的数据需要id,但dt1数据库没有id,DataTable的id列数据为空)。

我写了个方法来判断,方法如下:
C# code

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分钟为什么相差这么大?

------解决方案--------------------
更新、删除dt2数据库的数据需要id,但dt1数据库没有id,DataTable的id列数据为空 
你不是说两个DataTable数据结构相同么?
------解决方案--------------------
这两个表必须有相同的东西才可以,必须具有可比性,比如那些共同的字段,这些共同字段名称可能不同,但是含义是一样的。
剩下的问题就简单了。
其实你可以在dt1中增加个标记字段,T或F,比较过程中做标记,做过标记的直接删除即可
------解决方案--------------------
我在想,你每个对比的过程,还不如用同步的概念比较好一点,总有一个数据库的记录是最新的,那么直接将最新的所有记录同步到要更新的数据库中去,而不去对比,利用Bcp导入应该是很快的