MySql批量插入多条数据的一种具体实现方法

来源:互联网 发布:勇士vs雷霆第七场数据 编辑:程序博客网 时间:2024/05/29 10:48

缘起:

    因为项目需要,需要在.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如下:

using MySql.Data;using MySql.Data.MySqlClient;

3.实现批量插入(思路就是把所有要插入的数据组织好以后放到insert语句values后面的括号里,你懂的)

//数据库连接字符串public static string connstr = "server=localhost;uid=root;pwd=123456;database=yourdb;charset=utf8";#region 批量插入    public static void BatchInsert(DataTable dt)    {        if (dt.Rows.Count == 0 || dt == null)        {            return;        }        using (MySqlConnection conn = new MySqlConnection(connstr))        {            MySqlCommand cmd = new MySqlCommand();            conn.Open();            cmd.Connection = conn;            cmd.CommandText = GenBatchInserSql(dt);            if (cmd.CommandText == string.Empty)            {                return;            }            cmd.ExecuteNonQuery();        }    }    //生成批量插入的sql    private static string GenBatchInserSql(DataTable dt)    {        var names = string.Empty;        var values = new StringBuilder();        var types=new List<DbType>();        var count=dt.Columns.Count;                for (int i = 0; i < count; i++)        {            names += dt.Columns[i].ColumnName + ",";            types.Add(GetDBType(dt.Columns[i].DataType));        }        names = names.TrimEnd(',');        var n = 0;        foreach (DataRow row in dt.Rows)        {            if (n > 0)            {                values.Append(",");            }            values.Append("(");            for (var j = 0; j < count; j++)            {                if (j > 0)                {                    values.Append(",");                }                var isstr = IsStrType(types[j]);                if (isstr)                {                    values.AppendFormat("'{0}'", row[j]);                }                else                {                    values.Append(row[j]);                }            }            values.Append(")");            n++;        }        return string.Format("insert into {0} ({1}) values {2}", dt.TableName, names, values);    }    //判断某列是不是string类型    private static bool IsStrType(DbType dbType)    {        return dbType == DbType.AnsiString || dbType == DbType.AnsiStringFixedLength || dbType == DbType.String || dbType == DbType.StringFixedLength;    }    //根据datatype得到dbtype,将得到的结果作为参数传到上面判断某列是不是string类型的方法    private static DbType GetDBType(System.Type theType)    {        System.Data.SqlClient.SqlParameter p1;        System.ComponentModel.TypeConverter tc;        p1 = new System.Data.SqlClient.SqlParameter();        tc = System.ComponentModel.TypeDescriptor.GetConverter(p1.DbType);        if (tc.CanConvertFrom(theType))        {            p1.DbType = (DbType)tc.ConvertFrom(theType.Name);        }        else        {            try            {                p1.DbType = (DbType)tc.ConvertFrom(theType.Name);            }            catch (Exception)            {                            }        }        return p1.DbType;    }    #endregion

这里我调用方法时是用datatable作为参数传递的,也可以根据需要改成别的数据结构。

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



0 0
原创粉丝点击