# 工作筆記 #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