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

怎么向数据库中快速插入十万条数据呢,当然得需要对比才能看到效果,今天给大家亲身测了两种方法对比,差别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

publicDataTable GetData()

{

DataTable dt= newDataTable();

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);//添加次行

}returndt;

}

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

public static boolMySqlBulkCopy(DataTable Table)

{bool Bool = true;string ConnectionString = "server=localhost;database=10wan;uid=datauser;pwd=1";using (SqlConnection con = newSqlConnection(ConnectionString))

{

con.Open();for (int i = 0; i < Table.Rows.Count; i++)

{

SqlCommand cmd= newSqlCommand();

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();

}returnBool;

}

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

public stringGetTimeSpan()

{

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;returna;

}

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

417f52c0e067aa2c41b1e3960a1f6514.png

68051ff0080fa5899a68065824937b97.png

2010bb6138ef32c977c169d2c9bc1a6e.png

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

publicSqlBulkCopyColumnMapping[] 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");returnmapping;

}

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

///

///DataTable批量添加(有事务)///

/// 数据源

/// 目标表即需要插入数据的数据表名称如"User_1"

public static bool MySqlBulkCopy(DataTable Table, stringDestinationTableName)

{bool Bool = true;string ConnectionString = "server=localhost;database=10wan;uid=datauser;pwd=1";using (SqlConnection con = newSqlConnection(ConnectionString))

{

con.Open();using (SqlTransaction Tran = con.BeginTransaction())//应用事物

{using (SqlBulkCopy Copy = newSqlBulkCopy(con, SqlBulkCopyOptions.KeepIdentity, Tran))

{

Copy.DestinationTableName= DestinationTableName;//指定目标表

SqlBulkCopyColumnMapping[] Mapping = GetMapping();//获取映射关系

if (Mapping != null)

{//如果有数据

foreach (SqlBulkCopyColumnMapping Map inMapping)

{

Copy.ColumnMappings.Add(Map);

}

}try{

Copy.WriteToServer(Table);//批量添加

Tran.Commit();//提交事务

}catch{

Tran.Rollback();//回滚事务

Bool = false;

}

}

}

}returnBool;

}

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

a77d99400803af616fe9c03ca97af0c4.png

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

shixudong3@yeah.net

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值