如何使用 .Merge() 方法在合并 DataTables 时覆盖值?

Posted

技术标签:

【中文标题】如何使用 .Merge() 方法在合并 DataTables 时覆盖值?【英文标题】:How to override values in merging DataTables using .Merge() method? 【发布时间】:2015-03-25 08:41:54 【问题描述】:

有没有办法在使用 .Merge() 方法合并 DataTables 时覆盖值?

例如,如果我有两个具有相同原理图的数据表。

两者都有两列:Names | Enabled;

DataTable1 第一行条目为:Peter Punani | true;

DataTable2 第一行条目是:Peter Punani | false;

如果我使用 .Merge() 方法合并它们 - DataTable1.merge(DataTable2); -,DataTable1 将有 2 行,如下所示:

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

现在很明显,如果我尝试 .Update() 将 SqlCommandBuilder 用于我的 SQL DB,它会给我一个错误语句,因为我的主键(名称)中有两个相同的值。

但我希望 DB1 接受与 DB2 的差异,所以它看起来像:(并对所有其他与 DB1 不同的条目执行此操作。)

Names | Enabled;  
Peter Punani | false; 

那么合并这些表的最佳方法是什么,以便我可以正确更新它们?

【问题讨论】:

【参考方案1】:

我现在只是这样实现了我的方法:

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;
    

基本上我只是在合并和更新之前删除所有重复的行,对我来说很好,但可能不是理想的解决方案。

【讨论】:

以上是关于如何使用 .Merge() 方法在合并 DataTables 时覆盖值?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 索引合并(Index Merge)优化

对象合并插件Lodash的merge方法使用

SVN合并(merge)的使用

Git怎样撤销一次分支的合并Merge

Hibernate的merge()方法

pandas 合并数据函数merge join concat combine_first 区分