准备条件:20万+数据

界面设计使用的WPF。

没有对比就没有伤害,以下是我两种方式导入数据案例。

运行 结果对比:

首先使用一般sql语句导入,因为时间原因,我就没有等待程序执行完,但是我记录了大约需要多少时间,以及执行了多少时间。
导入数据共计:258113条,执行了38秒,已经入库了6971条,大约还需要1429秒。(不去考虑电脑配置,界面数据加载耗时等因素)

接下来我们看看同样的数据量 SqlBulkCopy效果如何:

当我注释代码中使用异步操作,当然,界面会出现假死状态。再来看看运行结果。

解析数据时间明显减少。

以下是这个测试工具的全部代码:

    /// <summary>/// BatchImportForm.xaml 的交互逻辑/// </summary>public partial class BatchImportForm : Window{ private static readonly string ConnStr = ConfigurationManager.ConnectionStrings["myconnStr"].ConnectionString;public BatchImportForm(){InitializeComponent();}private void BtnQueryImport_Click(object sender, RoutedEventArgs e){var filePath = GetFilePath();if (!string.IsNullOrEmpty(filePath)){// 防止界面假死状态Task task = Task.Factory.StartNew(() =>{SqlWork(filePath);});}}private string GetFilePath(){// 读取文本文件OpenFileDialog ofd = new OpenFileDialog();ofd.InitialDirectory = System.Environment.CurrentDirectory+ "\\Resources\\Txt"; // @"C:\Users\WenDaoJun\Documents\Visual Studio 2015\Projects\JWell\JWell.Cloud.UI\Resources\Txt";ofd.Title = "读取文件";ofd.FileName = "";ofd.RestoreDirectory = true;ofd.Filter = "所有文件(*.*)|*.*|文本文件(*.txt)|*.txt";ofd.ValidateNames = true;ofd.CheckFileExists = true;ofd.CheckPathExists = true;string strName = string.Empty;if (ofd.ShowDialog() == true){strName = ofd.FileName;}if (strName == ""){MessageBox.Show("没有选择文件!");return null;}return strName;}private void BtnQueryImportTwo_Click(object sender, RoutedEventArgs e){string filePath = GetFilePath();//if (!string.IsNullOrEmpty(filePath))//{//    Task task = Task.Factory.StartNew(() =>//      {//          SqlBulkWord(filePath);//      });//}
             SqlBulkWord(filePath);}/// <summary>/// 第一种方法/// </summary>/// <param name="fuillPath"></param>private void SqlWork(string fuillPath){var lines = File.ReadAllLines(fuillPath, Encoding.Default);// 异步给控件赋值this.Dispatcher.Invoke(() => { this.JingDuOn.Maximum = lines.Length; });this.Dispatcher.Invoke(() => { this.LblRuKuOne.Content = lines.Length; });using (SqlConnection conn = new SqlConnection(ConnStr)){conn.Open();var t1 = DateTime.Now;for (int i = 0; i < lines.Length; i++){// 拼接数据// 解析文本文件  "\"号段\"\t\"所属地区\"\t\"号码类型\"\t\"区号\"" var strs = lines[i].Split('\t');var telNumber = strs[0].Trim('"');var telArea = strs[1].Trim('"');var telType = strs[2].Trim('"');var telAreaCode = strs[3].Trim('"');// 入库using (SqlCommand cmd = conn.CreateCommand()){cmd.CommandText = @"insert into TelNum(TelNumber,TelType,TelArea,TelAreaCode) values(@TelNumber,@TelType,@TelArea,@TelAreaCode)";cmd.Parameters.Add(new SqlParameter("@TelNumber", telNumber));cmd.Parameters.Add(new SqlParameter("@TelType", telArea));cmd.Parameters.Add(new SqlParameter("@TelArea", telType));cmd.Parameters.Add(new SqlParameter("@TelAreaCode", telAreaCode));cmd.ExecuteNonQuery();//异步委托 this.JingDuOn.Dispatcher.Invoke(() => { this.JingDuOn.Value += 1; });this.LblJinDuOne.Dispatcher.Invoke(() => { this.LblJinDuOne.Content = i; });}var t2 = DateTime.Now;var tsp = t2 - t1;// 异步给控件赋值this.LblHaoShiOne.Dispatcher.Invoke(() => { this.LblHaoShiOne.Content = tsp.TotalSeconds; });this.LblZongHaoShiOne.Dispatcher.Invoke(() => { this.LblZongHaoShiOne.Content = $"倒计时{(tsp.TotalSeconds * lines.Length / (i + 1))}秒完成。"; });}}}/// <summary>/// 第二种方法/// </summary>/// <param name="filePath"></param>private void SqlBulkWord(string filePath){var lines = File.ReadAllLines(filePath, Encoding.Default);this.Dispatcher.Invoke(() => { this.JingDuTwo.Maximum = lines.Length; });this.Dispatcher.Invoke(() => { this.LblRuKuTwo.Content = lines.Length; });var t1 = DateTime.Now;// 创建入库需要的数据源 DataTableDataTable dt = new DataTable();dt.Columns.Add(new DataColumn("TelNumber", typeof(string)));dt.Columns.Add(new DataColumn("TelType", typeof(string)));dt.Columns.Add(new DataColumn("TelArea", typeof(string)));dt.Columns.Add(new DataColumn("TelAreaCode", typeof(string)));for (int i = 0; i < lines.Length; i++){var row = dt.NewRow();// 拼接数据// 解析文本文件  "\"号段\"\t\"所属地区\"\t\"号码类型\"\t\"区号\"" var strs = lines[i].Split('\t');row["TelNumber"] = strs[0].Trim('"');row["TelType"] = strs[1].Trim('"');row["TelArea"] = strs[2].Trim('"');row["TelAreaCode"] = strs[3].Trim('"');dt.Rows.Add(row);this.JingDuTwo.Dispatcher.Invoke(() => { this.JingDuTwo.Value += 1; });this.LblJinDuTwo.Dispatcher.Invoke(() => { this.LblJinDuTwo.Content = i; });}var t2 = DateTime.Now;var tsp = t2 - t1;this.LblHaoShiTwo.Dispatcher.Invoke(() => { this.LblHaoShiTwo.Content = tsp.TotalSeconds; });// 入库计时var sw = new Stopwatch();sw.Start(); using (SqlBulkCopy sbk = new SqlBulkCopy(ConnStr)){//表名sbk.DestinationTableName = "TelNum";//DataTable中的列名和数据库中列名对应sbk.ColumnMappings.Add("TelNumber", "TelNumber");sbk.ColumnMappings.Add("TelType", "TelType");sbk.ColumnMappings.Add("TelArea", "TelArea");sbk.ColumnMappings.Add("TelAreaCode", "TelAreaCode");sbk.WriteToServer(dt);}sw.Stop();this.LblZongHaoShiTwo.Dispatcher.Invoke(() => { this.LblZongHaoShiTwo.Content=sw.Elapsed.TotalSeconds; });}}

转载于:https://www.cnblogs.com/wendj/p/9015018.html

C# SqlBulkCopy数据批量入库相关推荐

  1. Spring Boot实战解决高并发数据入库: Redis 缓存+MySQL 批量入库

    前言 最近在做阅读类的业务,需要记录用户的PV,UV: 项目状况:前期尝试业务阶段: 特点: 快速实现(不需要做太重,满足初期推广运营即可) 快速投入市场去运营 收集用户的原始数据,三要素: 谁 在什 ...

  2. 高并发简单解决方案————redis队列缓存+mysql 批量入库(ThinkPhP)

    源码地址:https://github.com/Tinywan/PHP_Experience 问题分析 问题一:要求日志最好入库:但是,直接入库mysql确实扛不住,批量入库没有问题,done.[批量 ...

  3. dataset中的数据批量导入oracle数据库,c#如何将dataset中的数据批量导入oracle数据库...

    c#如何将dataset中的数据批量导入oracle数据库以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! c#如何将da ...

  4. redis队列缓存 + mysql 批量入库 + php离线整合

    需求背景:有个调用统计日志存储和统计需求,要求存储到mysql中:存储数据高峰能达到日均千万,瓶颈在于直接入库并发太高,可能会把mysql干垮. 问题分析 思考:应用网站架构的衍化过程中,应用最新的框 ...

  5. 关于SqlBulkCopy SQL批量导入需要注意,列名是区分大小写的

    最近在做数据从Excel批量导入MSSQL时,传统的是使用Insert Into Table方法,不过这个方便比较慢 通过使用 SqlBulkCopy 可以批量导入到数据库. 默认批量导入数据库,需要 ...

  6. C#中几种数据库的大数据批量插入

    C#语言中对SqlServer.Oracle.SQLite和MySql中的数据批量插入是支持的,不过Oracle需要使用Orace.DataAccess驱动. IProvider里有一个用于实现批量插 ...

  7. 【转】几种数据库的大数据批量插入

    在之前只知道SqlServer支持数据批量插入,殊不知道Oracle.SQLite和MySql也是支持的,不过Oracle需要使用Orace.DataAccess驱动,今天就贴出几种数据库的批量插入解 ...

  8. 【高级内部资料】.NET数据批量写入性能分析 第一篇

    [高级内部资料].NET数据批量写入性能分析 第一篇 说起数据的批量写入,相信大家应该不陌生了,那么我们本系列的文章不准备讲述如何来进行数据的批量写入,而是介绍常用的数据批量写入方法的性能分析. 同时 ...

  9. redis缓存队列+MySQL +php任务脚本定时批量入库

    原文地址:http://blog.jobbole.com/99567/ 需求背景:有个调用统计日志存储和统计需求,要求存储到mysql中:存储数据高峰能达到日均千万,瓶颈在于直接入库并发太高,可能会把 ...

最新文章

  1. ActiveX(二)
  2. Windows下图文详解PHP三种运行方式(php_mod、cgi、fastcgi)
  3. 您的API是什么情况?
  4. Flask + Vue 搭建简易系统步骤总结
  5. 类别不平衡问题之评估指标
  6. 修改rocketmq nameserver的默认端口号
  7. MySQL(13)-----多表查询(子查询)
  8. android sdk根目录,Android SDK位置
  9. 如何在软件里显示编译时间
  10. java编程比赛_[阶段一]java基础编程比赛
  11. python音译爬虫_Python爬虫入门案例:获取百词斩已学单词列表
  12. 幂运算的O(lgn)算法
  13. 如何调整基准电压提高ADC精度
  14. 基于单片机原理的暖风机控制系统设计-毕设课设资料
  15. uni-app中如何引入uViewUI?
  16. JVM_虚拟机执行子系统
  17. 关于修改手机绑定那些事!
  18. A2DP和AVRCP 播放音视频
  19. 在window下间接使用meteorite的包管理功能
  20. 汽车电控之节气门位置传感器

热门文章

  1. VBox虚拟机仅主机模式时,出现connetct:Network is unreachable,解决方法
  2. xp本地计算机策略被更改,组策略的使用方法,和XP系统的实用修改窍门
  3. html中实现th标签添加分页,html – 如何在Angular 4中为表添加分页?
  4. 的源码管理器中有感叹图标_Win7系统我的电脑中没有光驱图标的解决方法
  5. python函数的使用场景_Python——异常(内置异常以及应用场景)
  6. Lazada代运营怎么样?需不需要找?如何选择一家靠谱的公司
  7. 2022年全球及中国圆机织针行业产能规模与运营前景战略分析报告
  8. WPF整理-使用逻辑资源
  9. 【转】采用dlopen、dlsym、dlclose加载动态链接库
  10. 2017.4.14-afternoon