アプリケーションを Sql Server Express (これをバージョン 3 と呼びましょう) から Sql Server Compact Edition (これをバージョン 4 と呼びましょう) に変換しています。以前のバージョン (バージョン 1 および 2) からのアップグレードが、古い製品 (バージョン 3) と新しい製品 (バージョン 4) で同じであることを確認しようとしています。アップグレード コードは、さまざまな理由で書き直さなければなりませんでした。
バージョン 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
もしそうなら、他のオプションは大歓迎です。