注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

sql大数据量插入的问题之一使用SqlBulkCopy  

2013-01-05 14:58:53|  分类: NET(C#) |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
 

sql大数据量插入的问题之一使用SqlBulkCopy

大数据里的插入始终是一个数据库IO的瓶颈的问题,但具体到工作上又会经常遇到,这次就把几种方法分析对比一下。以sqlserver2008为例,因为目前别的数据库用到的还是比较少。

方法大致有以下几种:

一、SqlBulkCopy方法,这是微软提供的一种方法。

二、数据库自定义表类型存储过程方法。

三、普通存储过程方法(区分是否启用事物)

今天主要把第一种说一下,先看代码:

        public bool BulkInsert(string tablename, ref DataTable dt)

        {

            bool bRet = false;

 

            //进行事物级更新

            using (SqlTransaction trans = DbAccess.SQLSERVER.BeginTransaction())

            {

                SqlBulkCopy sqlbulkCopy = new SqlBulkCopy(this.m_Connection, SqlBulkCopyOptions.TableLock, trans);

                // 批量保存数据,只能用于Sql

                sqlbulkCopy.DestinationTableName = tablename;     // 设置源表名称

                sqlbulkCopy.BulkCopyTimeout = 120;                // 设置超时限制

                sqlbulkCopy.BatchSize = dt.Rows.Count;

 

                try

                {

                    if (null != dt && dt.Rows.Count > 0)

                    {

                        sqlbulkCopy.WriteToServer(dt);

                    }

                    trans.Commit();

                    bRet = true;

                }

                catch

                {

                    bRet = false;

                    trans.Rollback();

                }

                finally

                {

                    sqlbulkCopy.Close();

                }

            }

 

            return bRet;

        }

不过,前面计算数据的拷贝,不再列举了,很简单,就是内存DataTable的来回拷贝,这个相当麻烦,一不小心数据就错了。

这里面的参数只有超时这个有点儿说道,虽然很简单想着还是废句话吧。在数据库操作过程中,如果遇到数据库忙或者通信不畅,在设定超时时限超过时,即使有拷贝进去的数据,数据也会删除回到原来的情况,也就是说插入没有成功,但没有影响实际数据恢复到原貌。

在这里建议大家一定要使用事物,这样可以保证数据的原子性。

另外,一定要记得做好数据异常的控制,对于这个类可以进行多个数据表一次性拷贝,是因为这样的效率是比较高的。具体的例子可以看MSDN,非常明确。

既然使用事物,还有另外一种方法,大家可以照着帮助做,那就是直接在SqlBulkCopy类的构造函数中使用一个事物,那么这个操作就会在这个事物中进行。

需要注意的是,这个类没有提供回滚操作,如果一旦操作错误,那么数据是无法回滚到原貌的。

这里有一个问题,在MSDN里对超时说是有事物回滚的,不太清楚是不是指的是要显式的指明事物,反正大家在用得时候儿自己显式的指明事物就可以了。

纸上学来终是浅,绝知此事要躬行。

  评论这张
 
阅读(956)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017