使用SqlBulkCopy批量快速插入大量資料到SQL SERVER
阿新 • • 發佈:2019-01-09
現有一個文字檔案,大小為8M多,有大約25W行。每一行文字為一條資料,經過簡單的字串拆分就可以獲取每個欄位的值。但是,如果使用常規的SqlConnection和SqlCommand來執行插入的話,25W行資料大約會花去20分鐘時間,這種效率是及其低下的。
如下程式碼:
string[] lines = File.ReadAllLines("CellPhoneNumber.txt", Encoding.Default); string connString = @"Data Source = (local)\SqlExpress; Integrated Security = true; Initial Catalog = Test"; using (SqlConnection conn = new SqlConnection(connString)) { conn.Open(); foreach (string line in lines) { string[] tempLine = line.Split('\t'); string PreFix = tempLine[0].Trim('\"'); string Area = tempLine[1].Trim('\"'); string Type = tempLine[2].Trim('\"'); string Code = tempLine[3].Trim('\"'); string cmdString = @"INSERT INTO T_CellPhoneLocation VALUES(@PreFix,@Area,@Type,@Code)"; using (SqlCommand cmd = new SqlCommand(cmdString, conn)) { SqlParameter[] sqlParameters = new SqlParameter[] { new SqlParameter("@PreFix",PreFix), new SqlParameter("@Area",Area), new SqlParameter("@Type",Type), new SqlParameter("@Code",Code) }; cmd.Parameters.AddRange(sqlParameters); cmd.ExecuteNonQuery(); } }
但是如果使用SqlBulkCopy的話,效率會快上幾百倍。但使用SqlBulkCopy需要先將待插入資料讀取到記憶體的DataSet中,然後再一次性批量插入。
如下程式碼:
string connString = @"Data Source = (local)\SqlExpress; Integrated Security = true; Initial Catalog = Test"; DataTable dt = new DataTable(); dt.Columns.Add("PreFix"); dt.Columns.Add("Area"); dt.Columns.Add("Type"); dt.Columns.Add("Code"); string[] lines = File.ReadAllLines("CellPhoneNumber.txt", Encoding.Default); foreach (string line in lines) { string[] tempLine = line.Split('\t'); DataRow dr = dt.NewRow(); dr["PreFix"] = tempLine[0].Trim('\"'); dr["Area"] = tempLine[1].Trim('\"'); dr["Type"] = tempLine[2].Trim('\"'); dr["Code"] = tempLine[3].Trim('\"'); dt.Rows.Add(dr); } using (SqlBulkCopy sbc = new SqlBulkCopy(connString)) { sbc.DestinationTableName = "T_CellPhoneLocation"; sbc.ColumnMappings.Add("PreFix", "PreFix"); sbc.ColumnMappings.Add("Area", "Area"); sbc.ColumnMappings.Add("Type", "Type"); sbc.ColumnMappings.Add("Code", "Code"); sbc.WriteToServer(dt); }
前者用時25min,後者用時4second
倍數相差; 375