Простое сравнение таблиц базы данных с использованием DataTable.Merge и DataTable.GetChanges

Мы преобразуем наше приложение из Sql Server Express (назовем эту версию 3) в Sql Server Compact Edition (назовем эту версию 4). Я пытаюсь убедиться, что обновления с предыдущих версий (версии 1 и 2) в новом продукте (версия 4) совпадают со старыми (версия 3). Код обновления пришлось переписать по разным причинам.

Я создаю приложение для быстрого тестирования, которое будет сравнивать базу данных Sql Server Express версии 3 и базу данных Sql CE версии 4. Если логика преобразования хороша, базы данных должны быть точно такими же - те же таблицы, те же столбцы, те же значения строк.

Мне кажется, что должен быть простой способ сделать это, используя DataTable.Merge а также DataTable.GetChanges, но у меня нет успеха. Если строки существуют в базе данных версии 3, а не в базе данных версии 4, GetChanges все еще возвращает ноль. Если есть изменения в тех же строках (на основе первичного ключа, который является Guid), GetChanges все еще возвращает ноль.

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 слишком далеко от их предполагаемого использования? Если это так, другие варианты будут приветствоваться.

3 ответа

Решение

Я пытался сделать что-то подобное некоторое время назад, но в итоге это не сработало, потому что AcceptChanges был вызван на строки, добавленные Mergeтак что все они были в неизмененном состоянии, так GetChanges вернулся ноль...

Я уверен, что Merge не делает то, что вы хотите.

Если вы проверите expressTable.Rows.Count до и после слияния, вы поймете, что я имею в виду.

Конечно, есть много очевидных способов сделать это, и они требуют много работы с вашей стороны. Если вы можете, вы можете рассмотреть продукт, как Red Gate Data, сравнить

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

Я не думаю, что вы используете этот персонал по назначению.

В случае, если вам нужно сравнить, вам лучше подумать о наличии двух источников данных и их синхронизации. Если вы хотите / должны сделать это автоматически (с помощью некоторого кода), вы можете взглянуть на Microsoft Sync Framework, который был специально разработан для поиска / устранения различий между источниками данных. В вашем случае "разрешение" может быть тривиальным (то есть "никаких действий, только отчет"). В случае, если это "время от времени" действие, и вы можете делать это вручную, вы можете использовать какой-то инструмент (RedGate Data Compare, о котором упоминалось, вполне подходит для этого, но я не на 100% уверен, что поддерживает SQL Server CE).

Другие вопросы по тегам