MySql 使用MySqlBulkLoader批量插入


數據庫批量插入Oracle中有 OracleBulkCopy,SQL當然也有個SqlBulkCopy .這里有介紹就不說,網上有非常詳細的例子,大家可去搜索下,可是MySql確沒有MySqlBulkCopy這個,網上找了很久也沒找到。找到了一個 MySqlBulkLoader

不廢話了,直接上代碼

 

#region 批量插入數據
        ///// <summary>
        ///// 批量插入收集庫件級文書檔案信息實體(批量)
        ///// </summary>
        ///// <param name="dataTable">數據表</param>
        ///// <returns></returns>
        public int BulkInsert(DataTable table)
        {
            int insertCount = 0;
            try
            {
                table.TableName = "tb_jj_ws_collect";//數據庫中的表名

                string connectionString = db.Database.Connection.ConnectionString;

                if (string.IsNullOrEmpty(table.TableName)) throw new Exception("請給DataTable的TableName屬性附上表名稱");

                if (table.Rows.Count == 0) return 0;

                string tmpPath = Directory.GetCurrentDirectory() + "\\UpTemp";
                if (!Directory.Exists(tmpPath))
                    Directory.CreateDirectory(tmpPath);
                tmpPath = Path.Combine(tmpPath, "Temp.csv");//csv文件臨時目錄

                string csv = DataTableToCsv(table);
                File.WriteAllText(tmpPath, csv);

                var columns = table.Columns.Cast<DataColumn>().Select(_columns => _columns.ColumnName).ToList();

                using (MySqlConnection conn = new MySqlConnection(connectionString))
                {
                    try
                    {
                        Stopwatch stopwatch = new Stopwatch();
                        stopwatch.Start();
                        conn.Open();
                        MySqlBulkLoader bulk = new MySqlBulkLoader(conn)
                        {
                            FieldTerminator = ",",
                            FieldQuotationCharacter = '"',
                            EscapeCharacter = '"',
                            LineTerminator = "\r\n",
                            FileName = tmpPath,
                            NumberOfLinesToSkip = 0,
                            TableName = table.TableName,

                        };
                        bulk.Columns.AddRange(columns);//根據標題列對應插入
                        insertCount = bulk.Load();
                        stopwatch.Stop();
                        //Console.WriteLine("耗時:{0}", stopwatch.ElapsedMilliseconds);
                    }
                    catch (MySqlException ex)
                    {
                        throw ex;
                    }
                }
                File.Delete(tmpPath);
            }
            catch (Exception ex)
            {
                OnLogError("批量插入收集庫件級文書檔案信息實體(批量)時異常。", ex);
            }

            
            return insertCount;
        }


        ///將DataTable轉換為標准的CSV  
        /// </summary>  
        /// <param name="table">數據表</param>  
        /// <returns>返回標准的CSV</returns>  
        private static string DataTableToCsv(DataTable table)
         {
             //以半角逗號(即,)作分隔符,列為空也要表達其存在。  
             //列內容如存在半角逗號(即,)則用半角引號(即"")將該字段值包含起來。  
             //列內容如存在半角引號(即")則應替換成半角雙引號("")轉義,並用半角引號(即"")將該字段值包含起來。  
             StringBuilder sb = new StringBuilder();
             DataColumn colum;
             foreach (DataRow row in table.Rows)
             {
                 for (int i = 0; i<table.Columns.Count; i++)
                 {
                     colum = table.Columns[i];
                     if (i != 0) sb.Append(",");
                     if (colum.DataType == typeof(string) && row[colum].ToString().Contains(","))
                     {
                         sb.Append("\"" + row[colum].ToString().Replace("\"", "\"\"") + "\"");
                     }
                     else sb.Append(row[colum].ToString());
                 }
                 sb.AppendLine();
             }
             return sb.ToString();
         }
        
        #endregion

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM