您正在尝试执行的操作称为bulk insert。 Oracle 提供了可用于此目的的 .NET 程序集 Oracle.DataAccess.dll。 没有任何一种手工解决方案可以胜过这个针对 Oracle DBMS 的自定义供应商库的性能。
http://download.oracle.com/docs/html/E10927_01/OracleBulkCopyClass.htm#CHDGJBBJ
http://dotnetslackers.com/articles/ado_net/BulkOperationsUsingOracleDataProviderForNETODPNET.aspx
最常见的想法是为每一列使用值数组并将它们应用于模板 SQL。在下面的示例中,employeeIds、firstNames、lastNames 和 dobs 是与要插入的值长度相同的数组。
ODP.NET 中的数组绑定功能
允许您插入多条记录
在一次数据库调用中。使用数组
绑定,你只需设置
OracleCommand.ArrayBindCount 到
要插入的记录数,以及
将值数组作为参数传递
而不是单个值:
> 01. string sql =
> 02. "insert into bulk_test (employee_id, first_name, last_name,
> dob) "
> 03.
> + "values (:employee_id, :first_name, :last_name, :dob)";
> 04.
>
> 05. OracleConnection cnn = new OracleConnection(connectString);
> 06. cnn.Open();
> 07. OracleCommand cmd = cnn.CreateCommand();
> 08. cmd.CommandText = sql;
> 09. cmd.CommandType = CommandType.Text;
> 10. cmd.BindByName = true;
> 11.
>
> 12. // To use ArrayBinding, we need to set ArrayBindCount
> 13. cmd.ArrayBindCount = numRecords;
> 14.
>
> 15. // Instead of single values, we pass arrays of values as parameters
> 16. cmd.Parameters.Add(":employee_id", OracleDbType.Int32,
> 17. employeeIds, ParameterDirection.Input);
> 18. cmd.Parameters.Add(":first_name", OracleDbType.Varchar2,
> 19. firstNames, ParameterDirection.Input);
> 20. cmd.Parameters.Add(":last_name", OracleDbType.Varchar2,
> 21. lastNames, ParameterDirection.Input);
> 22. cmd.Parameters.Add(":dob", OracleDbType.Date,
> 23. dobs, ParameterDirection.Input);
> 24. cmd.ExecuteNonQuery();
> 25. cnn.Close();
如您所见,代码看起来并没有太大的不同
从做一个常规的单记录
插入。然而,表现
改善是相当剧烈的,
取决于记录的数量
涉及。您必须记录的记录越多
插入,性能越大
获得。在我的开发 PC 上,插入
使用数组绑定的 1,000 条记录是
比插入快 90 倍
一次记录一个。是的,你读过
没错:快 90 倍!您的
结果会有所不同,具体取决于
记录大小和网络
到数据库的速度/带宽
服务器。
一些调查工作揭示了
该 SQL 被认为是
“执行”多次
服务器端。证据来自
V$SQL(查看 EXECUTIONS 列)。
但是,从 .NET 的角度来看,
一切都在一个电话中完成。