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

orcale中clob字段存储着"889.123,556,111"这样的数据,数据量很大,几十万条。现在要按逗号拆分,存储,目前的做法是仅是拆分成数组,然后遍历数组入库,... 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[]) ;
.......................
}
展开
 我来答
百度网友115a69b
推荐于2018-04-30 · TA获得超过253个赞
知道小有建树答主
回答量:428
采纳率:50%
帮助的人:384万
展开全部
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这样的大数据,没有主键,有没有什么方法可以每次执行时候都读到最新的数据呢?这样读出来,每次都会插入很多重复数据
追答
这个东西和上面的技术无关,根据你的业务需求获取相应的数据就行了,如果不能获取到正确的数据,你应该检查你的数据库设计是否满足业务要求.
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
FabKiller
2013-08-26 · TA获得超过586个赞
知道小有建树答主
回答量:676
采纳率:0%
帮助的人:483万
展开全部
建议是用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要快的多。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
梦想家运营官
2016-03-05 · TA获得超过1783个赞
知道小有建树答主
回答量:375
采纳率:83%
帮助的人:152万
展开全部
  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
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
a454587555
2016-02-03 · TA获得超过114个赞
知道答主
回答量:262
采纳率:0%
帮助的人:105万
展开全部
可否详细点
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
jadilee
2013-08-26 · TA获得超过472个赞
知道小有建树答主
回答量:475
采纳率:40%
帮助的人:199万
展开全部
这么标准的数据....你为什么不存为文本文档,然后直接用loadfile就好了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 4条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式