导读:在做项目的时候,当实现了动态建库后,需要实现从本地服务器上获取数据,批量导入到新建库的服务器中的一个表中去。之前是用了一个SQL脚本文件实现,但那时候没能实现不同的数据库服务器,现在用了SqlBulkCopy将其实现,现在说说具体过程。
一、SQLBulkCopy
1.1,概述
Microsoft SQL Server 提供一个称为 bcp 的流行的命令提示符实用工具,用于将数据从一个表移动到另一个表(表既可以在同一个服务器上,也可以在不同服务器上)。 SqlBulkCopy 类允许编写提供类似功能的托管代码解决方案。还有其他将数据加载到 SQL Server 表的方法(例如 INSERT 语句),但相比之下 SqlBulkCopy 提供明显的性能优势。
使用 SqlBulkCopy 类只能向 SQL Server 表写入数据。但是,数据源不限于 SQL Server;可以使用任何数据源,只要数据可加载到 DataTable 实例或可使用 IDataReader 实例读取数据。
1.2,属性
在本次实例中,用到了前三个属性。用于设置执行的批次数量,超时,和列映射定义。
二、具体实现
2.1,代码
<span style="font-family:KaiTi_GB2312;font-size:18px;"> /// <summary> /// 向不同的数据库服务器中插入资源表数据 2012.12.27 20:40 何红霞 /// </summary> /// <param name="data">需要导入的源数据</param> /// <param name="db">目标服务器</param> /// <param name="strTableName">目标表名</param> /// <param name="strDataComlumName">列映射对应数组</param> /// <returns>导入成功返回true,否则返回false</returns> public bool InsertToTable(DataTable data, DataBaseViewModel db, string strTableName,string[] strDataComlumName) { try { //连接sql数据库语句 using (SqlConnection conn = new SqlConnection(db.Key)) { if (conn.State != ConnectionState.Open) conn.Open(); using (SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(conn)) { // 列映射集合。 for (int i = 0; i < strDataComlumName.Length; i++) { sqlBulkCopy.ColumnMappings.Add(i,strDataComlumName[i]); } // 每一批次中的行数。在每一批次结束时,将该批次中的行发送到服务器。 sqlBulkCopy.BatchSize = data.Rows.Count; // 超时之前操作完成所允许的秒数。 sqlBulkCopy.BulkCopyTimeout = 60; // 服务器上目标表的名称。 sqlBulkCopy.DestinationTableName = strTableName; // 将data这个datatable中的表复制到目标表中。 sqlBulkCopy.WriteToServer(data); } if (conn.State != ConnectionState.Closed) conn.Close(); return true; } } catch (Exception ex) { return false; } }</span>
2.2,使用注意事项
1,在调用时,定义数组将表列名与数据源的列名一一对应起来。原因:sqlBulkCopy.ColumnMappings.Add(i,strDataComlumName[i]); 使用循环时,将列与列名限制了:i 对应的是列。
2,当插入数据中有默认值的话,需注意:假设源数据有A,B,C,D,E这几列,那么仅有最后一列为默认值时,可以只写入A,B,C,D。别的都不行,如果当B为默认值,而只导入了A,C,D,E,那么,就会发生:C—>B,D—>C,E—>D。
3,当把 SqlDateTime 类型的 DataTable 列批量加载到类型为 SQL Server 2008 中新增的日期/时间类型的 SQL Server 列时,SqlBulkCopy 将失败。
三、个人总结
虽然解决了当下的问题,那么其实新的问题又有了:问题1,如果是从多张表导入到一张表呢?问题2,如果是从一张表导入到多张表呢?问题3,如果是从不同的数据库类型进行导入呢?
还将继续研究。。。。。。。先总结到这儿。