【物流系统】——C#Oracle批量导入(三)全表匹配

来源:互联网 发布:高仿阿迪耐克衣服淘宝 编辑:程序博客网 时间:2024/05/03 17:59

前提

    介于Oracle.DataAccess.dll使用问题,小编又找了一种新的替代方式,还请技术主管帮忙封装了一下,以后遇到大数据导入的时候,就再也不害怕了,哈哈。

    忍不住了直接上代码了哈哈。

过程

参数赋值到sql中

       private void PrepareCommand(OracleCommand cmd, OracleConnection conn, OracleTransaction trans, string cmdText, OracleParameter[] cmdParms)        {            if (conn.State != ConnectionState.Open)                conn.Open();            cmd.Connection = conn;            cmd.CommandText = cmdText;            cmd.BindByName = true;            if (trans != null)                cmd.Transaction = trans;            cmd.CommandType = CommandType.Text;//cmdType;            if (cmdParms != null)            {                foreach (OracleParameter parm in cmdParms)                    cmd.Parameters.Add(parm);            }        }
导入的方法

        #region 批量导入        public bool BatchImport(string SQLString, int rownum, params OracleParameter[] cmdParms)        {            using (OracleConnection connection = new OracleConnection(this.connectionString))            {                                using (OracleCommand cmd = new OracleCommand(SQLString, connection))                {                    try                    {                        cmd.CommandType = CommandType.Text;                        cmd.ArrayBindCount=rownum;                        this.PrepareCommand(cmd, connection, null, SQLString, cmdParms);                        //connection.Open();                        int rows=cmd.ExecuteNonQuery();                        connection.Close();                        cmd.Dispose();                        connection.Dispose();                        return rows >= 0 ? true : false;                    }                    catch (Oracle.ManagedDataAccess.Client.OracleException E)                    {                        connection.Close();                        //throw new Exception(E.Message);                        return false;                    }                }            }        }        #endregion
组建参数

        /// <summary>        /// 组建参数用        /// </summary>        /// <param name="name"></param>        /// <param name="oracleType"></param>        /// <param name="direction"></param>        /// <param name="size"></param>        /// <param name="value"></param>        /// <returns></returns>        public OracleParameter BuildOracleParameter(string name, OracleDbType oracleType, ParameterDirection direction, int size, object value)        {            OracleParameter paramerer = new OracleParameter(name, value);            paramerer.ParameterName = name;            paramerer.OracleDbType = oracleType;            paramerer.Direction = direction;            if (size > 0)            {                paramerer.Size = size;            }            return paramerer;        }
调用过程

       #region 直接全表匹配插入+BatchGoodsDrugCode+贾文静+2017年3月9日12:44:03        public bool BatchGoodsDrugCode(List<Model.GOODS_DRUGCODE> goodDrugCodeLists)        {            string sql = "INSERT INTO goods_drugcode  VALUES (:org_id,:goods_id,:batch_no,:valid_date,:product_date,:code,:parent_code,:Isleaf,sysdate,:create_man,:Isdelete,sysdate,:modify_man,:owner_id)";                       int recc = goodDrugCodeLists.Count;            string[] org_id = new string[recc];            string[] goods_id = new string[recc];            string[] batch_no = new string[recc];            string[] valid_date = new string[recc];            string[] product_date = new string[recc];            string[] code = new string[recc];            string[] parent_code = new string[recc];            string[] Isleaf = new string[recc];            string[] create_man = new string[recc];            string[] Isdelete = new string[recc];            string[] modify_man = new string[recc];            string[] owner_id = new string[recc];            for (int i = 0; i < recc; i++)            {                org_id[i] = goodDrugCodeLists[i].ORG_ID.ToString();                goods_id[i] = goodDrugCodeLists[i].GOODS_ID.ToString();                batch_no[i] = goodDrugCodeLists[i].BATCH_NO.ToString();                valid_date[i] = goodDrugCodeLists[i].VALID_DATE.ToString();                product_date[i] = goodDrugCodeLists[i].PRODUCT_DATE.ToString();                code[i] = goodDrugCodeLists[i].CODE.ToString();                parent_code[i] = goodDrugCodeLists[i].PARENT_CODE.ToString();                Isleaf[i] = goodDrugCodeLists[i].ISLEAF.ToString();                create_man[i] = goodDrugCodeLists[i].CREATE_MAN.ToString();                Isdelete[i] = goodDrugCodeLists[i].ISDELETED.ToString();                modify_man[i] = goodDrugCodeLists[i].MODIFY_MAN.ToString();                owner_id[i] = goodDrugCodeLists[i].OWNER_ID.ToString();            }            OracleParameter[] param = {                     ora.BuildOracleParameter(":org_id",OracleDbType.Varchar2,ParameterDirection.Input,0,org_id),                     ora.BuildOracleParameter(":goods_id",OracleDbType.Varchar2,ParameterDirection.Input,0,goods_id),                     ora.BuildOracleParameter(":batch_no",OracleDbType.Varchar2,ParameterDirection.Input,0,batch_no),                     ora.BuildOracleParameter(":valid_date",OracleDbType.Varchar2,ParameterDirection.Input,0,valid_date),                     ora.BuildOracleParameter(":product_date",OracleDbType.Varchar2,ParameterDirection.Input,0,product_date),                     ora.BuildOracleParameter(":code",OracleDbType.Varchar2,ParameterDirection.Input,0,code),                     ora.BuildOracleParameter(":parent_code",OracleDbType.Varchar2,ParameterDirection.Input,0,parent_code),                     ora.BuildOracleParameter(":Isleaf",OracleDbType.Varchar2,ParameterDirection.Input,0,Isleaf),                     ora.BuildOracleParameter(":create_man",OracleDbType.Varchar2,ParameterDirection.Input,0,create_man),                     ora.BuildOracleParameter(":Isdelete",OracleDbType.Varchar2,ParameterDirection.Input,0,Isdelete),                     //ora.BuildOracleParameter(":modify_date",OracleDbType.Varchar2,ParameterDirection.Input,0,modify_date),                     ora.BuildOracleParameter(":modify_man",OracleDbType.Varchar2,ParameterDirection.Input,0,modify_man),                     ora.BuildOracleParameter(":owner_id",OracleDbType.Varchar2,ParameterDirection.Input,0,owner_id)            };            return ora.BatchImport(sql, recc, param);        }        #endregion
终于完美实现大量数据的直接插入,2W数据,不超过五秒,而且引用的是Oracle.ManagedDataAccess.Client,实施起来也比较方便。效率也非常可观。

问题

    正在小编嘚瑟的时候,组长说了一句话,心都塞了。如果在数据表上添加字段有影响吗,需要改程序吗?

    这个小编先说一句啊,这个方法是对表中全部字段匹配,在sql语句insert需要写所有的字段,否则会提示错误。所以这样的弊端就是每当数据表结构改变,程序也需要改变,真是不够灵活的!!!

    所以当组长说到这个问题时候,我才开始考虑,修改表结构的问题。无奈,这次又不是很完美。好在数据表结构不经常改变,所以还可以正常使用。

总结

    做程序的时候啊,还是要多多考虑啊,灵活性啊,效率啊,一定要综合考虑啊。

    批量导入到此结束,三种方式,根据情况自由选择吧。






0 0