Как перенести данные из одной базы данных в другую, используя DataSet? - PullRequest
3 голосов
/ 24 октября 2008

Как обычно, сначала некоторая справочная информация:

База данных A (база данных Access) - содержит таблицу, в которой содержится нужная мне информация, только из двух столбцов. Информация из этих двух столбцов необходима для приложения, которое будет использоваться людьми, которые не могут получить доступ к базе данных A.

База данных B (база данных Access) - содержит таблицу, которая содержит только два столбца (отражает то, что нам нужно из таблицы A). База данных B доступна для всех пользователей приложения. Одна из проблем заключается в том, что одно из имен столбцов не совпадает с именем в таблице из базы данных A.

Что мне нужно сделать, это передать необходимые данные через утилиту, которая будет запускаться автоматически, скажем, раз в неделю (две базы данных не обязательно должны быть полностью синхронизированы, просто закрыть). Утилита передачи будет запущена из учетной записи пользователя, которая имеет доступ к обеим базам данных (очевидно).

Вот подход, который я выбрал (опять же, если есть лучший способ, пожалуйста, предложите прочь):

  1. Получите данные из базы данных A. Это только два столбца из необходимой таблицы.

  2. Записать данные в файл [tablename] .txt, используя объект DataReader и объект WriterStream. Я сделал это, чтобы я мог использовать файл schema.ini и заставить столбцы данных иметь то же имя, что и в базе данных B.

  3. Создать объект DataSet, содержащий DataTable, который отражает таблицу из базы данных B.

  4. Всасывание информации из файла .txt в DataTable с использованием поставщика Microsoft.Jet.OLEDB.4.0 с расширенными свойствами текста, hdr = yes и fmt = delimited (чтобы соответствовать тому, как у меня есть schema.ini настройка файла и настройка файла .txt). Я использую DataAdapter для заполнения DataTable.

  5. Создайте еще один объект DataSet, содержащий DataTable, который отражает таблицу из базы данных B.

  6. Вберите информацию из базы данных B, чтобы она содержала все текущие данные, найденные в таблице, которые необходимо обновить из базы данных A. Снова я использую DataAdapter для заполнения этой DataTable (отличной от Шаг 5, поскольку они оба используют разные источники данных).

  7. Объединить таблицу данных, в которой хранятся данные из базы данных A (или технически файла .txt).

  8. Обновите таблицу базы данных B с изменениями.

Я написал команды обновления, удаления и вставки вручную для адаптера данных, который отвечает за связь с базой данных B. Однако эта логика никогда не используется, поскольку DataSet-From-Database-B.Merge (Dataset-From-TxtFile [tableName]) не отображает флаг HasChanges. Это означает, что DataSet-From-Database-B.Update не запускает ни одну из команд.

Так есть ли способ получить данные из DataSet-From-TxtFile для слияния и применения к базе данных B, используя метод, который я использую? Я здесь упускаю важный шаг?

Я знаю, что всегда могу удалить все записи из таблицы базы данных B, а затем просто вставить все записи из текстового файла (даже если мне нужно было пройти по каждой записи в DataSet и применить row.SetAdded, чтобы убедиться, что он вызывает HasChanges), но я бы предпочел, чтобы он применял ТОЛЬКО изменения каждый раз.

Я использую c # и 2.0 Framework (что, как я понимаю, означает, что я могу использовать DataTables и TableAdapters вместо DataSets и DataAdapters, поскольку я имею дело только с одной таблицей, но в любом случае).

ТИА

Ответы [ 2 ]

3 голосов
/ 24 октября 2008

Отложив на мгновение, что я буду использовать SQLServer и иметь только одну таблицу с несколькими представлениями, контролирующими, кто может видеть, какую информацию в ней, чтобы избежать всей проблемы синхронизации ...

Я думаю, что @Mitchel здесь прав. Просто напишите программу, которая подключается к обеим базам данных, загрузите таблицу A и таблицу B соответственно. Затем для каждого элемента (пары столбцов) в A убедитесь, что он находится в B. Если нет, вставьте его в B. Затем для каждого элемента в B убедитесь, что он находится в A. Если нет, то удалите его из B . Сохранить B. Я не вижу необходимости сначала обращаться к файлу.

псевдокод:

DataTable A = load table from A
DataTable B = load table from B

foreach row in A
   col1 = row[col1]
   col2 = row[col2]
   matchRow = B.select( "col1 = " + col1 + " and col2 = " + col2)
   if not matchRow exists
      add new row to B with col1,col2
   end
end

foreach row in B
   col1 = row[col1]
   col2 = row[col2]
   matchRow = A.select( "col1 = " + col1 + " and col2 = " + col2)
   if not matchRow exists
      remove row from B
   end
end

update B
0 голосов
/ 24 октября 2008

Почему бы просто не использовать считыватель данных и не перебирать записи, делая ручные вставки при необходимости в базу данных B?

Вместо работы с наборами данных, слияния и т. Д.

...