C#海量数据瞬间插入到数据库的方法_第1页
C#海量数据瞬间插入到数据库的方法_第2页
C#海量数据瞬间插入到数据库的方法_第3页
C#海量数据瞬间插入到数据库的方法_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C#海量数据瞬间插入到数据库的方法当我们在数据库中进行大量的数据追加时,是不是经常因为数据量过大而苦恼呢?而所谓的海量数据,一般也是上万级的数据,比如我们要添加一百万条数据,应该如何提高它的效率呢?Oracle数据库:普通肉垫式什么叫批量插入呢,就是一次性插入一批数据,我们可以把这批数据理解为一个大的数组,而这些全部只通过一个SQL来实现,而在传统方式下,需要调用很多次的SQL才可以完成,这就是著名的 数组绑定 的功能。我们先来看一下传统方式下,插入多行记录的操作方式:呼程序代码:设置一个数据库的连接串,string connectStr = User Id=scott;Password=ti

2、ger;Data Source=;OracleConnection conn = new OracleConnection(connectStr);OracleCommand command = new OracleCommand();command.Connection = conn;conn.Open();通过循环写入大量的数据,这种方法显然是肉垫for (int i = 0; i recc; i+)string sql = insert into dept values( + i.ToString() + , + i.ToString() + , + i.ToString() + );c

3、ommand.CommandText = sql;command.ExecuteNonQuery();使用ODP特性即程序代码:设置一个数据库的连接串string connectStr = User Id=scott;Password=tiger;Data Source=;OracleConnection conn = new OracleConnection(connectStr);OracleCommand command = new OracleCommand();command.Connection = conn;/到此为止,还都是我们熟悉的代码,下面就要开始喽这个参数需要指定每次批插

4、入的记录数command.ArrayBindCount = recc;在这个命令行中,用到了参数,参数我们很熟悉,但是这个参数在传值的时候/用到的是数组,而不是单个的值,这就是它独特的地方command.CommandText = insert into dept values(:deptno, :deptname, :loc);conn.Open();下面定义几个数组,分别表示三个字段,数组的长度由参数直接给出int deptNo = new intrecc;string dname = new stringrecc;string loc = new string recc;/为了传递参数,

5、不可避免的要使用参数,下面会连续定义三个/从名称可以直接看出每个参数的含义,不在每个解释了OracleParameter deptNoParam = new OracleParameterdeptno , OracleDbType.Int32);deptNoParam.Direction = ParameterDirection.Input;deptNoParam.Value = deptNo;command.Parameters.Add(deptNoParam);OracleParameter deptNameParam = new OracleParameter(deptname, Ora

6、cleDbType.Varchar2);deptNameParam.Direction = ParameterDirection.Input;deptNameParam.Value = dname; command.Parameters.Add(deptNameParam);OracleParameter deptLocParam = new OracleParameterfloc, OracleDbType.Varchar2);deptLocParam.Direction = ParameterDirection.Input;deptLocParam.Value = loc;command.

7、Parameters.Add(deptLocParam);在下面的循环中,先把数组定义好,而不是像上面那样直接生成SQLfor (int i = 0; i recc; i+)(deptNoi = i;dnamei = i.ToString();loci = i.ToString();)这个调用将把参数数组传进SQL,同时写入数据库command.ExecuteNonQuery();好了,到目前为止,两种方式的插入操作程序已经完成,就剩下对比了。我在主函数处写了一个小函数,循环多次对两个方法进行调用,并且同时记录下时间,对比函数如下:0P程序代码:for (int i = 1; i = 50;

8、i+)(OrdinaryInsert(i * 1000);BatchInsert(i * 1000);)当数据量达到100万级别时,所用时间依然令人满意,最快一次达到890毫秒,一般为1秒左右经过试验,得出一组数据,可以看出两种方式在效率方面惊人的差距(占用时间的单位为毫秒),部分 数据如下:看一下由此数据生成的散点图:里2gif (7.33 KB)SqlServer数据库:其中有些数据有些跳跃,可能和数据库本身有关系,但是大部分数据已经能说明问题了。看了这些数据后,是不是有些心动了 ?既然Oracle可以如此爽快,那么在SqlServer中是否也可以这样做呢?但是在SqlServer中却没有

9、诸如ArrayBindCount这样的操作属性不过,我们却可以借助于BULK INSERT来进入海量数据的添加代码:霄程序代码:ISOOOO敝处理Iooooa些性腐眼)5QQQ0QItXKK? 200DD 3网0 4 8E 50Q 0000记录数标准10001545 .厂20003514 |20130003749 1134000I5737-|40|5000682060009469r-75I7000110226|69|800015290| 123 |900011475M1000014596110001S70S1301555616548 |113000137S5125| 1556520393ISl

10、Euuu221B11591.GIF (6.59 KB)设置一个数据库的连接串string connectStr = .11;SqlConnection conn = new SqlConnection(connectStr);SqlCommand command = new SqlCommand();command.CommandTimeout = 0;command.Connection = conn;/*说明:* “c:sql.txt是个预先生成的包含100条数据的文件*每一个字段的信息以“,分割*每一条数据以“符号分隔*每10万条数据一个事务。*/command.CommandText = BULK INSERT TableB FROM c:sql.txt WITH (FIELDTERMINATO R =,ROWTERMINATOR =|,BATCHSIZE = 100000);conn

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论