有个list表有几万数据 用insert插入,速度跟蜗牛爬行, 几十个表,传起来可就需要时间了. 搜搜,发现有 MySqlBulkLoader
这个人家mysql 的dll 里边已经提供了这个方法 .....
这是效率 5个字段的列
18760条 用时 346ms 速度可以
使用时注意事项, 程序里的datatable 当前来看必须是datatable的形式, 这个datatable 的列的名要 mysql 数据库的列的名一一对应,没有值的默认设置上mull ,反正datatable内没的列,在mysql里边没找到的话,会报错
上传时datatable 不要把列头标题那行给加上了. 至于顺序似乎没有要求, 程序里感觉是在查mysql里边的列头了,应该是做对应的....没关注顺序,反正传上去现在来看都对号入座了...
在用mysql 测试数据库时 新建数据表,我没设置编码方式, 结果出现了中文乱码情况, 最后查了一通才找到;4
/// <summary> ///大批量数据插入,返回成功插入行数 /// </summary> /// <param name="connectionString">数据库连接字符串</param> /// <param name="table">数据表</param> /// <returns>返回成功插入行数</returns> public int BulkInsert(DataTable table) { MySqlConnection GetConnection = new MySqlConnection(connectionString); if (string.IsNullOrEmpty(table.TableName)) throw new Exception("请给DataTable的TableName属性附上表名称"); if (table.Rows.Count == 0) return 0; int insertCount = 0; string tmpPath = Path.GetTempFileName(); string csv = DataTableToCsv(table); StreamWriter sw = new StreamWriter(tmpPath, false,UTF8Encoding.UTF8); //要与mysql的编码方式对象, 数据库要utf8, 表也一样 sw.Write(csv); sw.Close(); // File.WriteAllText(tmpPath, csv); using (MySqlConnection conn = GetConnection) { MySqlTransaction tran = null; try { conn.Open(); tran = conn.BeginTransaction(); MySqlBulkLoader bulk = new MySqlBulkLoader(conn) { FieldTerminator = ",", FieldQuotationCharacter = '"', EscapeCharacter = '"', LineTerminator = "\r\n", FileName = tmpPath, NumberOfLinesToSkip = 0, TableName = table.TableName, //也是mysql内表的名 }; // bulk.CharacterSet = "utf-8"; bulk.Columns.AddRange(table.Columns.Cast<DataColumn>().Select(colum => colum.ColumnName).ToList()); insertCount = bulk.Load(); tran.Commit(); } catch (MySqlException ex) { if (tran != null) tran.Rollback(); throw ex; } } File.Delete(tmpPath); return insertCount; }
///将DataTable转换为标准的CSV /// </summary> /// <param name="table">数据表</param> /// <returns>返回标准的CSV</returns> private static string DataTableToCsv(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(); } return sb.ToString(); }