由于最近的項(xiàng)目需要大量的數(shù)據(jù)從Excel導(dǎo)入到SQLServer數(shù)據(jù)庫(kù)當(dāng)中,數(shù)據(jù)量非常大,綜合考濾了一下,采用SqlBulkCopy進(jìn)行數(shù)據(jù)的導(dǎo)入。
由于Excel表中的表頭,與數(shù)據(jù)庫(kù)中的字段是不一樣的,所以需要添加映射。之前在這個(gè)地方走了許多彎路。項(xiàng)目實(shí)際情況如下。
項(xiàng)目中內(nèi)容的呈現(xiàn)是用中文,而數(shù)據(jù)表頭是英文的。剛開(kāi)始時(shí)是直接從Excel表中讀出數(shù)據(jù),生成DataTable,添加自定義列(Excel中不存在姓名、用戶ID等),添加數(shù)據(jù)列表,然后直接修改DataTable的ColumnName,然后直接給SqlBulkCopy去更新到數(shù)據(jù)庫(kù)。結(jié)果出現(xiàn)錯(cuò)誤,無(wú)法從String類型轉(zhuǎn)到Int,由于通過(guò)修改ColumnName,兩張表的結(jié)構(gòu)是一致的,茫然了一陣。
通過(guò)分析,由于自己數(shù)據(jù)庫(kù)中的Id是自動(dòng)增長(zhǎng)的,而使用SqlBulkCopy時(shí)卻沒(méi)有沒(méi)有指定去映射相對(duì)應(yīng)的表頭,所以造成這個(gè)問(wèn)題。添加sqlBulkCopy.ColumnMappings即可解決。
結(jié)果導(dǎo)入成功后,卻發(fā)現(xiàn)有些數(shù)據(jù)是無(wú)法呈現(xiàn),從過(guò)查找,發(fā)現(xiàn)Excel表中的單元格出現(xiàn)錯(cuò)誤提醒“此單元格的數(shù)字為文本格式”。找了資料發(fā)現(xiàn)需要修改服務(wù)器的注冊(cè)表。相關(guān)的文章已經(jīng)發(fā)布。
只貼關(guān)鍵代碼
--------------------------------------
ccl:ColumnMappings映射
tablename:需更新的表名
dataTable:導(dǎo)入的數(shù)據(jù)表
publicstaticintSqlBulkCopyInsert(stringtablename,DataTabledataTable,Hashtableccl) { SqlBulkCopysqlBulkCopy=newSqlBulkCopy(T.getcs("")); foreach(stringstrinccl.Keys) { sqlBulkCopy.ColumnMappings.Add(str,ccl[str].ToString()); } sqlBulkCopy.DestinationTableName=tablename; if(dataTable!=null&&dataTable.Rows.Count!=0) { sqlBulkCopy.WriteToServer(dataTable); sqlBulkCopy.Close(); returndataTable.Rows.Count; } else { sqlBulkCopy.Close(); return0; }
}
--------------------------------------------
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注