【物流系统】——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
- 【物流系统】——C#Oracle批量导入(二)OracleBulkCopy
- 【物流系统】——C#Oracle批量导入(三)全表匹配
- 【物流系统】——C#中Oracle批量导入(一)
- OracleBulkCopy 批量插入oracle数据库的方法
- C# OracleBulkCopy 批量插入oracle数据库的方法
- OracleBulkCopy批量插入数据
- oracle的oraclebulkcopy的使用
- 北京物流信息管理系统(二)
- 【物流系统】——C#解析XML
- Oracle 批量导入Sequence
- Oracle批量数据导入
- oracle批量导入测试数据
- Mybatis+oracle 批量导入
- Oracle批量导入数据
- Oracle批量导入数据
- Mybatis Oracle 批量导入
- ORACLE批量导入
- C#---批量导入数据库
- EasyUI Ifrem弹出框问题
- bzoj1823(2 sat)
- Linux操作系统下如何制作Image映像文件
- C#实现Zip压缩解压实例
- Redis 设置密码
- 【物流系统】——C#Oracle批量导入(二)OracleBulkCopy
- linux虚拟机复制多节点配置IP
- oj练习--五位以内的对称素数
- skynet gateserver
- Content-Type深度了解
- zookeeper入门必读
- 第七届蓝桥杯 冰雹数
- 工作-会议纪要
- Linux的目录结构,cp,mv,touch,cat,more常用参数表