Скопируйте одну базу данных доступа в другую базу данных с помощью C # - PullRequest
2 голосов
/ 30 марта 2011

Можно ли программным образом скопировать все таблицы в одной базе данных в другую базу данных, которая может уже содержать таблицы (и, если существует какое-либо повторяющееся имя, выдается, конечно, исключение)?Это подразумевает создание таблиц в целевой базе данных с правильными структурами и с тем же именем, что и в исходной базе данных.

Я нашел несколько похожих вопросов, но ни у одного из них нет такой конкретной потребности.

Я использую реактивный двигатель.

Ответы [ 2 ]

0 голосов
/ 07 августа 2015

Я понимаю, что это старый вопрос. Возможно, этот ответ поможет кому-то еще.

Управление COM-интерфейсом Microsoft Access, кажется, обеспечивает большую часть того, что вы ищете.

  • Добавить ссылку на «библиотеку объектов Microsoft Access xx.x»
  • Создание и создание экземпляра объекта типа «Microsoft.Office.Interop.Access.Application»
  • Вызовите OpenCurrentDatabase с параметром для вашей исходной базы данных
  • Вызовите DoCmd.CopyObject с параметрами для вашей целевой базы данных, именем целевой таблицы, типом объекта (AcObjectType.acTable) и именем вашей исходной таблицы
  • Вызов CloseCurrentDatabase

В VB.Net это выглядит примерно так:

acdb = New Microsoft.Office.Interop.Access.Application
acdb.OpenCurrentDatabase("source db")
acdb.DoCmd.CopyObject("target db", "target table name", Microsoft.Office.Interop.Access.AcObjectType.acTable, "source table name")
acdb.CloseCurrentDatabase()

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

Подробнее см. MSDN ссылка .

Когда я изучал, как это сделать, я неправильно понял, что я прочитал, так как думал, что это DAO. Прошло очень много времени с тех пор, как я использовал DAO, поэтому я не осознавал ошибки своими способами. Спасибо, Горд Томпсон, за то, что поправил меня

Это требует установки MSACCESS на машине, на которой он работает. Более сложный подход будет использовать ADOX, который также имеет свои недостатки IMHO.

Это с Office 2010. Очевидно, YMMV с другими версиями.

Если бы только когда-нибудь Microsoft начала использовать .Net для Office, как они говорят остальному миру.

0 голосов
/ 30 марта 2011

Нашли решение:

string query = "SELECT * INTO [dest_table] FROM [source_table] IN '" + sourceDataBaseFileName + "'";
using (OleDbCommand sqlCeCommand = new OleDbCommand(query, DbConnection))
{
    sqlCeCommand.ExecuteNonQuery();
}

Сделайте это для каждой таблицы в источнике. source_table и dest_table могут быть одинаковыми. DbConnection - это база данных назначения.

...