【物流系统】——C#中Oracle批量导入(一)

    xiaoxiao2021-03-25  142

    前提

        导入数据量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); } } }      调用该方法其实就是拼成一条条的插入语句。

    #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     其实仔细看代码,说是批量插入,其实就是一条条插入的,只不过是最后一次性提交的。当数据量稍大一些,执行效率还是很低的。小编用该方法执行2W数据,花费时间大约在8分钟左右,感觉死机了,其实只是程序慢而已。对待这样的执行效率小编也是无奈了。

                    无奈这样的方法不能用啊。还是探索新的道路吧,但是当数据量少的时候该方法还是十分可取的,安全,而且使用起来非常的简便。

        其实这个方法还有一个可取之处,就是引用的Oracle.ManagedDataAccess.dll文件中connection,最起码在实施的过程不用安装oracle客户端可能正常使用。

    转载请注明原文地址: https://ju.6miu.com/read-11911.html

    最新回复(0)