2

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

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

在我看来,应该有一种简单的方法来使用DataTable.Mergeand来做到这一点DataTable.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.

我是否正在使用Merge并且GetChanges与他们的预期用途相去甚远?如果是这样,其他选择将受到欢迎。

4

3 回答 3

2

我很确定 Merge 不会做你想做的事。

如果您在合并前后检查 expressTable.Rows.Count,您就会明白我的意思。

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

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

于 2010-01-08T20:53:52.127 回答
2

前段时间我尝试做类似的事情,但最终它没有工作,因为AcceptChanges在添加的行上被调用Merge,所以它们都处于未修改状态,所以GetChanges返回 null ...

于 2010-01-08T21:14:08.950 回答
0

我认为您没有以预期的方式使用此员工。

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

于 2010-01-08T21:25:27.880 回答