前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >速度超快:使用SqlBulkCopy导入DataTable数据到MSSQL数据库

速度超快:使用SqlBulkCopy导入DataTable数据到MSSQL数据库

作者头像
崔文远TroyCui
发布2019-02-26 16:28:27
1.4K0
发布2019-02-26 16:28:27
举报
文章被收录于专栏:远在上海远在上海

[URL=http://www.cuiwenyuan.com/shanghai/post/Import-Excel-Into-Database-via-NPOI2-In-CSharp-Web-Development.html]上篇文章[/URL]提到使用NPOI导入Excel到数据库,其实只完成了一半的工作,那就是Excel上传到服务器,然后读取到了内存的DataTable,最后面的插入数据库的操作是另一半工作。

相关的参考代码,原理就是创建一个临时表,把读取到内存的Excel数据(DataTable)使用SqlBulkCopy快速导入到数据库,然后再导入真正的业务表。在我导入13800条记录的时候,基本上10秒之内搞定,当然了最初用那个循环DataTable,然后再循环中使用Entity的方式添加,速度不知快了多少倍。

越多的业务开发,越来越感觉到吉日嘎拉的GPM平台的便利,现在基本上有一个数据维护管理类的应用,数据表根据模型建立好之后,基本上当天就能弄好。后期的工作重点要放在报表分析、复杂查询上了,因为这是用户喜欢用OA的理由之一。

<br/>#region public void SqlBulkCopyData(DataTable dt) 利用Net SqlBulkCopy 批量导入数据库,速度超快<br/>        /// <summary><br/>        /// 利用Net SqlBulkCopy 批量导入数据库,速度超快<br/>        /// </summary><br/>        /// <param name="dt">源内存数据表</param><br/>        public void SqlBulkCopyData(DataTable dt)<br/>        {<br/>            // SQL 数据连接<br/>            SqlConnection sqlConnection = null;<br/>            // 打开数据库<br/>            this.Open();<br/>            // 获取连接<br/>            sqlConnection = (SqlConnection)GetDbConnection();<br/>            using (SqlTransaction tran = sqlConnection.BeginTransaction())<br/>            {<br/>                // 批量保存数据,只能用于Sql<br/>                SqlBulkCopy sqlbulkCopy = new SqlBulkCopy(sqlConnection, SqlBulkCopyOptions.Default, tran);<br/>                // 设置源表名称<br/>                sqlbulkCopy.DestinationTableName = dt.TableName;<br/>                // 设置超时限制<br/>                sqlbulkCopy.BulkCopyTimeout = 1000;<br/><br/>                foreach (DataColumn dtColumn in dt.Columns)<br/>                {<br/>                    sqlbulkCopy.ColumnMappings.Add(dtColumn.ColumnName, dtColumn.ColumnName);<br/>                }<br/>                try<br/>                {<br/>                    // 写入<br/>                    sqlbulkCopy.WriteToServer(dt);<br/>                    // 提交事务<br/>                    tran.Commit();<br/>                }<br/>                catch<br/>                {<br/>                    tran.Rollback();<br/>                    sqlbulkCopy.Close();<br/>                }<br/>                finally<br/>                {<br/>                    sqlbulkCopy.Close();<br/>                    this.Close();<br/>                }<br/>            }<br/>        }<br/>        #endregion<br/>

<br/>if (dt != null)<br/>        {<br/>            // 用循环把数据一行行输出到缓冲流中<br/>            if (dt.Rows.Count <= 100)<br/>            {<br/>                for (int i = 0; i < dt.Rows.Count; i++)<br/>                {<br/>                    PurchasePriceComparisonEntity entity = new PurchasePriceComparisonEntity();<br/>                    entity.BPS = dt.Rows[i]["BPS"].ToString();<br/>                    entity.Family = dt.Rows[i]["Family"].ToString();<br/>                     entity.PartNumber = dt.Rows[i]["PartNumber"].ToString();<br/>                    entity.POPriceCurrentMonth = dt.Rows[i]["POPriceCurrentMonth"].ToString();<br/>                    entity.POPriceCurrentYear = dt.Rows[i]["POPriceCurrentYear"].ToString();<br/>                    entity.POPriceLastMonth = dt.Rows[i]["POPriceLastMonth"].ToString();<br/>                    entity.POPriceLastYear = dt.Rows[i]["POPriceLastYear"].ToString();<br/>                    entity.ProductGroup = dt.Rows[i]["ProductGroup"].ToString();<br/>                    entity.SPG = dt.Rows[i]["SPG"].ToString();<br/>                    entity.Supplier = dt.Rows[i]["Supplier"].ToString();<br/>                    entity.TotalPurchaseYTDSpendCurrentMonthPOPrice = dt.Rows[i]["TotalPurchaseYTDSpendCurrentMonthPOPrice"].ToString();<br/>                    entity.TotalPurchaseYTDSpendCurrentYearPOPrice = dt.Rows[i]["TotalPurchaseYTDSpendCurrentYearPOPrice"].ToString();<br/>                    entity.TotalPurchaseYTDSpendLastMonthPOPrice = dt.Rows[i]["TotalPurchaseYTDSpendLastMonthPOPrice"].ToString();<br/>                    entity.TotalPurchaseYTDSpendLastYearPOPrice = dt.Rows[i]["TotalPurchaseYTDSpendLastYearPOPrice"].ToString();<br/>                    entity.YTDPurchaseQTY = float.Parse(dt.Rows[i]["YTDPurchaseQTY"].ToString());<br/>                    // 追加到数据库<br/>                    manager.Add(entity);<br/>                    // 置空<br/>                    //entity = null;<br/>                }<br/>            }<br/>            // 快速导入<br/>            else<br/>            {<br/>                // 指定表名<br/>                dt.TableName = "PurchasePriceComparisonTemp";<br/>                manager.SqlBulkImport(dt);<br/>            }<br/>        }<br/>        // 清空掉dt里的内容<br/>        dt = null;<br/>

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2013年12月19日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档