Как обычно, сначала некоторая справочная информация:
База данных A (база данных Access) - содержит таблицу, в которой содержится нужная мне информация, только из двух столбцов. Информация из этих двух столбцов необходима для приложения, которое будет использоваться людьми, которые не могут получить доступ к базе данных A.
База данных B (база данных Access) - содержит таблицу, которая содержит только два столбца (отражает то, что нам нужно из таблицы A). База данных B доступна для всех пользователей приложения. Одна из проблем заключается в том, что одно из имен столбцов не совпадает с именем в таблице из базы данных A.
Что мне нужно сделать, это передать необходимые данные через утилиту, которая будет запускаться автоматически, скажем, раз в неделю (две базы данных не обязательно должны быть полностью синхронизированы, просто закрыть). Утилита передачи будет запущена из учетной записи пользователя, которая имеет доступ к обеим базам данных (очевидно).
Вот подход, который я выбрал (опять же, если есть лучший способ, пожалуйста, предложите прочь):
Получите данные из базы данных A. Это только два столбца из необходимой таблицы.
Записать данные в файл [tablename] .txt, используя объект DataReader и объект WriterStream. Я сделал это, чтобы я мог использовать файл schema.ini и заставить столбцы данных иметь то же имя, что и в базе данных B.
Создать объект DataSet, содержащий DataTable, который отражает таблицу из базы данных B.
Всасывание информации из файла .txt в DataTable с использованием поставщика Microsoft.Jet.OLEDB.4.0 с расширенными свойствами текста, hdr = yes и fmt = delimited (чтобы соответствовать тому, как у меня есть schema.ini настройка файла и настройка файла .txt). Я использую DataAdapter для заполнения DataTable.
Создайте еще один объект DataSet, содержащий DataTable, который отражает таблицу из базы данных B.
Вберите информацию из базы данных B, чтобы она содержала все текущие данные, найденные в таблице, которые необходимо обновить из базы данных A. Снова я использую DataAdapter для заполнения этой DataTable (отличной от Шаг 5, поскольку они оба используют разные источники данных).
Объединить таблицу данных, в которой хранятся данные из базы данных A (или технически файла .txt).
Обновите таблицу базы данных 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, поскольку я имею дело только с одной таблицей, но в любом случае).
ТИА