因为我认为表现不佳,所以我不想将DataTable写入CSV文件中,然后使用MySqlBulkLoader类进行插入。请不要基于没有根据的假设排除可能的解决方案。 我刚刚测试了从System.Data.DataTable插入100,000行到MySQL表中,并在Transaction内使用标准的MySqlDataAdapter#Update(),它一直需要大约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文件的时间(使用类似这个的代码),从该文件进行批量加载,然后删除该文件。