Массовая копия DataTable в MySQL (аналогично System.Data.SqlClient.SqlBulkCopy)

Я переношу свою программу с Microsoft SQL Server на MySQL. Все работает хорошо, кроме одной проблемы с массовой копией.

В решении с MS SQL код выглядит так:

connection.Open(); SqlBulkCopy bulkCopy = new SqlBulkCopy(connection); bulkCopy.DestinationTableName = "testTable"; bulkCopy.WriteToServer(rawData); 

Теперь я пытаюсь сделать что-то подобное для MySQL. Поскольку я думаю, что будет плохая производительность, я не хочу писать DataTable в CSV-файл и делать туда вставку с classом MySqlBulkLoader .

Любая помощь будет высоко оценен.

Поскольку я думаю, что будет плохая производительность, я не хочу писать DataTable в CSV-файл и делать туда вставку с classом MySqlBulkLoader.

Не исключайте возможное решение, основанное на необоснованных предположениях. Я просто протестировал вставку из 100 000 строк из System.Data.DataTable в таблицу MySQL, используя стандартный MySqlDataAdapter#Update() внутри Transaction . Для его выполнения потребовалось около 30 секунд:

 using (MySqlTransaction tran = conn.BeginTransaction(System.Data.IsolationLevel.Serializable)) { using (MySqlCommand cmd = new MySqlCommand()) { cmd.Connection = conn; cmd.Transaction = tran; cmd.CommandText = "SELECT * FROM testtable"; using (MySqlDataAdapter da = new MySqlDataAdapter(cmd)) { da.UpdateBatchSize = 1000; using (MySqlCommandBuilder cb = new MySqlCommandBuilder(da)) { da.Update(rawData); tran.Commit(); } } } } 

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

Напротив, следующий код с использованием MySqlBulkLoader занял всего 5 или 6 секунд для запуска …

 string tempCsvFileSpec = @"C:\Users\Gord\Desktop\dump.csv"; using (StreamWriter writer = new StreamWriter(tempCsvFileSpec)) { Rfc4180Writer.WriteDataTable(rawData, writer, false); } var msbl = new MySqlBulkLoader(conn); msbl.TableName = "testtable"; msbl.FileName = tempCsvFileSpec; msbl.FieldTerminator = ","; msbl.FieldQuotationCharacter = '"'; msbl.Load(); System.IO.File.Delete(tempCsvFileSpec); 

… включая время сброса 100 000 строк из DataTable во временный CSV-файл (с использованием кода, подобного этому ), массовую загрузку из этого файла и последующее удаление файла.

  • Android: обновление версии БД и добавление новой таблицы
  • SQLite возвратил код ошибки 14
  • Где Android хранит версию базы данных SQLite?
  • Хранение изображения в базе данных напрямую или как данные base64?
  • Зачем мне нужна транзакция в Hibernate для работы только для чтения?
  • SQLiteOpenHelper onUpgrade () Confusion Android
  • Java + Tomcat, Умирающее соединение с базой данных?
  • Как быстро переименовать базу данных MySQL (изменить имя схемы)?
  • Могу ли я делать транзакции и блокировки в CouchDB?
  • Как вывести результаты запроса HiveQL в CSV?
  • Как проверить, существует ли firebase database mysql
  • Interesting Posts

    Преобразование двоичного строкового представления в массив байтов

    Получить текущее местоположение 0 в marshmallow, где ниже 23 API его дать точное текущее местоположение с использованием плавленого местоположения

    Поиск дубликатов в O (n) времени и O (1) пространстве

    Выберите «окно перемещения» из панели задач Windows 8

    «Неожиданный импорт токена» в Nodejs5 и babel?

    Выполните полусоединение с data.table

    ScrollView Inside ScrollView

    Как в диалоговом окне «Запуск» известно, где находятся приложения?

    Почему я не могу активировать профиль Maven2 из другого профиля?

    Запрос LINQ для возврата словаря

    iPhone App> Добавить распознавание голоса?

    twitter bootstrap – выпадение нескольких столбцов

    Как отключить неиспользуемые предупреждения переменных, выходящие из gcc в стороннем коде, который я не хочу редактировать?

    Нет разрешения на вызов msgBox в скриптах Google Apps

    Почему моя резервная копия dd MacBook OS X не загружается при восстановлении?

    Давайте будем гением компьютера.