2010-01-08 8 views
2

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

ответ

2

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

2

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

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

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

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

0

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

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