神奇的 SqlBulkCopy

因为有利的开发环境,让我有机会来折腾一下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中   程序代码:
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数据库快更方便吧!
`SqlBulkCopy` 是 .NET Framework 中的一个类,用于将大量数据一次性批量插入到 SQL Server 数据库中,可以大大提高数据插入的效率。 使用 `SqlBulkCopy` 类可以实现以下几个优点: 1. 提高数据库操作效率:`SqlBulkCopy` 类可将大量数据一次性插入到数据库中,比逐条插入更高效。 2. 减少数据库操作次数:`SqlBulkCopy` 类可以将多个插入操作合并为一个操作,从而减少了数据库操作次数。 3. 简化代码:使用 `SqlBulkCopy` 类可以简化代码,使代码更易读、易维护。 使用 `SqlBulkCopy` 类的基本步骤如下: 1. 创建一个 `SqlConnection` 对象,用于连接到 SQL Server 数据库。 2. 创建一个 `SqlBulkCopy` 对象,指定要插入数据的目标表、连接对象等参数。 3. 创建一个数据源,可以使用 `DataTable` 或 `IDataReader` 对象。 4. 调用 `SqlBulkCopy` 对象的 `WriteToServer` 方法,将数据源中的数据批量插入到数据库中。 以下是一个使用 `SqlBulkCopy` 类将 `DataTable` 对象中的数据插入到 SQL Server 数据库中的示例代码: ```vb.net Using connection As New SqlConnection(connectionString) connection.Open() Using bulkCopy As New SqlBulkCopy(connection) bulkCopy.DestinationTableName = "dbo.MyTable" bulkCopy.WriteToServer(myDataTable) End Using End Using ``` 需要注意的是,`SqlBulkCopy` 类只能用于向 SQL Server 数据库中插入数据,不能用于更新或删除数据。同时,使用该类时需要注意数据源与目标表的列的对应关系,必须保证两者的列数和列名一致。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值