c# - 使用 DataTable.Merge 和 DataTable.GetChanges 进行简单的数据库表比较

标签 c# datatable database-comparison

我们正在将应用程序从使用 Sql Server Express(我们称之为版本 3)转换为 Sql Server Compact Edition(我们称之为版本 4)。我试图确保新产品(版本 4)与旧产品(版本 3)中从以前版本(版本 1 和 2)进行的升级是相同的。由于种种原因,升级代码不得不重写。

我正在创建一个快速测试应用程序,它将比较版本 3 Sql Server Express 数据库和版本 4 Sql CE 数据库。如果转换逻辑良好,数据库应该完全相同——相同的表、相同的列、相同的行值。

在我看来,应该有一种简单的方法可以使用 DataTable.MergeDataTable.GetChanges 来完成此操作,但我没有成功。如果行存在于版本 3 数据库中而不是版本 4 数据库中,则 GetChanges 仍返回 null。如果相同的行发生更改(基于主键,即 Guid),GetChanges 仍返回 null。

string selectSql = String.Format("SELECT {0} FROM {1}", String.Join(", ", columns.ToArray()), tableName);

var expressAdapter = new SqlDataAdapter(selectSql, expressConnection);
DataTable expressTable = new DataTable();
expressAdapter.Fill(expressTable);
expressTable.PrimaryKey = new DataColumn[] { expressTable.Columns[tableName + "ID"] };

SqlCeConnection ceConnection = new SqlCeConnection(this.SqlServerCeConnectionString);
var ceAdapter = new SqlCeDataAdapter(selectSql, ceConnection);
DataTable ceTable = expressTable.Clone();
ceAdapter.Fill(ceTable);

expressTable.Merge(ceTable);
return expressTable.GetChanges(); // this is null even when the expressTable has rows that do not exist in ceTable.

我使用 MergeGetChanges 的方式是否与预期用途相去甚远?如果是这样,欢迎其他选择。

最佳答案

我不久前尝试过做类似的事情,但最终没有成功,因为 AcceptChanges 是在 Merge 添加的行上调用的,所以它们都是未经修改的状态,因此 GetChanges 返回 null...

关于c# - 使用 DataTable.Merge 和 DataTable.GetChanges 进行简单的数据库表比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2030381/

相关文章:

c# - Unity3D C# 计时器以毫秒为单位显示

sql-server - 我可以安排的数据库比较工具

c# - 绘制长度超过 65536 的字符串时 GDI+ DrawString 通用异常?

c# - 奇怪的内联数组初始化

c# - cassandra 节点可以高度便携吗?

c# - IEnumerable 到用逗号分隔的字符串?

c# - 从 DataTable 中删除所有没有数据的列

javascript - 刷新数据表1.9而不删除所有行

mysql - 比较2个数据库