C# 处理大数据量读取问题

orcale中 clob字段存储着 "889.123,556,111"这样的数据,数据量很大,几十万条。
现在要按逗号拆分,存储,目前的做法是仅是拆分成数组,然后遍历数组入库,
如下, R21 R22 长度也是不相同的,如果在循环中写判断,大神们有没有什么好的思路,给个点建议
string[] R21 = CLOBA数据.Split(new char[] { ',' }, StringSplitOptions.None);
string[] R22 = CLOBB数据.Split(new char[] { ',' }, StringSplitOptions.None);
........
for (int i = 0; i < R21.LENGTH; i++)
{
循环插入 ......................
insert into table (R21[i],R22[]) ;
.......................
}

第1个回答  推荐于2018-04-30
1.可以使用存诸过程+临时表的方式,具体请研究或是Baidu.
2.可以使用SqlServer的SqlBulkCopy,NET有相关的支持.比一行行插入速度提高1K倍以上.
SqlBulkCopy bulkCopy = new SqlBulkCopy(conn);
bulkCopy.DestinationTableName = "SpecialList";
bulkCopy.BatchSize = 500;
bulkCopy.BulkCopyTimeout = 300;

if (dt != null && dt.Rows.Count != 0)
{
bulkCopy.WriteToServer(dt);
}

SORRY,我看错了.OTP.NET也有对OracleBulkCopy的支持,用法大同小异,比循环插入和拼接SQL快了一止一点点...追问

您好,这个方法效率很好,服务器数据库数据只保留5天,第二天会删除第一天的,第三天会删除第二天的。以此类推,而且表里面都是clob这样的大数据,没有主键,有没有什么方法可以每次执行时候都读到最新的数据呢?这样读出来,每次都会插入很多重复数据

追答

这个东西和上面的技术无关,根据你的业务需求获取相应的数据就行了,如果不能获取到正确的数据,你应该检查你的数据库设计是否满足业务要求.

本回答被提问者和网友采纳
第2个回答  2013-08-26
建议是用orcale来处理,for循环效率很低。
或者你可以设置一个缓冲区,比如,100行100行的来。
方法很多种,具体,你自己试试。追问

对,我就需要这样类似缓冲区的模式,读几万条数去flush()一下,您那里有没有这样的代码,或者相关的网页,介绍下,谢谢啦。

追答

oracle相对于sql,它明显多了一个rownum列可用。
那么,你要100行的缓冲区,为什么不从这里入手?
举个例子:
第一次循环:
where rownum>0 and rownum 100 and rownum <=200
以此类推,将每次语句查出来的结果集,进行for或者foreach的操作。
然后,你可以每行进行Split,拼接:insert into table (R21[i],R22[])
最后,使用事务一次性提交,所有即可。

这种样子,比你直接查表获取的结果集进行for或foreach要快的多。

第3个回答  2016-03-05
  n 批量插入
  /// <summary> /// 将DataTable中数据批量插入远程服务器的数据表中
  /// </summary>
  /// <param name="dt">源数据集</param>
  /// <param name="Conn">目标服务器的数据连接字符串</param>
  /// <param name="FieldStr">要插入的字段</param>
  /// <param name="TableName">目标服务器的表名</param>
  //protected void SqlBulkCopyData(DataTable dt, string Conn, string[] FieldStr, String TableName)
  //{ // //使用SqlBulkCopy把内存表DataTable里的数据插入答卷数据表
  // SqlBulkCopy bcp = new SqlBulkCopy(Conn); // //指定目标数据库的表名
  // bcp.DestinationTableName = TableName;
  // //指定源列和目标列
  // foreach (string field in FieldStr)
  // { // bcp.ColumnMappings.Add(field, field); // }
  // //写入数据库表 // bcp.WriteToServer(dt); // bcp.Close(); //}
  #endregion
第4个回答  2016-02-03
可否详细点
第5个回答  2013-08-26
这么标准的数据....你为什么不存为文本文档,然后直接用loadfile就好了
相似回答