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

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

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

1USE [TestDB] 2GO 3 4/****** Object: Table [dbo].[User_1] Script Date: 03/27/2014 00:31:16 ******/ 5SET ANSI_NULLS ON 6GO 7 8SET QUOTED_IDENTIFIER ON 9GO 10 11CREATE TABLE [dbo].[User_1]( [ID] [int] NULL, [Name] [nvarchar](20) NULL, [sex] [int] NULL, [phone] [nvarchar](20) NULL ) ON [PRIMARY] 12 13GO

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

1 public DataTable GetData() 2 { 3 DataTable dt = new DataTable(); 4 5 dt.Columns.Add("ID", typeof(int));//为新的Datatable添加一个新的列名 6 dt.Columns.Add("Name", typeof(string));//为新的Datatable添加一个新的列名 7 dt.Columns.Add("sex", typeof(int));//为新的Datatable添加一个新的列名 8 dt.Columns.Add("phone", typeof(string));//为新的Datatable添加一个新的列名 9 for (int i = 0; i < 100000; i++) //开始循环赋值 10 { 11 DataRow row = dt.NewRow(); //创建一个行 12 row["ID"] = i + 1; //从总的Datatable中读取行数据赋值给新的Datatable 13 row["Name"] = "sxd" + (i + 1).ToString(); 14 row["sex"] = i % 2 == 0 ? 1 : 0; 15 row["phone"] = (13500000000 + i + 1).ToString(); 16 dt.Rows.Add(row);//添加次行 17 } return dt; 18 }

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

1 public static bool MySqlBulkCopy(DataTable Table) 2 { bool Bool = true; string ConnectionString = "server=localhost;database=10wan;uid=datauser;pwd=1"; using (SqlConnection con = new SqlConnection(ConnectionString)) 3 { 4 con.Open(); for (int i = 0; i < Table.Rows.Count; i++) 5 { 6 SqlCommand cmd = new SqlCommand(); 7 cmd.Connection = con; 8 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] + "')"; 9 cmd.ExecuteNonQuery(); 10 } 11 con.Close(); 12 } return Bool; 13 }

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

1public string GetTimeSpan() 2 { 3 DataTable dt = GetData(); 4 DateTime dt1 = DateTime.Now; 5 Label1.Text = dt1.ToString(); 6 MySqlBulkCopy(dt); 7 DateTime dt2 = DateTime.Now; 8 Label2.Text = dt2.ToString(); 9 TimeSpan span = dt2 - dt1; string a= span.TotalSeconds.ToString(); 10 Label3.Text = a; return a; 11 }

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

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

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

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

1/// <summary> 2 /// DataTable批量添加(有事务) /// </summary> 3 /// <param name="Table">数据源</param> 4 /// <param name="DestinationTableName">目标表即需要插入数据的数据表名称如"User_1"</param> 5 public static bool MySqlBulkCopy(DataTable Table, string DestinationTableName) 6 { bool Bool = true; string ConnectionString = "server=localhost;database=10wan;uid=datauser;pwd=1"; using (SqlConnection con = new SqlConnection(ConnectionString)) 7 { 8 con.Open(); using (SqlTransaction Tran = con.BeginTransaction())//应用事物 9 { using (SqlBulkCopy Copy = new SqlBulkCopy(con, SqlBulkCopyOptions.KeepIdentity, Tran)) 10 { 11 Copy.DestinationTableName = DestinationTableName;//指定目标表 12 SqlBulkCopyColumnMapping[] Mapping = GetMapping();//获取映射关系 13 if (Mapping != null) 14 { //如果有数据 15 foreach (SqlBulkCopyColumnMapping Map in Mapping) 16 { 17 Copy.ColumnMappings.Add(Map); 18 } 19 } try { 20 Copy.WriteToServer(Table);//批量添加 21 Tran.Commit();//提交事务 22 } catch { 23 Tran.Rollback();//回滚事务 24 Bool = false; 25 } 26 } 27 } 28 } return Bool; 29 }

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

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

点赞
收藏

评论区

加载中...

相关推荐

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

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

sql注入

反引号是个比较特别的字符,下面记录下怎么利用0x00SQL注入反引号可利用在分隔符及注释作用,不过使用范围只于表名、数据库名、字段名、起别名这些场景,下面具体说下1)表名payload:select\from\users\whereuser\_id1limit0,1;!(https://o