MySql批量插入多条数据的一种具体实现方法
缘起:
因为项目需要,需要在.net平台使用MySql数据库,而且需要大批量的插入数据。在SqlServer上有SqlBulkCopy这样的批量插入的方法,所以做之前就想MySql必然也有,就网上查了查相关资料,发现有是有,不过多是吉光片羽,不够统一,于是选择一种实现方法验证没问题之后,记录下来。
1.准备mysql相关驱动及dll
http://dev.mysql.com/downloads/connector/net/6.9.html
可以在这里下载ADO.NET的MySql驱动,安装完了在安装路径下应该可以找到MySql.Data.dll,这个dll后面要添加到项目引用里。
2.添加引用后,在程序里using如下:
1 using MySql.Data; 2 using MySql.Data.MySqlClient;
3.实现批量插入(思路就是把所有要插入的数据组织好以后放到insert语句values后面的括号里,你懂的)
1 //数据库连接字符串 2 public static string connstr = "server=localhost;uid=root;pwd=123456;database=yourdb;charset=utf8"; 3 #region 批量插入 4 5 public static void BatchInsert(DataTable dt) 6 { 7 if (dt.Rows.Count == 0 || dt == null) 8 { 9 return; 10 } 11 using (MySqlConnection conn = new MySqlConnection(connstr)) 12 { 13 MySqlCommand cmd = new MySqlCommand(); 14 conn.Open(); 15 cmd.Connection = conn; 16 cmd.CommandText = GenBatchInserSql(dt); 17 if (cmd.CommandText == string.Empty) 18 { 19 return; 20 } 21 cmd.ExecuteNonQuery(); 22 } 23 } 24 25 //生成批量插入的sql 26 private static string GenBatchInserSql(DataTable dt) 27 { 28 var names = string.Empty; 29 var values = new StringBuilder(); 30 var types=new List<DbType>(); 31 var count=dt.Columns.Count; 32 33 for (int i = 0; i < count; i++) 34 { 35 names += dt.Columns[i].ColumnName + ","; 36 types.Add(GetDBType(dt.Columns[i].DataType)); 37 } 38 names = names.TrimEnd(','); 39 var n = 0; 40 foreach (DataRow row in dt.Rows) 41 { 42 if (n > 0) 43 { 44 values.Append(","); 45 } 46 values.Append("("); 47 for (var j = 0; j < count; j++) 48 { 49 if (j > 0) 50 { 51 values.Append(","); 52 } 53 var isstr = IsStrType(types[j]); 54 if (isstr) 55 { 56 values.AppendFormat("'{0}'", row[j]); 57 } 58 else 59 { 60 values.Append(row[j]); 61 } 62 } 63 values.Append(")"); 64 n++; 65 } 66 return string.Format("insert into {0} ({1}) values {2}", dt.TableName, names, values); 67 } 68 69 //判断某列是不是string类型 70 private static bool IsStrType(DbType dbType) 71 { 72 return dbType == DbType.AnsiString || dbType == DbType.AnsiStringFixedLength || dbType == DbType.String || dbType == DbType.StringFixedLength; 73 } 74 75 //根据datatype得到dbtype,将得到的结果作为参数传到上面判断某列是不是string类型的方法 76 private static DbType GetDBType(System.Type theType) 77 { 78 System.Data.SqlClient.SqlParameter p1; 79 System.ComponentModel.TypeConverter tc; 80 p1 = new System.Data.SqlClient.SqlParameter(); 81 tc = System.ComponentModel.TypeDescriptor.GetConverter(p1.DbType); 82 if (tc.CanConvertFrom(theType)) 83 { 84 p1.DbType = (DbType)tc.ConvertFrom(theType.Name); 85 } 86 else 87 { 88 try 89 { 90 p1.DbType = (DbType)tc.ConvertFrom(theType.Name); 91 } 92 catch (Exception) 93 { 94 95 } 96 } 97 return p1.DbType; 98 } 99 #endregion
这里我调用方法时是用datatable作为参数传递的,也可以根据需要改成别的数据结构。
版权所有,欢迎保留原文链接进行转载:)
浙公网安备 33010602011771号