zoukankan      html  css  js  c++  java
  • 【ITOO 1】SQLBulkCopy实现不同数据库服务器之间的批量导入

    导读:在做项目的时候,当实现了动态建库后,需要实现从本地服务器上获取数据,批量导入到新建库的服务器中的一个表中去。之前是用了一个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,如果是从不同的数据库类型进行导入呢?

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


  • 相关阅读:
    MySQL主从数据库同步延迟问题解决(转)
    Python2.6升级Python2.7
    Socket网络编程
    Python 面向对象进阶
    Python类基础知识(面向对象基础)
    shell脚本中出现^M
    Centos6下Python3的编译安装
    Python成长之路(常用模块学习)
    SVN使用总结
    xshell锁屏
  • 原文地址:https://www.cnblogs.com/hhx626/p/6010385.html
Copyright © 2011-2022 走看看