1. 我们在对数据库进行新增数据时,怎么能把速度提到最快,时间缩到最短呢?下面针对三种方法进行比较
  2. 新增
    • 逐条新增数据模式
    •             Stopwatch s2 = new Stopwatch();
      s2.Start();
      for (int i = ; i < ; i++)
      { //方法一36s-37s这样的时间结果36192 40860 37434
      string sql = "insert into student (Name,Sex,BirthDate) values('张三','男','2019-03-29')";
      CreateSql(sql);
      }
      s2.Stop();
      textBox7.Text = s2.ElapsedMilliseconds.ToString();

      逐条逐步骤新增,共累计增加十万条,结束,得到结果是在36秒左右时间新增完成十万条数据。

    • 这种办法,虽然有连接池在提高了一定效率,但是很慢
    • 拼接模式新增数据
    •             Stopwatch s = new Stopwatch();
      s.Start();
      StringBuilder sBuilder = new StringBuilder();
      for (int i = ; i < ; i++)
      {
      sBuilder.Append("insert into student (Name,Sex,BirthDate) values('张三','男','2019-03-29');");
      }
      s.Stop();
      CreateSql(sBuilder.ToString());
      textBox6.Text = s.ElapsedMilliseconds.ToString();

      用StringBuilder拼接十万个sql字符串,在交给插入代码执行,十万条总耗时约27秒-28秒,可见虽然比逐条插入快了约十秒,但是效果还不是很理想

    • 高效插入模式SqlBulkCopy
    •             Stopwatch s = new Stopwatch();
      s.Start();
      DataTable dt = new DataTable();
      dt.TableName = "Student";
      dt.Columns.Add("ID");
      dt.Columns.Add("Name");
      dt.Columns.Add("Sex");
      dt.Columns.Add("BirthDate");
      DataRow dr = null;
      for (int i = ; i <; i++)
      {
      dr = dt.NewRow();
      dr["ID"] = i;
      dr["Name"] = "张三";
      dr["Sex"] = "男";
      dr["BirthDate"] = "2019-03-29";
      dt.Rows.Add(dr);
      }
      CreateSql(dt);
      s.Stop();
      textBox7.Text = s.ElapsedMilliseconds.ToString();

      先拼接DataTable,然后动态创建十万行DataRow,这样DataTable就组成了数据源,直接使用SqlBulkCopy来插入数据,此时十万条数据新增只需要1.1秒-1.3秒左右,速度很快了。

    • SqlBulkCopy代码:
    • private void CreateSql(DataTable dt)
      {
      using (SqlConnection conn = new SqlConnection("server=.;uid=sa;pwd=123456;DataBase=student_micc"))
      {
      if (conn.State == ConnectionState.Closed)
      {
      conn.Open();
      }
      SqlBulkCopy sqlCopy = new SqlBulkCopy(conn);
      sqlCopy.BatchSize = dt.Rows.Count;
      sqlCopy.DestinationTableName = "Student";
      sqlCopy.WriteToServer(dt);
      sqlCopy.Close();
      }
      }

      普通Ado.Net连接串插入

private void CreateSql(string sql)
{
using (SqlConnection conn = new SqlConnection("server=.;uid=sa;pwd=123456;DataBase=student_micc"))
{
if (conn.State == ConnectionState.Closed)
{
conn.Open();
}
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
cmd.CommandTimeout = ;
cmd.ExecuteNonQuery();
}
}

C#高效新增数据到数据库(十万级别测试)的更多相关文章

  1. SSM Mybatis将新增数据写入数据库时出现的500状态码:Error updating database.的可能

    关于maven下ssm整合的项目推荐这篇博客:https://www.cnblogs.com/yiye/p/5969157.html 今日在ssm下的将新增数据写回数据库时遇到不少的问题,现作记录 如 ...

  2. mysql数据库千万级别数据的查询优化和分页测试

    原文地址:原创 mysql数据库千万级别数据的查询优化和分页测试作者:于堡舰 本文为本人最近利用几个小时才分析总结出的原创文章,希望大家转载,但是要注明出处 http://blog.sina.com. ...

  3. 在Oracle中快速创建一张百万级别的表,一张十万级别的表 并修改两表中1%的数据 全部运行时间66秒

    万以下小表做性能优化没有多大意义,因此我需要创建大表: 创建大表有三种方法,一种是insert into table selec..connect by.的方式,它最快但是数据要么是连续值,要么是随机 ...

  4. Django之同时新增数据到两个数据库表与同时返回两个表的数据(插拔式)

    models:比如有以下三个模型 from django.db import models """ 基类,其他类继承即可获得对应的字段 """ ...

  5. .Net批量插入数据到SQLServer数据库,System.Data.SqlClient.SqlBulkCopy类批量插入大数据到数据库

    批量的的数据导入数据库中,尽量少的访问数据库,高性能的对数据库进行存储. 采用SqlBulkCopy来处理存储数据.SqlBulkCopy存储大批量的数据非常的高效,将内存中的数据表直接的一次性的存储 ...

  6. Mysql加锁过程详解(6)-数据库隔离级别(1)

    Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...

  7. mybatis学习之路----mysql批量新增数据

    原文:https://blog.csdn.net/xu1916659422/article/details/77971867 接下来两节要探讨的是批量插入和批量更新,因为这两种操作在企业中也经常用到. ...

  8. springmvc 事务控制与数据库隔离级别

    springmvc 事物传播与数据库隔离控制 http://www.cnblogs.com/yangy608/archive/2011/06/29/2093478.html 一.Propagation ...

  9. SQL SERVER 2008 数据库隔离级别代码演示

    SQL SERVER 2008 数据库隔离级别代码演示   个隔离级别(其实这是SQL 工业标) 种隔离级别,本身没有优劣之分,完全取决于应用的场景. 本质上,他们是在 隔离性(紊乱程度) 和 灵活性 ...

随机推荐

  1. gradle使用总结

    ###打包时跳过单元测试

  2. CSS中float和Clear的使用

    CSS中float和Clear的使用 本文和大家重点讨论一下CSS中Float和Clear属性的使用,一个float对象可以居左或居右,一个设置为float的对象,将根据设置的方向,左移或右移到其父容 ...

  3. ORA-00054、ORA-08002

    https://docs.oracle.com/cd/B10501_01/server.920/a96525/e7500.htm ORA-00054 resource busy and acquire ...

  4. Appium之uiautomator定位元素

    元素定位方式有多种,Android也有自身独有的定位方式.下面就单独介绍其基于uiautomator定位元素的方法: 基本语法: driver.find_element_by_android_uiau ...

  5. MFC中的一般经验之谈3

    Window消息可以分为三类:(1)标准Window消息(CWnd子类处理),(2)控制通知消息(CWnd子类处理),(3)命令消息(应用中的5类都可以).所有派生自CCmdObjec对象的类都可以处 ...

  6. 解决PL/SQL Developer连接数据库时出现 “ORA-12541:TNS:无监听程序”错误

    在用PL/SQL Developer连接数据库时出现“ORA-12541:TNS:无监听程序”错误. 1.检查listener.log日志发现下面错误:TNSLSNR for 32-bit Windo ...

  7. PHP全栈学习笔记19

    thinkphp框架是一个免费的,开源,快速,简单的面向对象的轻量级PHP开发框架. 了解什么是thinkphp概述,thinkphp项目目录结构,thinkphp的控制器,视图,thinkphp项目 ...

  8. shell中调用jenkins API批量运行历史任务

    shell中调用jenkins API批量运行jenkins带参数的任务: #!/bin/sh #startdate=20150127 startdate=20150201 while [ " ...

  9. hdu X问题 (中国剩余定理不互质)

    http://acm.hdu.edu.cn/showproblem.php?pid=1573 X问题 Time Limit: 1000/1000 MS (Java/Others)    Memory ...

  10. 使用echarts绘制漂亮的渐变键盘仪表盘

    echarts官方示例和默认样式都比较难看,经过一顿捣鼓实现比较漂亮的渐变仪表盘. 第一步:设置轴线 将图表轴线.label.分割线.隐藏,只保留刻度,然后修改刻度样式达到最终效果.不过要注意的是ax ...