C# 海量数据瞬间插入到数据库的方法
来源:互联网 发布:淘宝网书店首页 编辑:程序博客网 时间:2024/05/17 06:41
C# 海量数据瞬间插入到数据库的方法
而所谓的海量数据,一般也是上万级的数据,比如我们要添加一百万条数据,应该如何提高它的效率呢?
Oracle数据库:
普通肉垫式
什么叫批量插入呢,就是一次性插入一批数据,我们可以把这批数据理解为一个大的数组,而这些全部只通过一个SQL来实现,而在传统方式下,需要调用很多次的SQL才可以完成,这就是著名的“数组绑定”的功能。我们先来看一下传统方式下,插入多行记录的操作方式:
//设置一个数据库的连接串,string connectStr = "User Id=scott;Password=tiger;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() + ")"; command.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;//到此为止,还都是我们熟悉的代码,下面就要开始喽//这个参数需要指定每次批插入的记录数command.ArrayBindCount = recc;//在这个命令行中,用到了参数,参数我们很熟悉,但是这个参数在传值的时候//用到的是数组,而不是单个的值,这就是它独特的地方command.CommandText = "insert into dept values(:deptno, :deptname, :loc)";conn.Open();//下面定义几个数组,分别表示三个字段,数组的长度由参数直接给出int[] deptNo = new int[recc];string[] dname = new string[recc];string[] loc = new string[recc];// 为了传递参数,不可避免的要使用参数,下面会连续定义三个// 从名称可以直接看出每个参数的含义,不在每个解释了OracleParameter deptNoParam = new OracleParameter("deptno", OracleDbType.Int32);deptNoParam.Direction = ParameterDirection.Input;deptNoParam.Value = deptNo;command.Parameters.Add(deptNoParam);OracleParameter deptNameParam = new OracleParameter("deptname", OracleDbType.Varchar2);deptNameParam.Direction = ParameterDirection.Input;deptNameParam.Value = dname; command.Parameters.Add(deptNameParam);OracleParameter deptLocParam = new OracleParameter("loc", OracleDbType.Varchar2);deptLocParam.Direction = ParameterDirection.Input;deptLocParam.Value = loc;command.Parameters.Add(deptLocParam);//在下面的循环中,先把数组定义好,而不是像上面那样直接生成SQLfor (int i = 0; i < recc; i++){ deptNo[i] = i; dname[i] = i.ToString(); loc[i] = i.ToString();}//这个调用将把参数数组传进SQL,同时写入数据库command.ExecuteNonQuery();
好了,到目前为止,两种方式的插入操作程序已经完成,就剩下对比了。我在主函数处写了一个小函数,循环多次对两个方法进行调用,并且同时记录下时间,对比函数如下:
for (int i = 1; i <= 50; i++){ OrdinaryInsert(i * 1000); BatchInsert(i * 1000);}当数据量达到100万级别时,所用时间依然令人满意,最快一次达到890毫秒,一般为1秒左右。
经过试验,得出一组数据,可以看出两种方式在效率方面惊人的差距(占用时间的单位为毫秒).
SqlServer数据库:
既然Oracle可以如此爽快,那么在SqlServer中是否也可以这样做呢?
但是在SqlServer中却没有诸如ArrayBindCount 这样的操作属性。
不过,我们却可以借助于BULK INSERT来进入海量数据的添加。
代码:
//设置一个数据库的连接串 string connectStr = "……"; 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 (FIELDTERMINATOR = ',',ROWTERMINATOR ='|',BATCHSIZE = 100000)"; conn.Open(); //System.Data.SqlClient.SqlBulkCopy sqlBC command.ExecuteNonQuery(); conn.Close();虽然比不上Oracle那么变态,但是插入百万条数据也不过只用了几秒时间,比起我们平时的添加速度,无疑已经让人非常兴奋了吧,呵呵。
大家还不快试试去?
好吧....................我承认我是想留个备份..................
- C# 海量数据瞬间插入到数据库的方法
- C# 海量数据瞬间插入到数据库的方法
- C# 海量数据瞬间插入到数据库的方法
- C# 海量数据瞬间插入到数据库的方法
- C# 海量数据瞬间插入到数据库的方法
- c# 海量数据插入sql 2005数据库
- 海量数据插入数据库的快速方案
- C#使用ODAC向Oracle数据库插入海量实时数据
- 瞬间搜索海量数据
- c# 将图片的二进制数据插入到数据库中
- 把数据插入到数据库的两种方法
- 把数据插入到数据库的两种方法
- C#一次性向数据库插入上万条数据的方法
- C#一次性向数据库插入上万条数据的方法
- C#中海量数据的批量插入和更新
- C#中海量数据的批量插入和更新 [顶]
- C#中海量数据的批量插入和更新
- 如何向数据库中插入海量的数据呢?
- 小西笔划输入法 一款可以让你像打五笔那样打笔划输入法的
- 接口和总线
- 自定义seekbar样式
- Java中获取系统时间
- Android下的任务和Activity栈
- C# 海量数据瞬间插入到数据库的方法
- 移动硬盘“文件或目录损坏且无法读取”错误修复方法
- Java钩子
- paramiko的安装与使用
- 代码覆盖率测试,gcov, lcov
- Apache ab 使用
- Android学习笔记之AndroidManifest.xml文件解析
- arcgis server FLEX几何服务404错误
- PHP 配置PDO