我方案中有2个数据库分在两地,数据表的结构一样。两地用户分别对两个数据库进行管理。
现在一个用户将数据修改之后,需要将数据文件导出,第二个用户将数据合并进来。
--------------------------
导出数据时我将数据集dataTable进行序列化,然后保存。
----------
导入步骤:
先将文件反序列化为 dataTable,取名Source,然后第2个用户将数据也读出成为datatable
string sql="select * from planeTable";
生成一个数据集合 Target,两个数据集合并的原则是:
1)如果Source 中有数据行是 Target中所没有的,则新增;
2)如果Source有数据行是Target也有的(主健相同),则用Source更新Target数据行。----------------------------------------
想来想去,我认为最简单的方法是用Merge,调用这个方法对两个数据集进行合并,然后再更新到数据库。但是程序运行时无错误,数据集却没有更新!!!!

解决方案 »

  1.   

    可通过web services、WCF实现数据同步。
    Merge方法是将两个结构相似的datatable合并成一个datatable: 
    DataTable dt1 = new DataTable(); 
    dt1.Columns.Add("id"); 
    dt1.Columns.Add("name"); 
    dt1.Columns.Add("pwd"); 
    for (int i = 0; i < 5; i++) 

    dt1.Rows.Add(new object[] { i.ToString(), "name" + i.ToString(), "" }); 

    DataTable dt2 = new DataTable(); 
    dt2.Columns.Add("id"); 
    dt2.Columns.Add("name"); 
    dt2.Columns.Add("pwd"); 
    for (int i = 5; i < 10; i++) 

    dt1.Rows.Add(new object[] { i.ToString(), "name" + i.ToString(), "" }); 

    DataTable dt3 = null; 
    dt3 = dt1.Clone(); 
    if (dt3 != null) 

    dt3.Merge(dt1); 
    dt3.Merge(dt2); 
      

  2.   

    可以通过一个SQL语句来实现,
    insert into opendatasource('SQLOLEDB','Data Source=IP地址;User ID=sa;Password=').库名.dbo.test
    select * from opendatasource('SQLOLEDB','Data Source=IP地址;User ID=sa;Password=').库名.dbo.producth
    where 条件
      

  3.   

    谢谢楼上2位!我的数据集可以合并了。可是为什么提交不到数据库里?因为这两地之间电脑没有联网(保密需要),所以不能使用webservice之类的技术。
    我现在的代码可以看到合并后的数据集,可是提交不到数据库中
        {......
     Database util = new Database();
     SqlDataAdapter ada = new SqlDataAdapter();
    ada.SelectCommand = new SqlCommand("select * from Produce_PlaneRepair",Database.getConnection()); DataTable tb = new DataTable("plane");
     ada.Fill(tb);
      
    this.dataGridView2.DataSource = tb;
      DataTable dtTemp = new DataTable("plane");dtTemp = (DataTable)AcceptDataList[11];//用接收到的数据集tb.Merge(dtTemp);
     tb.AcceptChanges();
     ada.Update(tb);
            
    this.dataGridView3.DataSource = tb;-------我可以在dataGridView3中看到合并的数据,但是数据库中没有数据
      

  4.   


    我不太喜欢程序员动不动说“最简单的.......”,如果有bug,简单有什么用?这个东西最多用1天写就,如果3天还不能非常可靠地完成(以致可以忘记它),那就应该删除了源代码重新设计。我从来不使用DataSet、DataTable。假设使用DataTable,我肯定不会使用Merge。DataTable只能用于传输数据,真正的合并(查找、判断、插入、删除、替换,等)还是要用数据库来完成。
      

  5.   

    谢谢sp1234的见解!我其实也一直不喜欢用daatable去更新数据库,给我的感觉是不可靠。而且今天上午再三测试Merge方法,发现这个方法可以合并数据集,但是却不能将合并后的数据集合更新到数据库中,原因也许是:merge做的行集的状态均为Unchanged,导致数据集无法更新我也想用后台数据库的方式更新。现在从外地传过来的数据,我是用文件方式传输的,将外地数据导出成数据集(DATAtable),然后序列化为dat文件。因为外地机和本地机之间没有网络(保密要求)。我要将这个外地DATAtable 用后台的方式导入到我的数据库中,我想到的方法有:
    1)在本地机创建一个临时表,用来存放该DATAtable,还是需要用dataAdapter方式将该datatable导入到临时表中。
    2)在本地数据库中,对临时表与本机数据库的数据进行每行的比较,如果本地机没有数据则添加,如果有则更新。
    这样的方法我感觉也很麻烦,性能如何很难说。
      

  6.   

    楼上的,我也是不用DataSet、DataTable,
    但我只是觉得这样来的不明不白的,不如我一行一行读灵活,更深的理解没了,
    还有什么原因不用DataSet、DataTable吗
      

  7.   

    说了半天有文件呀,
    程序读文件,导入数据库临时表,再用我的SQL很简单搞定
    记住,要有一个关键字字段是永远不能变化的,用这个做索引添加
    这个我做ERP时做过
    各分公司的表有一字段是分公司表的ID,和分公司ID
    我那个SQL条件是 
    where 公司ID=?and 分公司表ID not in (select 分公司表ID from 总表 where 公司ID=? group by 分公司表ID)
      

  8.   

    两个表比较时,增加比较好写。
    我写的时
    insert into 本地表
    select * from 临时表 where 主键 not in (select 主键 from 本地表)但是更新语句呢?我一个表有60多个字段,总不好一个字段一个字段update  本地表 set 字段1=
      

  9.   

    怎么还有更新,就是有新数据就更新那这样

    delect 本地表 where 主键 in (select 主键 from 临时表)

    insert into 本地表 select * from 临时表