由於最近的項目需要大量的數據從Excel導入到SQL Server數據庫當中,數據量非常大,綜合考濾了一下,采用SqlBulkCopy進行數據的導入。
由於Excel表中的表頭,與數據庫中的字段是不一樣的,所以需要添加映射。之前在這個地方走了許多彎路。項目實際情況如下。
項目中內容的呈現是用中文,而數據表頭是英文的。剛開始時是直接從Excel表中讀出數據,生成DataTable,添加自定義列(Excel中不存在姓名、用戶ID等),添加數據列表,然後直接修改DataTable的ColumnName,然後直接給SqlBulkCopy去更新到數據庫。結果出現錯誤,無法從String類型轉到Int,由於通過修改ColumnName,兩張表的結構是一致的,茫然了一陣。
通過分析,由於自己數據庫中的Id是自動增長的,而使用SqlBulkCopy時卻沒有沒有指定去映射相對應的表頭,所以造成這個問題。添加sqlBulkCopy.ColumnMappings即可解決。
結果導入成功後,卻發現有些數據是無法呈現,從過查找,發現Excel表中的單元格出現錯誤提醒“此單元格的數字為文本格式”。找了資料發現需要修改服務器的注冊表。相關的文章已經發布。
只貼關鍵代碼
--------------------------------------
ccl:ColumnMappings映射
tablename:需更新的表名
dataTable:導入的數據表
public static int SqlBulkCopyInsert(string tablename, DataTable dataTable, Hashtable ccl) { SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(T.getcs("")); foreach (string str in ccl.Keys) { sqlBulkCopy.ColumnMappings.Add(str, ccl[str].ToString()); } sqlBulkCopy.DestinationTableName = tablename; if (dataTable != null && dataTable.Rows.Count != 0) { sqlBulkCopy.WriteToServer(dataTable); sqlBulkCopy.Close(); return dataTable.Rows.Count; } else { sqlBulkCopy.Close(); return 0; }
}
--------------------------------------------