скопировать данные из 1Db в другой, используя набор данных - PullRequest
0 голосов
/ 24 октября 2011

Извините, если мой английский не очень хорош, я постараюсь объяснить проблему.

Мне нужно скопировать все данные из таблицы mdb таблицы Acces (связанной с OleDB) в таблицу базы данных MySql (связанной с ODBC)

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

Решение, соединяющееся с mdb, используя DataReader, затем для каждой строки в Datareader я делаю INSERT в таблицу Mysql (перед копированием я обрезаю таблицу, чтобы она стала пустой)

Записи более 10 КБ, и эта операция очень медленная, и, действительно, мне нужно сделать то же самое для двух других таблиц, также очень больших, как эта.

Я не могу сделать прямую вставку SQL (как INSERT INTO A in ..... SELECT * FROM B), потому что 1 DB имеет соединение OleDB, а другое - ODBC.

Поэтому я подумал, чтобы попытаться выполнить эту операцию, используя TableAdapters и DataSet, но я не могу заставить ее работать.

Проблема в том, что HasChanges набора данных false

Если вам нужен код, который я могу опубликовать, но я делаю следующее:

  • Подключение к MDb
  • Создать OleDbTableAdapter
  • Создать набор данных
  • Заполнить набор данных с помощью TableAdapter
  • Подключение к MySqlDB
  • Создать ODBCTableAdapter
  • Использование команды обновления ODBCTableAdapter с первым набором данных.

Но DS не передал никаких изменений, поэтому он ничего не записывает в БД, поэтому я решил использовать другой набор данных и скопировать данные из DS1 в DS2, чтобы добавить строки, посмотреть, было ли has.changes верно, и сделать команду Update для ODBCTableadapter используя DS2.

Я попытался скопировать данные между наборами данных:

ds2 = ds1.copy

Я также пытался использовать функцию импорта набора данных, циклически обрабатывая DS1 datarows и импортируя все строки от DS1 до DS2. В обоих случаях строки добавляются в DS2, но все равно HasChanges имеет значение false, что я могу сделать? Просто чтобы прояснить возможные вопросы, которые я не использовал DS.Acceptchanges, PrimaryKey определен, UpdateCommand определен, DS имеет данные (я заполняю 2 DataGrids, чтобы проверить это). Нет ошибок, просто нет данных, записанных в БД.

Есть предложения? Спасибо за совет.

1 Ответ

1 голос
/ 24 октября 2011

Единственный способ значительно ускорить процесс - это пакетные команды обновления SQL.В противном случае каждый запрос на обновление будет выполняться по одному.

Возможно, вы захотите использовать команду MySQL LOAD DATA INFILE , чтобы упростить быстрый импорт больших объемов данных.

Мне не удалось найти функцию, сравнимую с классом SqlBulkCopy MS SQL Server, но если ваша библиотека MySQL поддерживает аналогичную функцию, которая также может представлять интерес.

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

...