内存中有两个数据表,表一来自SQL数据库查询,表二是从客户端提交的XML转换来的,表结构不一样,现在想用表二的值来更新表一中对应ID的记录中字段名相同的值。表一:
id,tname,tcount,tnote
1   1        1    1
2   2        2    2
3   3        3    3表二:
id,tname,tt,tnote,pk
1   1     1   a   b
3   3     c   c   c
4   4     4   4   4要把表一更新为:
id,tname,tcount,tnote
1   1        1    a
3   3        3    c
4   4       null  4说明:
记录3删除了
增加了记录4
共有的字段数据更新成了表二的值
新增的记录因为缺少对应项,所以tcount字段是空的表一中有的字段,按ID对应更新成了表二的值~
表一中有的ID表二没有的记录从表一中删除
表一中没有的ID而表二又有的,增加到表一里问:什么方式来实现会最快~

解决方案 »

  1.   

    只能老老实实的表结构读出来, 之后把xml对比表结构,一条一条操作吧.
      

  2.   

    那如果不算ID,的情况下
    表一有 X 条记录 Y 个字段
    表二有 M 条记录 N 个字段需要比较 X*Y*N+M*M*X 这么多次吧~可能还更多,有没有办法可以减少运算呢~
      

  3.   

    我先是生成一个新的数据表,三个字段:f_name,f_index1,f_index2f_name 记录这两个数据表都包含的 字段名称;
    f_index1 记录这个字段在第一个数据表的索引;
    f_index1 记录这个字段在第二个数据库的索引。生成这个表的好处是,更新值的时候不需要遍历所有字段了,只需要按照已经记录在案的索引来操作即可。因为我最终需要的是表一,所以这个表是这样得到的:
    用了两个嵌套的循环,外循环是表一的栏位遍历,内循环是表二的栏位遍历
    遍历表一的所有栏位,拿栏位名称与表二的所有栏位名称做对比,比较之前都先转换成了大写~
    遇到栏位名称相同的,就记录下来。为了较少比较的次数,此时还专门用BREAK退出了内循环~本来,我觉得已经登记过的索引应该在以后的比较中忽略掉,但是忽略也需要先做比较,
    这样看来好像并不能减少比较次数,所以就放弃了~得到这个【相同字段对应表】之后,再根据表一和表二的对应关系,先比较表一的记录在表二中是否存在,存在的话,就用表二的记录来更新表一的记录,如果不存在,就从表一中删除。然后比较表二的记录 ID 在表一中是否之前就存在,存在的话,因为之前已经更新过了,所以忽略,不存在的话,就把相同字段的值组成的新行添加到表一。之所以要先 删除 后 添加 ,是为了第二次比较的时候待比较的行会少一些。另外,行更新之前,也可以做一次值的比较,因为两个表都有的 ID 值的那些行,有可能对应字段的值也是相同的,这种情况下,可以不需要用表二的值来更新表一的值,这样的好处是,表一的行状态可以保持为 Unchanged 。这样如果需要用表一来更新数据库,则有可能大大减少发往数据库的命令。关于这一点,我还没有做实验,暂时只是猜测。我还没有搞清楚如果用同样的值来修改行,会不会改变行状态,更不知道,如果多次被修改成另外的值的记录,在提交之前再被修改回来的话,更新数据库的时候会不会忽略它。这里说的再次被修改回来是指 【RejectChanges】 以外的方法,因为【RejectChanges】的话,行状态是会重置为 Unchanged 的~这个,我明天试验一下~
      

  4.   

    俺搞定了这个问题~
    用数据表dt_1来更新数据表dt_2 其他参数用来指定主键名称或者主键的索引datable_update(DataTable dt1,DataTable dt2,string keyname)
    datable_update(DataTable dt1,string dt1_keyname,DataTable dt2,string dt2_keyname)
    datable_update(DataTable dt1,Int32 dt1_key_index,DataTable dt2,Int32 dt2_key_index)思路在 9 楼~坐等更好的法子~