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

时间:2010-01-08 20:07:06

标签: c# datatable database-comparison

我们正在将我们的应用程序从使用Sql Server Express(让我们称之为第3版)转换为Sql Server Compact Edition(让我们称之为第4版)。我试图确保以前版本(版本1和2)的升级在新产品(版本4)中与旧版本(版本3)相同。必须根据各种原因重写升级代码。

我正在创建一个快速测试应用程序,它将比较版本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的方式是否远离其预期用途?如果是这样,欢迎其他选择。

3 个答案:

答案 0 :(得分:2)

我很确定Merge没有按你的意愿行事。

如果在合并之前和之后检查expressTable.Rows.Count,你会看到我的意思。

当然,有很多明显的方法可以做到这一点,他们需要你做很多工作。如果可以的话,您可能想要考虑像Red Gate Data比较的产品

http://www.red-gate.com/products/SQL_Data_Compare/index.htm

答案 1 :(得分:2)

我之前尝试做过类似的事情,但最终它没有用,因为AcceptChangesMerge添加的行上被调用,所以它们都处于未修改状态,所以{{1返回null ...

答案 2 :(得分:0)

我认为你没有以预期的方式使用这些工作人员。

如果你需要比较,你最好考虑拥有两个数据源并保持“同步”。如果您希望/需要自动执行此操作(通过某些代码),您可能需要查看专门为查找/解决数据源之间的差异而开发的Microsoft Sync Framework。在你的情况下,'决议'可能是微不足道的(即'不采取行动,仅报告')。如果这是一个“偶尔进行”活动,你可以手动完成它,你可以使用一些工具(RedGate Data Compare,提到它是相当不错的,但我不是100%确定它是否支持SQL Server CE。

相关问题