大家應該聽說過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時進行分批插入
如果有園友也曾遇到類似問題 可以參考 。
第一次寫博,各種問題 敬請諒解!
最后借用子陽兄的結束語:希望這篇文章能給你帶來幫助!