# 工作筆記 #1 - SQL Server BULK INSERT 需求 --- > 測試匯入約一千五百萬筆的資料到 SQL Server <br /> 程式步驟說明 --- > 建立和資料表有相同欄位名稱與順序的 DataTable ``` DataTable testTable = new DataTable(); testTable.Columns.Add(new DataColumn("testCol1", typeof(string))); testTable.Columns.Add(new DataColumn("testCol2", typeof(int))); testTable.Columns.Add(new DataColumn("testCol3", typeof(DateTime))); ``` <br /> > 將建立好的 Datatable 欄位映射到資料庫資料表 ``` // 資料庫連線 SqlConnection con = new SqlConnection("連線資訊"); SqlBulkCopy testBulk = new SqlBulkCopy(con); // 設定每個批次中的資料列數目,提升效能 testBulk.BatchSize = 5000; testBulk.DestinationTableName = "目標資料表"; testBulk.ColumnMappings.Add("testCol1", "dbTableCol1"); testBulk.ColumnMappings.Add("testCol2", "dbTableCol2"); testBulk.ColumnMappings.Add("testCol3", "dbTableCol3"); ``` <br /> > BULK INSERT 匯入資料 ``` // 測試 400 個資料夾資料 for (int i = 0; i < 400; i++) { // 讀取檔案 string filePath = @"檔案路徑"; StreamReader fileStr = new StreamReader(filePath, System.Text.Encoding.Default); string line; // 新增一行 DataRow fileRow = testTable.NewRow(); ArrayList fileArray = new ArrayList(fileRow.ItemArray); // 取得 Model 欄位名稱 TABLE_MODEL colValue = new TABLE_MODEL(); PropertyInfo[] properties = colValue.GetType().GetProperties(); bool first = true; int rowNum = 1; // 讀取檔案所有行資料 while ((line = fileStr.ReadLine()) != null) { if (!first) fileRow = testTable.NewRow(); // 字串處理 string subStr1 = line.ToString().Substring(0, 2); string subStr2 = line.ToString().Substring(2, 2); string subStr3 = line.ToString().Substring(4, 2); colValue = new TABLE_MODEL() { dbTableCol1 = subStr1, dbTableCol2 = subStr2, dbTableCol3 = subStr3 }; // 紀錄資料 for (int p = 0; p < properties.Length; p++) { fileArray[p] = properties[p].GetValue(colValue); } fileRow.ItemArray = fileArray.ToArray(); testTable.Rows.Add(fileRow); first = false; rowNum++; } // 匯入 SQL Server testBulk.WriteToServer(testTable); testTable.Clear(); fileArray.Clear(); fileStr.DiscardBufferedData(); fileStr.Dispose(); fileStr.Close(); } // 關閉連線 con.Close(); ``` <br /> 結論 --- > 匯入總時間約為三分二十幾秒。使用 BULK INSERT 批量匯入資料可改善效能且降低電腦負擔,原匯入時間約為八小時,在時間上節省非常多。 <br /> ###### tags: `BULK INSERT` `SQL Server` `SqlBulkCopy` --- 參考資料 > https://www.c-sharpcorner.com/blogs/bulk-insert-in-sql-server-from-c-sharp