我们正在将应用程序从使用 Sql Server Express(我们称之为版本 3)转换为 Sql Server Compact Edition(我们称之为版本 4)。我试图确保新产品(版本 4)与旧产品(版本 3)中从以前版本(版本 1 和 2)进行的升级是相同的。由于种种原因,升级代码不得不重写。
我正在创建一个快速测试应用程序,它将比较版本 3 Sql Server Express 数据库和版本 4 Sql CE 数据库。如果转换逻辑良好,数据库应该完全相同——相同的表、相同的列、相同的行值。
在我看来,应该有一种简单的方法可以使用 DataTable.Merge
和 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
的方式是否与预期用途相去甚远?如果是这样,欢迎其他选择。
最佳答案
我不久前尝试过做类似的事情,但最终没有成功,因为 AcceptChanges
是在 Merge
添加的行上调用的,所以它们都是未经修改的状态,因此 GetChanges
返回 null...
关于c# - 使用 DataTable.Merge 和 DataTable.GetChanges 进行简单的数据库表比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2030381/