我们正在将我们的应用程序从使用 Sql Server Express(我们称之为版本 3)转换为 Sql Server Compact Edition(我们称之为版本 4)。我正在尝试确保新产品(版本 4)与旧产品(版本 3)中以前版本(版本 1 和 2)的升级相同。由于各种原因,不得不重写升级代码。
我正在创建一个快速测试应用程序,它将比较版本 3 Sql Server Express 数据库和版本 4 Sql CE 数据库。如果转换逻辑良好,那么数据库应该是完全等价的——相同的表、相同的列、相同的行值。
在我看来,应该有一种简单的方法来使用DataTable.Merge
and来做到这一点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
与他们的预期用途相去甚远?如果是这样,其他选择将受到欢迎。