SqlBulkCopy批量插入数据


ADO.Net2.0中提供了SqlBulkCopy类 
SqlBulkCopy 类 
• DestinationTableName:目标数据库的表名 
• BulkCopyTimeout:指定操作完成的Timeout时间 
• NotifyAfter:指定通知通知事件前处理的数据行数 
• WriteToServer方法:将数据源拷备到目标数据库 
• SqlBulkCopy DesBulkOp = new SqlBulkCopy(DesConString, SqlBulkCopyOptions.UseInternalTransaction); 
– 指定了目标数据库,使用 SqlBulkCopyOptions.UseInternalTransaction是指迁移动作指定 在一个Transaction当中,如果数据迁移中产生错误或异常将发生回滚。 
• 使用SqlBulkCopy 类只能向SQL Server 表写入数据。但是,数据源不限于SQL Server;可以使用任何数据源,只要数据可加载到DataTable 实例或可使用IDataReader 实例读取数据。


 protected void btnGet_Click(object sender, EventArgs e)
        {
            DateTime beginTime = DateTime.Now;
            Response.Write("开始时间:" + beginTime.ToString("yyyy年MM月dd日:HH:mm:ss:fff"));


            //构造一个Datatable存储将要批量导入的数据
            DataTable dt = new DataTable();
            dt.Columns.Add("id", typeof(string));
            dt.Columns.Add("name", typeof(string));

            // 见识下SqlBulkCopy强悍之处,来个十万条数数据试验
            int i;
            for (i = 0; i < 100000; i++)
            {
                DataRow dr = dt.NewRow();
                dr["id"] = i.ToString();
                dr["name"] = "companyname" + string.Format("{0:0000}", i);
                dt.Rows.Add(dr);
            }


            //string str = ConfigurationManager.ConnectionStrings["sqlConnection"].ConnectionString.ToString();
            string str= ConfigurationManager.ConnectionStrings["sqlConnection202"].ConnectionString.ToString();
            //声明数据库连接
            SqlConnection conn = new SqlConnection(str);


            conn.Open();
            //声明SqlBulkCopy ,using释放非托管资源
            using (SqlBulkCopy sqlBC = new SqlBulkCopy(conn))
            {
                //一次批量的插入的数据量
                sqlBC.BatchSize = 1000;
                //超时之前操作完成所允许的秒数,如果超时则事务不会提交 ,数据将回滚,所有已复制的行都会从目标表中移除
                sqlBC.BulkCopyTimeout = 60;                

                //設定 NotifyAfter 属性,以便在每插入10000 条数据时,呼叫相应事件。  
                sqlBC.NotifyAfter = 10000;
                sqlBC.SqlRowsCopied += new SqlRowsCopiedEventHandler(OnSqlRowsCopied);

                //设置要批量写入的表
                sqlBC.DestinationTableName = "dbo.test";

                //自定义的datatable和数据库的字段进行对应
                sqlBC.ColumnMappings.Add("id", "ID");
                sqlBC.ColumnMappings.Add("name", "Name");

                //批量写入
                sqlBC.WriteToServer(dt);
            }
            conn.Dispose();
            Response.Write("<br/>");

            DateTime endTime = DateTime.Now;
            Response.Write("结束时间:" + endTime.ToString("yyyy年MM月dd日:HH:mm:ss:fff"));
            TimeSpan useTime = endTime - beginTime;//使用时间
            Response.Write("<br/>插入时间:" + useTime.TotalSeconds.ToString() + "秒"); 
        }


        //响应时事件
        void OnSqlRowsCopied(object sender, SqlRowsCopiedEventArgs e)
        {
            Response.Write("<br/> OK! ");
        }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值