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

无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家。很通俗易懂,重点是还非常风趣幽默,像看小说一样。网址是https://blog.csdn.net/jiangjunshow/article/details/77338485

缘起:

    因为项目需要,需要在.net平台使用MySql数据库,而且需要大批量的插入数据。在SqlServer上有SqlBulkCopy这样的批量插入的方法,所以做之前就想MySql必然也有,就网上查了查相关资料,发现有是有,不过多是吉光片羽,不够统一,于是选择一种实现方法验证没问题之后,记录下来。

1.准备mysql相关驱动及dll

MySQL :: Download Connector/NET

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

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

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

角落工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值