oracle 不间断空格,【物流系统】——C#Oracle批量导入(二)OracleBulkCopy

前提

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

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

OracleBulkCopy使用

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

public DataTable ListToDataTable(List 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值