zoukankan      html  css  js  c++  java
  • 大批量插入数据

    SqlBulkCopy快速插入大量数据,缺点就是不能查重

    转载2015-09-26 11:59:05

    相比常用insert语句,在需要插入数十万百万数据的时候,利用insert插入的速度相当慢,但其好处就是在可以在插入前进行查重,我们可以写一个存储过程,通过判断插入的数据是否有重复,无则添加有则更新这些操作。但速度也是相当慢,而SqlBulkCopy的速度确实相当快,相比能有几十倍的速度。这边我就不说insert怎么操作了。但SqlBulkCopy的缺点就在于插入数据的时候不能同时进行查重,不知道是否是我没找到更好的方法。

    1,在插入之前​,我们可以写一个方法拼接SqlBulkCopyColumnMapping,如下对应有数据表中的四个字段。

    public SqlBulkCopyColumnMapping[] GetMapping() 

     { SqlBulkCopyColumnMapping[] mapping = newSqlBulkCopyColumnMapping[4]; 

     mapping[0] = new SqlBulkCopyColumnMapping("ID", "ID"); 

     mapping[1] = new SqlBulkCopyColumnMapping("Name", "Name"); 

     mapping[2] = new SqlBulkCopyColumnMapping("sex", "sex"); 

     mapping[3] = new SqlBulkCopyColumnMapping("phone", "phone"); 

    return mapping;

     }

    2,这里就进行大批量​操作,首先我们把大量的数据放在一个datatable上,然后再传送过来。datatable的行列也要对应数据的字段。

    /// 数据源 

    /// 目标表即需要插入数据的数据表名称如"User_1" 

    public static bool MySqlBulkCopy(DataTable Table, string DestinationTableName) { 

    bool Bool = true; 

    string ConnectionString ="server=localhost;database=10wan;uid=datauser;pwd=1";

    using (SqlConnection con = new SqlConnection(ConnectionString)) { con.Open();using (SqlTransaction Tran = con.BeginTransaction())//应用事物 { using(SqlBulkCopy Copy = new SqlBulkCopy(con, SqlBulkCopyOptions.KeepIdentity, Tran)) 

     { Copy.DestinationTableName = DestinationTableName;//指定目标表SqlBulkCopyColumnMapping[] Mapping = GetMapping();//获取映射关系 

    if (Mapping != null) { 

    //如果有数据 

    foreach (SqlBulkCopyColumnMapping Map in Mapping)

     { Copy.ColumnMappings.Add(Map); } 

     } 

    try { 

     Copy.WriteToServer(Table);

    ​//批量添加 

     Tran.Commit();

    ​//提交事务 

     } 

    catch { Tran.Rollback();//回滚事务 Bool = false; } } } } 

    return Bool; }​​

    当然也可以将这两个方法统一起来​,如下

       ///

            /// SqlBulkCopy批量插入数据

            ///

            ///

            public static void InsertDa(DataTable dt)

            {

                string str= "server=localhost;database=10wan;uid=datauser;pwd=1";

                //声明数据库连接

                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 = "AirPrices";

                    //自定义的datatable和数据库的字段进行对应

                    sqlBC.ColumnMappings.Add("ID", "ID");

                    sqlBC.ColumnMappings.Add("Name", "Name");

                    sqlBC.ColumnMappings.Add("sex", "sex");

                    sqlBC.ColumnMappings.Add("phone", "phone");

                    //批量写入

                    sqlBC.WriteToServer(dt);

                }

                conn.Dispose();

            }

  • 相关阅读:
    微信朋友圈怎么发文字?如何只发文字和表情?
    微信将推指纹支付 "指付通"会与Touch ID整合吗
    微信公众平台上传图片很卡 微信整合京东的关系?
    微信公众平台可以修改名称吗?微信认证时可以改名!
    怎样制作漂亮的微信二维码?用在线二维码生成器!
    微信网页版APP
    织梦channelid是什么?dede channel typeid有什么区别
    微信消息如何添加文字链接?【微信公众平台技巧】
    为什么在有些文章末尾加一张收录截图?
    5步教你设置微信自定义菜单【微信公众平台技巧】
  • 原文地址:https://www.cnblogs.com/momjs/p/5688870.html
Copyright © 2011-2022 走看看