Мы конвертируем наше приложение из Sql Server Express (давайте назовем эту версию 3) на Sql Server Compact Edition (назовем эту версию 4). Я стараюсь, чтобы обновления из предыдущих версий (версии 1 и 2) были одинаковыми в новом продукте (версия 4) в качестве старого (версия 3). Код обновления должен был быть переписан по различным причинам.Простая сопоставление таблиц базы данных с использованием DataTable.Merge и DataTable.GetChanges
Я создаю приложение для быстрого тестирования, которое будет сравнивать базу данных SQL Server версии 3 и базу данных Sql CE версии 4. Если логика преобразования хороша, базы данных должны быть в точности эквивалентными - одни и те же таблицы, одни и те же столбцы, одинаковые значения строк.
Мне кажется, что должен быть простой способ сделать это, используя 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
в пути слишком далеко от их предполагаемого использования? Если да, то другие варианты будут приветствоваться.