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

前提

    导入数据量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客户端可能正常使用。


评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mandy_i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值