.net core利用MySqlBulkLoader大数据批量导入MySQL
最近用core写了一个数据迁移小工具,从SQLServer读取数据,加工后导入MySQL,由于数据量太过庞大,数据表都过百万,常用的dapper已经无法满足。三大数据库都有自己的大数据批量导入数据的方式,
MSSQL有SqlBulkCopy,MYSQL有MySqlBulkLoader,Oracle有OracleBulkCopy,对应各自的驱动。
一:生成csv文件
public static class CSVEx { /// <summary> ///将DataTable转换为标准的CSV /// </summary> /// <param name="table">数据表</param> /// <returns>返回标准的CSV</returns> public static void ToCsv(this DataTable table) { //以半角逗号(即,)作分隔符,列为空也要表达其存在。 //列内容如存在半角逗号(即,)则用半角引号(即"")将该字段值包含起来。 //列内容如存在半角引号(即")则应替换成半角双引号("")转义,并用半角引号(即"")将该字段值包含起来。 StringBuilder sb = new StringBuilder(); DataColumn colum; foreach (DataRow row in table.Rows) { for (int i = 0; i < table.Columns.Count; i++) { colum = table.Columns[i]; if (i != 0) sb.Append(","); if (colum.DataType == typeof(string) && row[colum].ToString().Contains(",")) { sb.Append("\"" + row[colum].ToString().Replace("\"", "\"\"") + "\""); } else sb.Append(row[colum].ToString()); } sb.AppendLine(); } File.WriteAllText(table.TableName + ".csv", sb.ToString()); } }
二:批量导入数据
public static class MySqlHelper { /// <summary> /// 批量导入 /// </summary> /// <param name="_mySqlConnection"></param> /// <param name="dt"></param> /// <returns></returns> public static int BulkLoad(MySqlConnection _mySqlConnection, DataTable table) { var columns = table.Columns.Cast<DataColumn>().Select(colum => colum.ColumnName).ToList(); MySqlBulkLoader bulk = new MySqlBulkLoader(_mySqlConnection) { FieldTerminator = ",", FieldQuotationCharacter = '"', EscapeCharacter = '"', LineTerminator = "\r\n", FileName = table.TableName + ".csv", NumberOfLinesToSkip = 0, TableName = table.TableName, }; bulk.Columns.AddRange(columns); return bulk.Load(); } }
demo地址:https://github.com/xiaopotian1990/MySqlBulkLoaderDemo