Вставка из одной базы данных MS Access в другую базу данных MS Access

Мне нужно перенести данные из БД MS Access в другую. Это был оператор вставки, используемый

 cmd.CommandText = @"Insert Into [MS Access;PWD=pw;DATABASE=" + currentDBPath + @"].[Orders]  Select   *  FROM  [Orders]  where OrderDate>=#" + from.ToShortDateString() + "# and  OrderDate <=#" + to.ToShortDateString() + "# and  IsCustomer=Yes  ";

Это утверждение работает нормально. Но кто-то начал вводить данные непосредственно в целевую базу данных, а также в источник. Это создало дублированные записи. Теперь я хочу скопировать те заказы из источника, которых нет в целевой таблице БД.


person faheem khan    schedule 18.05.2016    source источник
comment
Кто-то начал вводить данные напрямую.... Уволить его/ее   -  person Steve    schedule 18.05.2016
comment
Отличный совет! передам в вышестоящие инстанции   -  person faheem khan    schedule 18.05.2016
comment
Извините, но на самом деле это дорого, и тот, кто несет ответственность, должен заплатить за это. Если это всего лишь одно исправление, вы можете временно импортировать таблицу в другую базу данных и использовать интерфейс MSAccess для поиска и исправления дубликата. Если это повторяющаяся ситуация, вам необходимо разработать полную процедуру синхронизации, и, как было сказано, это дорого.   -  person Steve    schedule 18.05.2016


Ответы (2)


Предполагая, что таблица заказов имеет первичный ключ с именем IDOrers, вы должны привести обе таблицы в одну базу данных, чтобы вы могли сравнивать данные.
Простой вариант: иметь в базе данных Sours ссылку на [Заказы] в пункте назначения. БД с именем OrdersDest. В этом случае вы создаете в пункте назначения запрос отсутствующих заказов с именем MissingOrders :

SELECT Orders.* FROM Orders LEFT JOIN OrdersDest ON OrdersDest.IDOrders = Orders.IDOrders WHERE OrdersDest.IDOrders Is Null

Теперь ваша команда будет выглядеть так:

cmd.CommandText = @"Insert Into [MS Access;PWD=pw;DATABASE=" + currentDBPath + @"].[Orders]  Select   *  FROM  [MissingOrders]  where OrderDate>=#" + from.ToShortDateString() + "# and  OrderDate <=#" + to.ToShortDateString() + "# and  IsCustomer=Yes ";

Вы также можете передать данные через эту связанную таблицу:

cmd.CommandText = @"Insert Into [OrdersDest]  Select * FROM [MissingOrders]  where OrderDate>=#" + from.ToShortDateString() + "# and  OrderDate <=#" + to.ToShortDateString() + "# and  IsCustomer=Yes  ";
person marlan    schedule 18.05.2016
comment
@faheemkhan, Другим вариантом может быть создание двух таблиц данных, DSsours и DSdestination, заполнение их данными из таблицы заказов в исходной и целевой БД, передача соответствующих записей из DSsours в DSdestination` и добавление их обратно в целевую БД. - person marlan; 18.05.2016
comment
Я не понял, почему вы использовали левое соединение. также была небольшая проблема с синтаксисом с 1-м запросом - person faheem khan; 19.05.2016
comment
Не за что :) - person faheem khan; 19.05.2016
comment
Что касается левого соединения, вы хотите, чтобы запрос содержал все заказы из sours, поэтому у вас есть orders слева от LEFT JOIN. - person marlan; 19.05.2016
comment
вы хотите, чтобы запрос содержал все заказы от sours, поэтому у вас есть orders слева от LEFT JOIN, и вы исключаете данные, уже находящиеся в пункте назначения: WHERE OrdersDest.IDOrders Is Null. - person marlan; 19.05.2016

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

Я использовал приведенный ниже оператор для удаления данных,

   Delete * from Orders where AutoOrderID   in (SELECT Orders.AutoOrderID FROM Orders Inner JOIN OrdersSource ON OrdersSource .OrderId = Orders.OrderId and OrdersSource .OrderDate=Orders.OrderDate);
person faheem khan    schedule 19.05.2016