最近項目需要做一個批量導入的功能,每次導入最少的記錄數都達到1萬,之前寫了一個通過循環Insert的方法,結果我自己都看不下了。太慢了,所以用了SqlBulkCopy,很快,100萬條數據,1分鍾都不到。
class Program { /// <summary> /// 批量插入 /// </summary> /// <param name="dt">數據集</param> public static void BulkToDB(DataTable dt) { using (SqlConnection sqlConn = new SqlConnection("Data Source=.;uid=sa;pwd=123456;Initial Catalog=Test")) { SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlConn); bulkCopy.DestinationTableName = "UserInfo"; //要插入數據的表名 bulkCopy.BatchSize = dt.Rows.Count; //插入的條數 try { sqlConn.Open(); if (dt != null && dt.Rows.Count != 0) bulkCopy.WriteToServer(dt); } catch (Exception ex) { throw ex; } finally { sqlConn.Close(); if (bulkCopy != null) bulkCopy.Close(); } } } /// <summary> /// 創建表結構,(Id(自增),LoginName,LoginPwd) /// </summary> /// <returns></returns> public static DataTable GetTableSchema() { DataTable dt = new DataTable(); dt.Columns.AddRange(new DataColumn[]{ new DataColumn("Id",typeof(int)), new DataColumn("LoginName",typeof(string)), new DataColumn("LoginPwd",typeof(string)) }); return dt; } static void Main(string[] args) { //100萬條數據 Stopwatch sw = new Stopwatch(); for (int multiply = 0; multiply < 10; multiply++) { DataTable dt = GetTableSchema(); for (int count = multiply * 100000; count < (multiply + 1) * 100000; count++) { DataRow r = dt.NewRow(); // r[0] = 1;//因為該列是自增列,所以可以不賦值 r[1] = string.Format("Name-{0}", count * multiply); r[2] = string.Format("Pwd-{0}", count * multiply); dt.Rows.Add(r); } sw.Start(); BulkToDB(dt); sw.Stop(); Console.WriteLine(string.Format("Elapsed Time is {0} Milliseconds", sw.ElapsedMilliseconds)); } Console.ReadLine(); } }
執行結果: