2015-03-25 3 views
0

Existe-t-il un moyen de remplacer les valeurs dans la fusion de DataTables à l'aide de la méthode .Merge()? Par exemple, si j'ai deux DataTables avec les mêmes schémas. Par exemple:Comment remplacer les valeurs dans la fusion de DataTables à l'aide de la méthode .Merge()?

deux ont deux colonnes: Names | Enabled;

DataTable1 premières entrées de ligne sont: Peter Punani | true;

DataTable2 premières entrées de ligne sont: Peter Punani | false;

Si je les fusionner en utilisant la méthode .Merge() - DataTable1.merge(DataTable2); -, DataTable1 aura alors 2 lignes et ressemblera à ceci:

Names | Enabled; 
Peter Punani | true; 
Peter Punani | false; 

Maintenant, évidemment, si j'essaie de .Update() qu'en utilisant SqlCommandBuilder pour ma base de données SQL, il me donnera une instruction d'erreur, à cause de deux valeurs identiques dans ma clé primaire (Names).

Mais je veux DB1 accepter les différences de DB2, il ressemblerait à ceci: (et le faire avec toutes les autres entrées qui diffèrent de DB1.) Donc,

Names | Enabled; 
Peter Punani | false; 

quelle est la meilleure façon de fusionner ces tableaux, donc je peux les mettre à jour correctement?

Répondre

0

Je viens mis en œuvre ma méthode de cette façon maintenant:

public static bool synchSqlData(DataTable UpdateTable, string selectedTableName, SqlConnection sqlCon, DataTable MergeTable, bool merge) 
    { 
     bool success = false; 
     //Mitgabe eines SELECT cmds für SqlCommandBuilder zum generieren von INSERT,DELETE und UPDATE 
     using (SqlCommand sqlCom = new SqlCommand("SELECT * FROM dbo." + selectedTableName, sqlCon)) 
     { 
      SqlDataAdapter da = new SqlDataAdapter(sqlCom); 
      SqlCommandBuilder cmb = new SqlCommandBuilder(da); 

      da.InsertCommand = cmb.GetInsertCommand(); 
      da.DeleteCommand = cmb.GetDeleteCommand(); 
      da.UpdateCommand = cmb.GetUpdateCommand(); 

      //Zuweisen von PKs 
      UpdateTable.PrimaryKey = new DataColumn[] { UpdateTable.Columns[0] }; 
      MergeTable.PrimaryKey = new DataColumn[] { MergeTable.Columns[0] }; 

      //Zusammenführen der beiden DataTables in UpdateTable 
      if (merge) 
      { 
       //Setzen der Rows auf changed damit sie bei da.Update() auch erkannt werden ;) 
       foreach (DataRow dr in MergeTable.Rows) 
       { 
        if (dr.RowState == DataRowState.Unchanged) 
        { 
         dr.SetAdded(); 
        } 
        //Entfernen von doppelten Zeilen zur Änderung einzelner values 
        DataRow doubleRow = UpdateTable.Rows.Find(dr[0].ToString()); 
        if (doubleRow != null) 
        { 
         doubleRow.Delete(); 
        } 
       } 
       UpdateTable.Merge(MergeTable); 
       MessageBox.Show("Merge abgeschlossen."); 
      } 

      try 
      { 
       da.Update(UpdateTable); 
       success = true; 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show("Error has occured!" + ex.Message); 
       success = false; 
      } 
     } 
     return success; 
    } 

Fondamentalement supprimer simplement toutes les lignes en double avant de fusionner et mettre à jour, fonctionne très bien pour moi, mais probablement pas la solution idéale.