导读:在做项目的时候,当实现了动态建库后,需要实现从本地服务器上获取数据,批量导入到新建库的服务器中的一个表中去。之前是用了一个SQL脚本文件实现,但那时候没能实现不同的数据库服务器,现在用了SqlBulkCopy将其实现,现在说说具体过程。


一、SQLBulkCopy

1.1,概述

Microsoft SQL Server 提供一个称为 bcp 的流行的命令提示符实用工具,用于将数据从一个表移动到另一个表(表既可以在同一个服务器上,也可以在不同服务器上)。 SqlBulkCopy 类允许编写提供类似功能的托管代码解决方案。还有其他将数据加载到 SQL Server 表的方法(例如 INSERT 语句),但相比之下 SqlBulkCopy 提供明显的性能优势。
使用 SqlBulkCopy 类只能向 SQL Server 表写入数据。但是,数据源不限于 SQL Server;可以使用任何数据源,只要数据可加载到 DataTable 实例或可使用 IDataReader 实例读取数据。

我想了解更多关于SQLBulkCopy

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,如果是从不同的数据库类型进行导入呢?

还将继续研究。。。。。。。先总结到这儿。


posted on 2015-12-30 11:28  何红霞  阅读(301)  评论(0编辑  收藏  举报