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[]) ;
.......................
} 展开
现在要按逗号拆分,存储,目前的做法是仅是拆分成数组,然后遍历数组入库,
如下, 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[]) ;
.......................
} 展开
6个回答
展开全部
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快了一止一点点...
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这样的大数据,没有主键,有没有什么方法可以每次执行时候都读到最新的数据呢?这样读出来,每次都会插入很多重复数据
追答
这个东西和上面的技术无关,根据你的业务需求获取相应的数据就行了,如果不能获取到正确的数据,你应该检查你的数据库设计是否满足业务要求.
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
建议是用orcale来处理,for循环效率很低。
或者你可以设置一个缓冲区,比如,100行100行的来。
方法很多种,具体,你自己试试。
或者你可以设置一个缓冲区,比如,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要快的多。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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
/// <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
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
可否详细点
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这么标准的数据....你为什么不存为文本文档,然后直接用loadfile就好了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询