您的位置:首页 > 数据库 > SQL

SqlBulkCopy excel 字段映射解决办法一 修改中间件datatable 的 ColumnName 使之 与 目标表一致

2014-05-22 17:37 399 查看

利用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; }

}

--------------------------------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐