大家应该听说过odp.net,其定义为:
ODP.NET 是ORACLE公司为.NET开发者发布的一个 .NET 使用 ORACLE 数据库的类库
相对于传统的ado.net而言 操纵oracle数据库的速度。odp.net要快很多倍。从我自己的使用情况来说,因为odp.net支持批量新增。在向oracle中增加100w条数据(单列,int类型),时间大概在
1-2秒。这个是我直观判断,并没有用Stopwatch做精确计算。但是从别人的测试中得知,一般情况下100w条单列Int数据插入时间在一秒以内! 这个速度还是比较惊人了。
但是要注意一点的是,在批量插入数据的时候,一次性插入的数量应该是有一个限值的。
这是我的代码:
1 private static void InsertData(string tableName, string[] strID, string[] strGDFType, GDFCheckForm form) 2 { 3 try 4 { 5 string connectStr = string.Format("Data Source = {0}; User ID = {1}; Password = {2};Persist Security Info=True", oracleDataSource, databaseUserID, databasePassword.ToLower()); 6 using (OracleConnection conn = new OracleConnection(connectStr)) 7 { 8 OracleCommand command = new OracleCommand(); 9 command.Connection = conn; 10 command.ArrayBindCount = strID.Length; 11 command.CommandText = "insert into " + tableName + " values(:ID,:GDFType)"; 12 conn.Open(); 13 command.Parameters.Add(new OracleParameter("ID", OracleDbType.NVarchar2, strID, ParameterDirection.Input)); 14 command.Parameters.Add(new OracleParameter("GDFType", OracleDbType.NVarchar2, strGDFType, ParameterDirection.Input)); 15 command.ExecuteNonQuery(); 16 form.WriteLog("新增table:" + tableName); 17 } 18 } 19 catch (Exception e) 20 { 21 string msg = "执行InsertData方法时出错" + e.Message + "tableName:" + tableName; 22 Logger.IsSucceed = false; 23 form.WriteLog(msg); 24 Logger.Write(msg); 25 } 26 27 }
当数组strID(我的程序中,strID和strGDFType的长度是相等的)的长度超过200w时,方法
command.ExecuteNonQuery();
会发生异常:未将对象引用到对象的实例。
我在仔细检测代码时发现 应该是批量新增时一次性插入的数据量太大(这是我的主观推断,有待高手验证) 因此最后的解决方案是在数据量大于200w时进行分批插入
如果有园友也曾遇到类似问题 可以参考 。
第一次写博,各种问题 敬请谅解!
最后借用子阳兄的结束语:希望这篇文章能给你带来帮助!