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. 关于C语言中的Complex(复数类型)和imaginary(虚数类型)

    关于C语言中的Complex(复数类型)和imaginary(虚数类型) 其实这里的复数complex就是数学里的复数,包含实部和虚部两个部分,比如:x=2.1+6i,下面进行详细介绍. C99 新增 ...

  2. ramfs和tmpfs的区别

    简介 ramfs和tmpfs是在内存上建立的文件系统(Filesystem).其优点是读写速度很快,但存在掉电丢失的风险.如果一个进程的性能瓶颈是硬盘的读写,那么可以考虑在ramfs或tmpfs上进行 ...

  3. UVa 1395 Slim Span (最小生成树)

    题意:给定n个结点的图,求最大边的权值减去最小边的权值最小的生成树. 析:这个和最小生成树差不多,从小到大枚举左端点,对于每一个左端点,再枚举右端点,不断更新最小值.挺简单的一个题. #include ...

  4. Linux 基础教程 30-tcpdump命令-2

        在上一节讲了一些tcpdump常用功能,本期我们继续学习tcpdump后续功能. 流量过滤     tcpdump不仅支持单个过滤表达式过滤,也还支持多个过滤表达式.但需要注意的是传入的过滤表 ...

  5. 20155308 2016-2017-2 《Java程序设计》第8周学习总结

    20155308 2016-2017-2 <Java程序设计>第8周学习总结 教材学习内容总结 第十四章 NIO与NIO2 NIO(New IO)-from JDK1.4 NIO2 -fr ...

  6. 转载VC6.0 子窗口和父窗口

    这个是我周一在一家公司做的上机题中的一道,当场没做出来.我当时只跟考官说了设计思路,是带回来查了几本资料书之后才完成的.因为有半个学期没用VC开发了……,最近一直都在实践ASP.NET相关的…… 建立 ...

  7. Ubuntu的常识使用了解

    1 在分区的时候也是有一定的机巧的,根据磁盘的特点,我们知道越是靠磁盘外部的柱面,旋转越快,而且每次旋转时,磁盘读写头可以覆盖较多的区域,也就意味着靠外部的柱面可以得到较好的性能.所以在分区时,我们应 ...

  8. MFC中的乱起八糟----字符编码:LPTSTR,LPCTSTR, TCHAR等

    注意,编写有 Unicode 意识的代码总是一件好事,比如: CString graycat = CString(_T("Gray")) + _T("Cat") ...

  9. handsontable-developer guide-load and save

    不过handsontable不能用jquery取对象 var $$ = function(id) { return document.getElementById(id); }, container ...

  10. [label][PHP-Security]PHP Security Program

    本文是通过阅读http://www.nowamagic.net/中的PHP安全变成专题,同时结合个人的一点点开发经验组合而成的. 如果你需要看原文,可以直接访问http://www.nowamagic ...