sql >> Databasteknik >  >> RDS >> Mysql

Masskopiera en DataTable till MySQL (liknande System.Data.SqlClient.SqlBulkCopy)

Uteslut inte en möjlig lösning baserad på ogrundade antaganden. Jag testade precis infogningen av 100 000 rader från en System.Data.DataTable till en MySQL-tabell med en standard MySqlDataAdapter#Update() inuti en Transaction . Det tog genomgående cirka 30 sekunder att köra:

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();
            }
        }
    }
}

(Jag försökte ett par olika värden för UpdateBatchSize men de verkade inte ha någon betydande inverkan på den förflutna tiden.)

Däremot följer följande kod med MySqlBulkLoader tog bara 5 eller 6 sekunder att köra ...

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);

... inklusive tiden för att dumpa de 100 000 raderna från datatabellen till en temporär CSV-fil (med kod som liknar detta ), massladdning från den filen och radering av filen efteråt.



  1. Är det möjligt att migrera från Realm till SQLite?

  2. Gå med mig med Special Guest Michal Bar från MS Access Team!

  3. MySQL kopieringsdatabas

  4. Vad är det för fel med denna lagrade procedur?