代码改变世界

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

2012-05-02 16:18  java线程例子  阅读(540)  评论(0编辑  收藏  举报

最近做的项目需要将本地文件(格式规整)上传到服务器,并插入到数据库表中,开始采用的是最原始的办法,就是将文件上传到服务器,然后读文件,一行一行的拼接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中的命令系列暂不支持同样功能.