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

[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/>

Loading

《速度超快:使用SqlBulkCopy导入DataTable数据到MSSQL数据库》上有1条评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据