2秒内向数据库中插入十万条数据?

Abel617
• 阅读 1234

怎么向数据库中快速插入十万条数据呢,当然得需要对比才能看到效果,今天给大家亲身测了两种方法对比,差别25倍左右

1,数据库用sql server 2008 r2,表结构非常简单,四个字段,建数据表的sql代码如下

USE [TestDB]
GO

/****** Object:  Table [dbo].[User_1]    Script Date: 03/27/2014 00:31:16 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[User_1]( [ID] [int] NULL, [Name] [nvarchar](20) NULL, [sex] [int] NULL, [phone] [nvarchar](20) NULL ) ON [PRIMARY]

GO

2,十万条数据从何而来?由于是模拟实现,我就是用模拟数据,拼成一个具有十万条记录的DataTable

 public DataTable  GetData()
        {
            DataTable dt = new DataTable();

            dt.Columns.Add("ID", typeof(int));//为新的Datatable添加一个新的列名
            dt.Columns.Add("Name", typeof(string));//为新的Datatable添加一个新的列名
            dt.Columns.Add("sex", typeof(int));//为新的Datatable添加一个新的列名
            dt.Columns.Add("phone", typeof(string));//为新的Datatable添加一个新的列名
            for (int i = 0; i < 100000; i++) //开始循环赋值
 {
                DataRow row = dt.NewRow(); //创建一个行
                row["ID"] = i + 1; //从总的Datatable中读取行数据赋值给新的Datatable
                row["Name"] = "sxd" + (i + 1).ToString();
                row["sex"] = i % 2 == 0 ? 1 : 0;
                row["phone"] = (13500000000 + i + 1).ToString();
                dt.Rows.Add(row);//添加次行
 } return dt;
        }

3,用最基本的方法来实现,循环遍历向数据库中插入十万条数据,为了模拟,细节地方没有修改

 public static bool MySqlBulkCopy(DataTable Table)
        { bool Bool = true; string ConnectionString = "server=localhost;database=10wan;uid=datauser;pwd=1"; using (SqlConnection con = new SqlConnection(ConnectionString))
            {
                con.Open(); for (int i = 0; i < Table.Rows.Count; i++)
                {
                    SqlCommand cmd = new SqlCommand();
                    cmd.Connection = con;
                    cmd.CommandText = "insert into User_1 (ID,Name,sex,phone) values (" + Table.Rows[i][0] + ",'" + Table.Rows[i][1] + "'," + Table.Rows[i][2] + ",'" + Table.Rows[i][3] + "')";
                    cmd.ExecuteNonQuery();
                }
                con.Close();
            } return Bool;
        }

4,用的是webform做的测试,页面中加了三个控件Label1,2,3,调用下面的方法得出结果

public string GetTimeSpan()
        {
            DataTable dt = GetData();
            DateTime dt1 = DateTime.Now;
            Label1.Text = dt1.ToString();
            MySqlBulkCopy(dt);
            DateTime dt2 = DateTime.Now;
            Label2.Text = dt2.ToString();
            TimeSpan span = dt2 - dt1; string a= span.TotalSeconds.ToString();
            Label3.Text = a; return a;
        }

5,最后得到的结果截图如下

2秒内向数据库中插入十万条数据?2秒内向数据库中插入十万条数据?2秒内向数据库中插入十万条数据?

6,有了上面的结果以后,我们开始用另一种方法,微软自带的SqlBulkCopy,获取十万条数据跟上面的例子一样,这里不再重复,直接用,然后开始拼SqlBulkCopyColumnMapping,代码如下

public SqlBulkCopyColumnMapping[] GetMapping()
        {
            SqlBulkCopyColumnMapping[] mapping = new SqlBulkCopyColumnMapping[4];
            mapping[0] = new SqlBulkCopyColumnMapping("ID", "ID");
            mapping[1] = new SqlBulkCopyColumnMapping("Name", "Name");
            mapping[2] = new SqlBulkCopyColumnMapping("sex", "sex");
            mapping[3] = new SqlBulkCopyColumnMapping("phone", "phone"); return mapping;
        }

7,开始大批量插入数据了,关键地方就在此

/// <summary>
        /// DataTable批量添加(有事务) /// </summary>
        /// <param name="Table">数据源</param>
        /// <param name="DestinationTableName">目标表即需要插入数据的数据表名称如"User_1"</param>
        public static bool MySqlBulkCopy(DataTable Table, string DestinationTableName)
        { bool Bool = true; string ConnectionString = "server=localhost;database=10wan;uid=datauser;pwd=1"; using (SqlConnection con = new SqlConnection(ConnectionString))
            {
                con.Open(); using (SqlTransaction Tran = con.BeginTransaction())//应用事物
 { using (SqlBulkCopy Copy = new SqlBulkCopy(con, SqlBulkCopyOptions.KeepIdentity, Tran))
                    {
                        Copy.DestinationTableName = DestinationTableName;//指定目标表
                        SqlBulkCopyColumnMapping[] Mapping = GetMapping();//获取映射关系
                        if (Mapping != null)
                        { //如果有数据
                            foreach (SqlBulkCopyColumnMapping Map in Mapping)
                            {
                                Copy.ColumnMappings.Add(Map);
                            }
                        } try {
                            Copy.WriteToServer(Table);//批量添加
                            Tran.Commit();//提交事务
 } catch {
                            Tran.Rollback();//回滚事务
                            Bool = false;
                        }
                    }
                }
            } return Bool;
        }

8,跟上面例子一样,开始调用方法,展现在webform页面上,这里也不再写,直接上图

2秒内向数据库中插入十万条数据?

9,两者的差别是不是很大,这个方法是不是很好用,如果是的话请您点个赞啊,如果有更好的方法请留言,让大家共同学习。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Easter79 Easter79
2年前
sql注入
反引号是个比较特别的字符,下面记录下怎么利用0x00SQL注入反引号可利用在分隔符及注释作用,不过使用范围只于表名、数据库名、字段名、起别名这些场景,下面具体说下1)表名payload:select\from\users\whereuser\_id1limit0,1;!(https://o
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Android蓝牙连接汽车OBD设备
//设备连接public class BluetoothConnect implements Runnable {    private static final UUID CONNECT_UUID  UUID.fromString("0000110100001000800000805F9B34FB");
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
Abel617
Abel617
Lv1
小楼一夜听春雨,深巷明朝卖杏花。
文章
2
粉丝
0
获赞
1