Простое сравнение таблиц базы данных с использованием DataTable.Merge и DataTable.GetChanges - PullRequest
2 голосов
/ 08 января 2010

Мы преобразуем наше приложение из 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 ]

2 голосов
/ 09 января 2010

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

2 голосов
/ 08 января 2010

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

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

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

http://www.red -gate.com / продукция / SQL_Data_Compare / index.htm

0 голосов
/ 09 января 2010

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

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

...