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é.
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
Hmm, avez-vous essayé d'ajouter targetDs.AcceptChanges() avant la méthode targetAdapter.Update()? – code4life
Oui, cela n'a pas fonctionné non plus. – Craig