关于ZAKER 融媒体解决方案 合作 加入

c# – 将 DataTable 批量复制到 MySQL ( 类似于 System.

CocoaChina 09-19

我正在将我的程序从 Microsoft SQL Server 迁移到MySQL. 一切正常 , 除了批量复制的一个问题 .

在使用 MS SQL 的解决方案中 , 代码如下所示:

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

现在我尝试为 MySQL 做类似的事情 . 因为我认为会有糟糕的性能 , 所以我不想将 DataTable 写入 CSV 文件 , 并使用 MySqlBulkLoader 类从那里进行插入 .

任何帮助将受到高度赞赏 .

最佳答案

Because I think there would be bad performance I don ’ t want to write the DataTable to a CSV file and do the insert from there with the MySqlBulkLoader class.

不排除基于毫无根据的假设的可能解决方案 . 我刚刚在 Transaction 中使用标准的 MySqlDataAdapter #Update ( ) 测试了从 System.Data.DataTable 插入 100,000 行到 MySQL 表中 . 它一直需要大约 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:UsersGordDesktopdump.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 ) ;

…包括从 DataTable 转储 100,000 行到临时 CSV 文件 ( 使用类似于this的代码 ) 的时间 , 从该文件批量加载 , 以及之后删除文件 .

以上内容由"CocoaChina"上传发布 查看原文

觉得文章不错,微信扫描分享好友

扫码分享