• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C#利用SqlBulkCopy大批量导入excel文件进入SQL

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

 

   public void BuckCopy(DataTable dt, string destinationTableName)
        {
            using (SqlConnection sqlConn = (SqlConnection)this.CurrentDataBase.CreateConnection())
            {
                if (sqlConn.State != ConnectionState.Open)
                    sqlConn.Open();
                using (SqlBulkCopy buckCopy = new SqlBulkCopy(sqlConn))
                {
                    buckCopy.DestinationTableName = destinationTableName;
                    buckCopy.ColumnMappings.Add("ID", "ID");                    
                    buckCopy.WriteToServer(dt);
                }
            }
        }

 升级,动态mapping

  /// <summary>
        /// 将datatable数据bulkcopy进SQL table
        /// </summary>
        /// <param name="dt"></param>
        /// <param name="tablename"></param>
        /// <param name="_constring"></param>
        public static void SqlBulkCopy(DataTable dt, string tablename, string _constring)
        {
            try
            {
                using (SqlConnection sqlConn = new SqlConnection(_constring))
                {
                    if (sqlConn.State != ConnectionState.Open)
                        sqlConn.Open();
                    /*查询数据 tablename对应的字段*/
                    string[] restrictions = new string[4];
                    restrictions[1] = "dbo";
                    restrictions[2] = tablename;
                    /*获取table的列*/
                    DataTable tableinfo = sqlConn.GetSchema("Columns", restrictions);
                    if (tableinfo.Rows.Count > 0)
                    {
                        using (SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlConn))
                        {
                            bulkCopy.BulkCopyTimeout = _timeout;
                            bulkCopy.DestinationTableName = tablename;
                            bulkCopy.BatchSize = 1000;//每1000条提交一次
                            foreach (DataColumn dc in dt.Columns)
                            {
                                foreach (DataRow dr in tableinfo.Rows)
                                {
                                    //动态mapping字段,大小写可以忽略
                                    if (dc.ColumnName.ToLower() == dr["COLUMN_NAME"].ToString().ToLower())
                                    {
                                        bulkCopy.ColumnMappings.Add(dc.ColumnName, dr["COLUMN_NAME"].ToString());
                                        break;//只要匹配到就跳出该次循环,进行下一次
                                    }
                                }
                            }
                            bulkCopy.WriteToServer(dt);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                LogHelper.Error("Error:Connercthelper SqlBulkCopy", ex);
                throw;
            }



        }

测试6W条数据,大概9-10秒。如果mapping是写死的,应该要快一些。

又重新重载了一下方法:支持调用的时候先mapping好。

        /// <summary>
        ///  将datatable数据bulkcopy进SQL table
        /// </summary>
        /// <param name="dt"></param>
        /// <param name="tablename"></param>
        /// <param name="_constring"></param>
        /// <param name="columnmapping">自定义mapping column</param>
        public static void SqlBulkCopy(DataTable dt, string tablename, string _constring, SqlBulkCopyColumnMapping[] columnmapping)
        {
            try
            {
                  using (SqlConnection sqlConn = new SqlConnection(_constring))
                  {
                      if (sqlConn.State != ConnectionState.Open)
                          sqlConn.Open();
                       using (SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlConn))
                       {
                           bulkCopy.BulkCopyTimeout = _timeout;
                           bulkCopy.DestinationTableName = tablename;
                           bulkCopy.BatchSize = 1000;//每1000条提交一次
                           //循环mapping
                           foreach(SqlBulkCopyColumnMapping map in columnmapping)
                           {
                               bulkCopy.ColumnMappings.Add(map);
                           }
                           bulkCopy.WriteToServer(dt);
                       }
                  }
            }
            catch (Exception ex)
            {
                LogHelper.Error("Error:Connercthelper SqlBulkCopy", ex);
                throw;
            }
        }

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
《EffectiveC#》读书笔记(3)发布时间:2022-07-13
下一篇:
韩磊:C#编程风格发布时间:2022-07-13
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap