2010-04-19 98 views
2

我想同步两个数据库之间的两个表。我认为最好的方法是使用DataTable.Merge方法。这似乎可以看到变化,但没有任何事情会被提交到数据库。如何同步两个数据表并更新数据库中的目标?

到目前为止,我有:

string tableName = "[Table_1]"; 
     string sql = "select * from " + tableName; 

     using (SqlConnection sourceConn = new SqlConnection(ConfigurationManager.ConnectionStrings["source"].ConnectionString)) 
     { 
      SqlDataAdapter sourceAdapter = new SqlDataAdapter(); 

      sourceAdapter.SelectCommand = new SqlCommand(sql, sourceConn); 
      sourceConn.Open(); 
      DataSet sourceDs = new DataSet(); 
      sourceAdapter.Fill(sourceDs); 

      using (SqlConnection targetConn = new SqlConnection(ConfigurationManager.ConnectionStrings["target"].ConnectionString)) 
      { 
       SqlDataAdapter targetAdapter = new SqlDataAdapter(); 

       targetAdapter.SelectCommand = new SqlCommand(sql, targetConn); 

       SqlCommandBuilder builder = new SqlCommandBuilder(targetAdapter); 

       targetAdapter.InsertCommand = builder.GetInsertCommand(); 
       targetAdapter.UpdateCommand = builder.GetUpdateCommand(); 
       targetAdapter.DeleteCommand = builder.GetDeleteCommand(); 

       targetConn.Open(); 
       DataSet targetDs = new DataSet(); 
       targetAdapter.Fill(targetDs); 

       targetDs.Tables[0].TableName = tableName; 
       sourceDs.Tables[0].TableName = tableName; 
       targetDs.Tables[0].Merge(sourceDs.Tables[0]); 

       targetAdapter.Update(targetDs.Tables[0]); 
      } 

     } 

目前,存在这样是不是在目标的源一行。此行从不转移。我也尝试了一个空目标,没有任何东西被转移。

+0

手表[0]显示正确的数据,但它不会被发送到数据库中。 我不确定InsertCommand等,行,但没有我在那里,命令为空。 – Craig 2010-04-19 13:42:44

+0

嗯,你有没有尝试在targetAdapter.Update()方法之前添加targetDs.AcceptChanges()? – code4life 2010-04-20 02:30:11

+0

是的,这也没有工作。 – Craig 2010-04-20 13:32:27

回答

0

我知道这不是直接回答你的问题,而是你看了看Microsoft Sync Framework

它的目的是做这种事情,并为你做大部分(如果不是全部)驴工作。

+0

我正在看那个。从我所能看到的来看,它并不轻巧! – Craig 2010-04-19 15:15:37

+0

@克雷格 - 我不是故意暗示它适合所有情况,但有600个表来同步它可能比手动更好。 – ChrisF 2010-04-19 19:22:05