利用ODP.Net进行批量插入和更新

最近做的项目需要将本地文件(格式规整)上传到服务器,并插入到数据库表中,开始采用的是最原始的办法,就是将文件上传到服务器,然后读文件,一行一行的拼接sql语句插入到数据库,5M近10W条的记录需要5分钟,实在无法让人忍受,虽然在服务器利用oracle的loader程序可以实现格式文件的导入,但必须依赖这个程序,为了便于以后程序的维护,放弃了该方案,后来经过搜索,觅得一解决方案,利用ODP.Net本身提供的一种数组参数功能来实现,结果整个时间锐减到3秒完成,其中数据插入到数据库时间更是从5分多钟锐减到十分之一秒以内,方法如下:

private void ExecSQL(string[] Cards, string[] BatchNos)
        {
            if (Conn.State != System.Data.ConnectionState.Open)
            {
                Conn.Open();
            }
            
            OracleCommand theCmmd = new OracleCommand("insert into cards(CARDS,batchno) values(:card,:batchno)", Conn);
            //OracleCommand theCmmd = new OracleCommand("update cards set batchno=:batchno where cards = :card", Conn);
            theCmmd.ArrayBindCount = Cards.Length;//关键点
            theCmmd.Parameters.Add(new OracleParameter("card", OracleDbType.Varchar2, Cards, System.Data.ParameterDirection.Input));
            theCmmd.Parameters.Add(new OracleParameter("batchno", OracleDbType.Varchar2, BatchNos, System.Data.ParameterDirection.Input));
            theCmmd.ExecuteNonQuery();
            theCmmd.Dispose();
        }

这里示例的是插入,其实更新也是可以的,我也测试过.文件上传到服务器后,我在内存中进行了处理,形成了2个数组(对应数据库表的2列),需要注意的是要保证分开的数据,同一行的数据应该保持在数组中索引一致.而且参数数组的长度也必须保证长度一致.

这个特性对于批处理一些数据非常有用.但目前的ADO.Net中的命令系列暂不支持同样功能.

补充:sqlserver的批量插入,没有Oracle灵活(不提供修改)

  1. using (SqlBulkCopy sqlBulkCopy = new SqlBulkCopy((SqlConnection)connection))   
  2. {   
  3.     sqlBulkCopy.DestinationTableName = dataTable.TableName;   
  4.     sqlBulkCopy.BatchSize = 100000; // 一次批量的插入的数据量    
  5.     sqlBulkCopy.BulkCopyTimeout = 360;    
  6.     // 自定义的DataTable和数据库的字段进行对应    
  7.     foreach (DataColumn column in dataTable.Columns)   
  8.     {   
  9.         sqlBulkCopy.ColumnMappings.Add(column.ColumnName, column.ColumnName);   
  10.     }   
  11.     sqlBulkCopy.WriteToServer(dataTable);   
  12. }  

 

 


 

你可能感兴趣的:(oracle,数据库,String,服务器,测试,insert)