C# 大批量 数据 高效导入 oracle 【急!!!!!】

卡胖 2013-04-24 12:28:44
在网上找了一个例子
http://www.cnblogs.com/isline/archive/2010/08/31/1813722.html
但是老是报错,
一会儿报错:内存溢出,一会儿报错连接中断,等等……
【【请问有没有可行的解决办法?】】
<%@ WebHandler Language="C#" Class="import" %>

using System;
using System.Web;
using Oracle.DataAccess.Client;

public class import : IHttpHandler
{

public void ProcessRequest(HttpContext context)
{
HttpRequest request = context.Request;
HttpResponse response = context.Response;
response.ContentType = "text/plain";
string outStr = ""; //服务器返回信息

int recc = 1000;
outStr = Import(recc);
response.Write(outStr);
response.End();
}

public string Import(int recc)
{

string connectionString = Maticsoft.DBUtility.PubConstant.ConnectionString;
string SQLString = "insert into HBS_XZQ(pkid,districts,percapitagdp,age) values (S_HBS_XZQ.Nextval,:districts,:percapitagdp,:age)";
using (OracleConnection connection = new OracleConnection(connectionString))
{
using (OracleCommand cmd = new OracleCommand(SQLString, connection))
{
//这个参数需要指定每次批插入的记录数
cmd.ArrayBindCount = recc;
try
{
connection.Open();

//以数组作为参数
//下面定义几个数组,分别表示三个字段,数组的长度由参数直接给出
int[] dedistricts = new int[recc];
int[] dePercapitagdp = new int[recc];
int[] deAge = new int[recc];

// 为了传递参数,不可避免的要使用参数,下面会连续定义三个
// 从名称可以直接看出每个参数的含义,不在每个解释了

OracleParameter districtParam = new OracleParameter(":districts", OracleDbType.Int32);
districtParam.Direction = System.Data.ParameterDirection.Input;
districtParam.Value = dedistricts;
cmd.Parameters.Add(districtParam);

OracleParameter capitagdpParam = new OracleParameter(":percapitagdp", OracleDbType.Int32);
capitagdpParam.Direction = System.Data.ParameterDirection.Input;
capitagdpParam.Value = dePercapitagdp;
cmd.Parameters.Add(capitagdpParam);

OracleParameter deptLocParam = new OracleParameter(":age", OracleDbType.Int32);
deptLocParam.Direction = System.Data.ParameterDirection.Input;
deptLocParam.Value = deAge;
cmd.Parameters.Add(deptLocParam);

System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();
//在下面的循环中,先把数组定义好
for (int i = 0; i < recc; i++)
{
dedistricts[i] = i;
dePercapitagdp[i] = i;
deAge[i] = i;
}

//这个调用将把参数数组传进SQL,同时写入数据库
cmd.ExecuteNonQuery();
sw.Stop();
return sw.ElapsedMilliseconds.ToString();
}
catch (Exception E)
{
connection.Close();
throw new Exception(E.Message);
}
}
}
}

public bool IsReusable
{
get
{
return false;
}
}
}
...全文
675 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
fanyunxiaoyuer 2014-09-19
  • 打赏
  • 举报
回复
把数据 写 到文本 文件, 使用 load data 外部指令导入到数据库。 这样既避免了 内存溢出又快速
卡胖 2013-04-26
  • 打赏
  • 举报
回复
引用 8 楼 Yushangyuan 的回复:
分批次导入。
是分批次导入的,思路是这样,后来终于找到原因了,是因为引用的 Oracle.DataAccess.Client.dll版本的缘故。直接找到本机上的 Oracle.DataAccess.Client.dll引用就OK了。 感谢各位,结贴
卡胖 2013-04-25
  • 打赏
  • 举报
回复
其实我不明白的是,在网上找的例子在我机子上跑不起来,提示如上错误,但是在别人的机子上就直接能跑。 可能是我机子内存消耗问题,总之就是一直没有解决。
Yushangyuan 2013-04-25
  • 打赏
  • 举报
回复
分批次导入。
niss 2013-04-24
  • 打赏
  • 举报
回复
1.页面响应时间大概在10多分钟就会超时 2.这种方式会将所有数据加载到内存,数据量大了就会溢出 3.ODAC存在比较严重的内存泄漏问题(非官方)
md5e 2013-04-24
  • 打赏
  • 举报
回复
引用 5 楼 kayuejian 的回复:
引用 3 楼 liuchaolin 的回复: 数据太多就分步执行吧,用ajax来回调 数据已经上传过来了,分部执行不是在ajax来回调了
数据上传过来,先保存到Session或cache中,然后用ajax回调,一次导入一部份
卡胖 2013-04-24
  • 打赏
  • 举报
回复
引用 3 楼 liuchaolin 的回复:
数据太多就分步执行吧,用ajax来回调
数据已经上传过来了,分部执行不是在ajax来回调了
卡胖 2013-04-24
  • 打赏
  • 举报
回复
引用 2 楼 yyl8781697 的回复:
建议LZ分批分批的导 比如每次导入100条 慢慢地就导完了 当然LZ也可以把数据导出成excel 放到toad for oracle 去导入oracle
不知道为何要是改成小于100的话,就会报【“<Module>”的类型初始值设定项引发异常】这个错误
md5e 2013-04-24
  • 打赏
  • 举报
回复
数据太多就分步执行吧,用ajax来回调
yyl8781697 2013-04-24
  • 打赏
  • 举报
回复
建议LZ分批分批的导 比如每次导入100条 慢慢地就导完了 当然LZ也可以把数据导出成excel 放到toad for oracle 去导入oracle

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧