最近用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