微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

神奇的 SqlBulkCopy 高性能批量导入sqlserver


因为有利的开发环境,让我有机会来折腾一下ADO中的sqlBulkcopy这个功能。因为曾经公司做过库迁移,把数据从MSsql2005迁到ORACLE下,当时本人用C#写了一个迁移工具,因当时对.NET操作数据库只是一般的熟练,没能发挥它的最佳性能方法,写出来的工具在导数据的时候显示有点慢,后来改用BCP来导,BCP做数据导入还是非常快。时过几个月,心想自己再优化一下算法和方法,让数据迁移更快更方便,于是今天就先折腾一下.NET中的BCP批量导入功能. 测试环境: 1、WINDOWS SERVER 2003 +MSsql2005(服务器) 2、LINUX+ORACLE 10G(服务器) 3、本人电脑配置:Pentium D 2.8G+2G内存 4、 本人操作系统:WINDOWS XP+VS2005+.NET FRAMEWORK2.0 5、从ORACLE数据库中导一张82万的数据到MSsql2005中  程序代码: view plaincopy to clipboardprint?
using System;  
using System.Data.sqlClient;  
using System.Data.OracleClient;  
 
class Program  
 
{  
    static void Main()  
 
    {  
        string connectionString = GetoracleConnectionString();  
 
       try 
 
        {  
 
        using (OracleConnection sourceConnection = new OracleConnection(connectionString))  
 
        {  
 
            sourceConnection.open();  
 
            OracleCommand commandRowCount = new OracleCommand( "SELECT COUNT(*) FROM 表",sourceConnection);  
 
            long countStart = System.Convert.ToInt32(  
 
            commandRowCount.ExecuteScalar());  
 
            Console.WriteLine("Starting row count = {0}",countStart);  
 
        DateTime Dt1=DateTime.Now;  
 
            Console.WriteLine("Start Reading Data....");  
 
            string sqltxt="select * from 表";  
 
            OracleCommand commandSourceData = new OracleCommand(sqltxt,sourceConnection);  
 
            OracleDataReader reader =  
 
            commandSourceData.ExecuteReader();  
 
       string desconnectionString=GetMsConnectionString();  
 
            Console.WriteLine("Start Moveing Data....");  
 
            using (sqlConnection destinationConnection = new sqlConnection(desconnectionString))  
 
            {  
 
                destinationConnection.open();  
 
                using (sqlBulkcopy bulkcopy = new sqlBulkcopy(destinationConnection))  
 
                {  
 
                   bulkcopy.BulkcopyTimeout=5000000;  
 
 
                    bulkcopy.DestinationTableName ="dbo.表";  
 
                    try 
 
                    {  
 
                        bulkcopy.WritetoServer(reader);  
 
                    }  
 
                    catch (Exception ex)  
 
                    {  
 
                        Console.WriteLine(ex.Message);  
 
                    }  
 
                    finally 
 
                    {  
 
                        reader.Close();  
 
                    }  
 
 
                }  
 
        DateTime Dt2=DateTime.Now;  
 
        TimeSpan CountTime=Dt2.Subtract(Dt1);  
 
                long countEnd = System.Convert.ToInt32(  
 
                commandRowCount.ExecuteScalar());  
 
                Console.WriteLine("Ending row count = {0}",countEnd);  
 
                Console.WriteLine("{0} rows were added.",countEnd - countStart);  
 
                Console.WriteLine("用时:"+CountTime.Minutes.ToString()+"分"+CountTime.Seconds.ToString()+"秒"+CountTime.Milliseconds.ToString()+"毫秒");  
 
                Console.WriteLine("Press Enter to finish.");  
 
                Console.ReadLine();  
 
            }  
 
        }  
 
    }  
 
    catch(Exception ex)  
 
    {  
 
        Console.Write(ex.ToString());  
 
    }  
 
  }  
 
    private static string GetMsConnectionString()  
 
    {  
        return "uid=用户名;password=密码;database=库;server=192.168.X.X//sql2005";  
 
    }  
 
    private static string GetoracleConnectionString()  
 
    {  
 
        return "Data Source=库;User ID=用户名;Password=密码";  
 
    }  
 

using System;
using System.Data.sqlClient;
using System.Data.OracleClient;

class Program

{
    static void Main()

    {
        string connectionString = GetoracleConnectionString();

       try

        {

        using (OracleConnection sourceConnection = new OracleConnection(connectionString))

        {

            sourceConnection.open();

            OracleCommand commandRowCount = new OracleCommand( "SELECT COUNT(*) FROM 表",sourceConnection);

            long countStart = System.Convert.ToInt32(

            commandRowCount.ExecuteScalar());

            Console.WriteLine("Starting row count = {0}",countStart);

     DateTime Dt1=DateTime.Now;

            Console.WriteLine("Start Reading Data....");

            string sqltxt="select * from 表";

            OracleCommand commandSourceData = new OracleCommand(sqltxt,sourceConnection);

            OracleDataReader reader =

            commandSourceData.ExecuteReader();

    string desconnectionString=GetMsConnectionString();

            Console.WriteLine("Start Moveing Data....");

            using (sqlConnection destinationConnection = new sqlConnection(desconnectionString))

            {

                destinationConnection.open();

                using (sqlBulkcopy bulkcopy = new sqlBulkcopy(destinationConnection))

                {

                   bulkcopy.BulkcopyTimeout=5000000;


                    bulkcopy.DestinationTableName ="dbo.表";

                    try

                    {

                        bulkcopy.WritetoServer(reader);

                    }

                    catch (Exception ex)

                    {

                        Console.WriteLine(ex.Message);

                    }

                    finally

                    {

                        reader.Close();

                    }


                }

  DateTime Dt2=DateTime.Now;

  TimeSpan CountTime=Dt2.Subtract(Dt1);

                long countEnd = System.Convert.ToInt32(

                commandRowCount.ExecuteScalar());

                Console.WriteLine("Ending row count = {0}",countEnd);

                Console.WriteLine("{0} rows were added.",countEnd - countStart);

                Console.WriteLine("用时:"+CountTime.Minutes.ToString()+"分"+CountTime.Seconds.ToString()+"秒"+CountTime.Milliseconds.ToString()+"毫秒");

                Console.WriteLine("Press Enter to finish.");

                Console.ReadLine();

            }

        }

    }

    catch(Exception ex)

    {

     Console.Write(ex.ToString());

    }

  }

    private static string GetMsConnectionString()

    {
        return "uid=用户名;password=密码;database=库;server=192.168.X.X//sql2005";

    }

    private static string GetoracleConnectionString()

    {

        return "Data Source=库;User ID=用户名;Password=密码";

    }

}经测试通过 从ORACLE中导一张82万条数据的表到sql2005中只花了2分钟多一点,当时我我非常惊讶,就连BCP导入也没这么快过,让我惊叹不已。 数据源可以是任意,但目标数据库一定要是MSsql,这让我感到有点不爽,因为ORACLE.DATA.ORACLECLIENT命名空间没有这个类,也就是说你可以 从任何源数据导到MSsql,这或许是微软的一种战略,让别人从其它数据库切换到MS数据库快更方便吧!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐