SqlBulkCopy excel 字段映射解决办法一 修改中间件datatable 的 ColumnName 使之 与 目标表一致
利用SqlBulkCopy导入Excel数据库
由于最近的项目需要大量的数据从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; }
}
--------------------------------------------