2010-04-19 2 views
2

J'essaye de synchroniser deux tables entre deux bases de données. Je pensais que la meilleure façon de le faire serait d'utiliser la méthode DataTable.Merge. Cela semble prendre en compte les changements, mais rien ne s'implique jamais dans la base de données.Comment puis-je synchroniser deux datatables et mettre à jour la cible dans la base de données?

Jusqu'à présent, j'ai:

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]); 
      } 

     } 

À l'heure actuelle, il y a une ligne de la source qui ne sont pas dans la cible. Cette rangée n'est jamais transférée. Je l'ai aussi essayé avec une cible vide, et rien n'est transféré.

+0

Une montre sur targetDs.Tables [0] montre les données correctes, mais il est pas envoyé à la base de données. Je n'étais pas sûr des lignes InsertCommand, etc, mais sans ce que j'ai là, les commandes sont nulles. – Craig

+0

Hmm, avez-vous essayé d'ajouter targetDs.AcceptChanges() avant la méthode targetAdapter.Update()? – code4life

+0

Oui, cela n'a pas fonctionné non plus. – Craig

Répondre

0

Je sais que ce n'est pas directement répondre à votre question, mais avez-vous regardé le Microsoft Sync Framework?

Il est conçu pour faire ce genre de chose et fait la plupart (sinon la totalité) de l'âne travailler pour vous.

+0

Je suis en train de regarder ça maintenant. Ce n'est pas exacly léger de ce que je peux voir! – Craig

+0

@Craig - Je ne voulais pas suggérer que ce serait approprié pour toutes les situations, mais avec 600 tables pour synchroniser cela pourrait être un meilleur pari que de le faire manuellement. – ChrisF

Questions connexes