копирование данных из 1 ДБ в другой с помощью Dataset

#vb.net #dataset #odbc #oledb

#vb.net #набор данных #odbc #oledb

Вопрос:

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

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

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

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

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

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

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

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

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

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

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

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

 ds2 = ds1.copy
  

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

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

Комментарии:

1. Вы не можете использовать UpdateCommand первого TableAdapter для вашего MySqlConnection. Вы должны вставить каждый поток данных из первой таблицы данных во вторую таблицу данных (MySQL). Затем используйте TableAdapter вашей MySQL-таблицы, чтобы обновить эту таблицу данных.

2. да, да, может быть, я плохо объяснил, это то, что я сделал, я заполнил вторую таблицу данных, но для vb Datatable не имеет изменений, и поэтому, когда я вызываю update для MysqlTableAdapter, он ничего не записывает в DB.

Ответ №1:

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

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

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

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

Комментарии:

1. Хорошо, я попытаюсь проверить эту команду. Прежде чем я выполнил эту операцию с доступом с использованием связанных таблиц, и это было очень быстро, потому что я просто сделал это с помощью команды sql (ВСТАВИТЬ В tab2 ВЫБЕРИТЕ * tab1) в vb.net это гораздо сложнее. Но я хотел это сделать, потому что конечный результат, который я хотел бы получить, — это создать на сервере резидентное приложение vb, которое перехватывается при изменении Access DB и немедленно обновляет MySQLdb. Но я думаю, что это будет сложнее

2. Эх, ЗАГРУЗКА ДАННЫХ В ФАЙЛ, похоже, это то, что я ищу, но все не так просто, как всегда, эхехех, теперь я должен проверить, как преобразовать mdb в csv, прежде чем использовать эту команду «^^