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

来源:互联网 发布:跳跃网络被告 编辑:程序博客网 时间:2024/05/18 06:44

前提

    上一版的导入十分麻烦,2W的数据量和死机了似得。经过不断的探索,终于搞出了优化后的一版,优化之后用时不超过5秒。下面就是demo了,哈哈。

    因为我在解析完xml之后把所有的数据都放到list中了,但是使用OracleBulkCopy,实现就是表和表之间的复制,就是把数据放到DataTable中,然后直接复制到数据库对应的表中。

OracleBulkCopy使用

所以利用此方法就是实现,需要先把list转成DataTable。

        public DataTable ListToDataTable<T>(List<T> entitys)        {            //检查实体集合不能为空            if (entitys == null || entitys.Count < 1)            {                throw new Exception("需转换的集合为空");            }            //取出第一个实体的所有Propertie            Type entityType = entitys[0].GetType();            PropertyInfo[] entityProperties = entityType.GetProperties();            //生成DataTable的structure            //生产代码中,应将生成的DataTable结构Cache起来,此处略            DataTable dt = new DataTable();            for (int i = 0; i < entityProperties.Length; i++)            {                //dt.Columns.Add(entityProperties[i].Name, entityProperties[i].PropertyType);                dt.Columns.Add(entityProperties[i].Name);            }            //将所有entity添加到DataTable中            foreach (object entity in entitys)            {                //检查所有的的实体都为同一类型                if (entity.GetType() != entityType)                {                    throw new Exception("要转换的集合元素类型不一致");                }                object[] entityValues = new object[entityProperties.Length];                for (int i = 0; i < entityProperties.Length; i++)                {                    entityValues[i] = entityProperties[i].GetValue(entity, null);                }                dt.Rows.Add(entityValues);            }            return dt;        }
下面是快速插入的方法

        public void BulkToDB(DataTable dt, string targetTable)        {            string connOrcleString = "Data Source=;User Id=;Password=;";            string err = "大批量插入时产生错误";            Oracle.DataAccess.Client.OracleConnection conn = new Oracle.DataAccess.Client.OracleConnection(connOrcleString);            if (conn.State != ConnectionState.Open)            { conn.Open(); }            Oracle.DataAccess.Client.OracleBulkCopy bulkCopy = new Oracle.DataAccess.Client.OracleBulkCopy(conn, Oracle.DataAccess.Client.OracleBulkCopyOptions.Default);            bulkCopy.BatchSize = 100000;            bulkCopy.BulkCopyTimeout = 260;            //targetTable目标表名            bulkCopy.DestinationTableName = targetTable;            try            {                if (conn.State != ConnectionState.Open)                {                    conn.Open();                }                // conn.Open();                  if (dt != null && dt.Rows.Count != 0)                {                    bulkCopy.WriteToServer(dt);                }            }            catch (Exception ex)            {                throw ex;            }            finally            {                conn.Close();                if (bulkCopy != null)                    bulkCopy.Close();            }        }
调用关系

            DataTable dt = ListToDataTable(goodDrugCodeLists);            string tableName = "表名";            BulkToDB(dt, tableName);

问题

注意啊,本文我引用的是Oracle.DataAccess.dll,大家可知道引用Oracle的这个dll带来的问题是什么???

    要使用Oracle.DataAccess.dll,在使用的机子上必须安装Oracle的客户端,你说坑不坑,为了减少实施团队的工作量,在我正高兴的时候,技术主管告诉我,这个方法不能用,瞬间觉得好心塞。而且我们的系统为了杜绝使用Oracle.DataAccess.dll,直接把其中的connection方法屏蔽了,就算你安装了Oracle客户端,也调不通!!!

    在坑货下面必然还有别的方法替代,果不其然,小编找到了新的方法,还请我们技术主管帮小编封装了一下,变成公共的方法,方便大家使用。瞬间觉得技术主管也不是那么高冷,关于具体的封装,见下篇博客。

总结

    没事就多尝试一下,必然会有更好的方法替代,千万别放弃,没事多和技术大牛交流,站在巨人的肩膀上啊。这可是老师教的!哈哈,还是要说,允许引用Oracle.DataAccess.dll,这个方法还是非常可取的,而且在sqlserver,MySQL中都有类似的方法。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 建行买的理财保险单子丢了怎么办 退休老师饭卡的钱突然少了怎么办 背驼得厉害头低的厉害怎么办 被别人举报自己碰瓷了怎么办 苹果平板微信屏幕不是全屏怎么办 大冒险告白被接受了怎么办在线阅读 手机屏锁图案密码忘了怎么办 opp手机锁屏密码忘了怎么办 宝宝的玩具里面脏了洗不到怎么办 早上起来眼睛被眼屎粘住了怎么办 魔兽世界神器满级任务放弃了怎么办 魔兽世界神器满级任务没接到怎么办 情侣空间上的照片删了怎么办 微信好友群群主把你踢出房间怎么办 我被车撞了对方把现场破坏该怎么办 美术生专业分可以文化分不行怎么办 小狗又吐又拉不吃东西怎么办 狗狗把脖子挠破了怎么办 几分钟我的手机疯狂收到短信怎么办 初中孩子沉迷动漫及画动漫画怎么办 打仗在派出所保释出来人跑了怎么办 贴门槛石瓷砖贴多了要怎么办 建设银行中职学生资助卡丢了怎么办 建行网银u盾丢了怎么办 深水区换气时喝了口水怎么办 撞到别人车了 我走了 怎么办 自己班同学被自己取好多外号怎么办 刚学会走路的宝宝脚外八字怎么办 宝宝两岁走路膝盖弯曲不直怎么办 一岁多的宝宝走路o型腿怎么办 21个月的宝宝走路o型腿怎么办 宝宝十一个月了0型腿怎么办 14个月宝宝o型腿怎么办 深蹲了三个月大腿变粗了怎么办 脚踢球时被踢肿了变紫了怎么办 没钱去健身房想要练出好身材怎么办 群里有人发反政府视频怎么办 部队取消番号后之前军人档案怎么办 新疆武警黄金部队新兵改革后怎么办 别人偷了自己的东西没有证据怎么办 家里项链被邻居偷了没有证据怎么办