日期:2014-06-10  浏览次数:20588 次

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

        }

--------------------------------------------