最近做的项目需要将本地文件(格式规整)上传到服务器,并插入到数据库表中,开始采用的是最原始的办法,就是将文件上传到服务器,然后读文件,一行一行的拼接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灵活(不提供修改)