1. 程式人生 > >mysql 插入大量資料

mysql 插入大量資料

轉自:   https://blog.csdn.net/cslover2015/article/details/54427634


緣起:
    因為專案需要,需要在.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作為引數傳遞的,也可以根據需要改成別的資料結構。
 版權所有,歡迎保留原文連結進行轉載:)
--------------------- 
作者:cslover2015 
來源:CSDN 
原文:https://blog.csdn.net/cslover2015/article/details/54427634 
版權宣告:本文為博主原創文章,轉載請附上博文連結!