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作为参数传递的,也可以根据需要改成别的数据结构。

 版权所有,欢迎保留原文链接进行转载:)

 

posted @ 2017-01-14 17:01  小石浮木  阅读(438)  评论(0)    收藏  举报