【物流系統】——C#中Oracle批量匯入(一)
阿新 • • 發佈:2019-02-04
前提
匯入資料量1W,因為在小編做這個xml匯入之前系統中已經有execl匯入了,小編也沒多想,就按照前人的封裝做了一版,數量不大的時候使用起來完全沒有毛病。
封裝在DbHelper中,執行多條SQL語句,實現資料庫事務的方法。資料庫用的Oracle
呼叫該方法其實就是拼成一條條的插入語句。/// <summary> /// 執行多條SQL語句,實現資料庫事務。 /// </summary> /// <param name="SQLStringList">多條SQL語句</param> public bool ExecuteSqlTran(ArrayList SQLStringList) { using (OracleConnection conn = new OracleConnection(this.connectionString)) { conn.Open(); OracleCommand cmd = new OracleCommand(); cmd.Connection = conn; OracleTransaction tx = conn.BeginTransaction(); cmd.Transaction = tx; try { for (int n = 0; n < SQLStringList.Count; n++) { string strsql = SQLStringList[n].ToString(); if (strsql.Trim().Length > 1) { cmd.CommandText = strsql; cmd.BindByName = true; //記錄sql LogSQL.WriteLog(cmd); cmd.ExecuteNonQuery(); } } tx.Commit(); conn.Close(); cmd.Dispose(); conn.Dispose(); return true; } catch (Oracle.ManagedDataAccess.Client.OracleException E) { tx.Rollback(); if (conn.State == ConnectionState.Open) { conn.Close(); } conn.Dispose(); return false; throw new Exception(E.Message); } } }
其實仔細看程式碼,說是批量插入,其實就是一條條插入的,只不過是最後一次性提交的。當資料量稍大一些,執行效率還是很低的。小編用該方法執行2W資料,花費時間大約在8分鐘左右,感覺宕機了,其實只是程式慢而已。對待這樣的執行效率小編也是無奈了。#region 插入+InsertBatchGoodsDrugCode+賈文靜+2017年3月7日10:32:37 /// <summary> /// 批量插入 /// </summary> /// <param name="goodDrugCodeLists"></param> /// <returns></returns> public bool InsertBatchGoodsDrugCode(List<Model.GOODS_DRUGCODE> goodDrugCodeLists) { if (goodDrugCodeLists.Count > 0) { ArrayList opList = new ArrayList(); foreach (Model.GOODS_DRUGCODE goodDrugCode in goodDrugCodeLists) { string strSqlInsert = ""; StringBuilder sbsqlValue = new StringBuilder(); sbsqlValue.Append("'" + goodDrugCode.ORG_ID + "','" + goodDrugCode.GOODS_ID + "','" + goodDrugCode.BATCH_NO + "',"); sbsqlValue.Append("to_date('" + goodDrugCode.VALID_DATE + "','yyyy-mm-dd'),"); sbsqlValue.Append("'" + goodDrugCode.PRODUCT_DATE + "','" + goodDrugCode.CODE + "','" + goodDrugCode.PARENT_CODE + "','" + goodDrugCode.ISLEAF + "',"); sbsqlValue.Append("sysdate,'"+goodDrugCode.CREATE_MAN+"','"+goodDrugCode.OWNER_ID+"'"); strSqlInsert = "INSERT INTO goods_drugcode (org_id,goods_id,batch_no,valid_date,product_date,code,parent_code,Isleaf,create_date,create_man,owner_id) VALUES (" + sbsqlValue.ToString() + ")"; opList.Add(strSqlInsert); } return ora.ExecuteSqlTran(opList); } else { return false; } } #endregion
無奈這樣的方法不能用啊。還是探索新的道路吧,但是當資料量少的時候該方法還是十分可取的,安全,而且使用起來非常的簡便。
其實這個方法還有一個可取之處,就是引用的Oracle.ManagedDataAccess.dll檔案中connection,最起碼在實施的過程不用安裝oracle客戶端可能正常使用。