#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, прежде чем использовать эту команду «^^