如何使用 .Merge() 方法覆盖合并数据表中的值?
How to override values in merging DataTables using .Merge() method?
有没有办法在使用 .Merge() 方法合并数据表时覆盖值?
例如,如果我有两个具有相同原理图的数据表。
两者都有两列: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 数据库,它会给我一个错误语句,因为我的主键(名称)中有两个相同的值。
但我希望 DB1 接受与 DB2 的差异,因此它看起来像:(并对与 DB1 不同的所有其他条目执行此操作。)
Names | Enabled;
Peter Punani | false;
那么合并这些表的最佳方式是什么,以便我可以正确更新它们?
我现在就是这样实现我的方法的:
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() 方法合并数据表时覆盖值?
例如,如果我有两个具有相同原理图的数据表。
两者都有两列: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 数据库,它会给我一个错误语句,因为我的主键(名称)中有两个相同的值。
但我希望 DB1 接受与 DB2 的差异,因此它看起来像:(并对与 DB1 不同的所有其他条目执行此操作。)
Names | Enabled;
Peter Punani | false;
那么合并这些表的最佳方式是什么,以便我可以正确更新它们?
我现在就是这样实现我的方法的:
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;
}
基本上我只是在合并和更新之前删除所有重复的行,对我来说工作正常但可能不是理想的解决方案。