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