C# 大批量 数据 高效导入 oracle 【急!!!!!】
在网上找了一个例子
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;
}
}
} C# Oracle
[解决办法]
1.页面响应时间大概在10多分钟就会超时
2.这种方式会将所有数据加载到内存,数据量大了就会溢出
3.ODAC存在比较严重的内存泄漏问题(非官方)
[解决办法]
建议LZ分批分批的导
比如每次导入100条 慢慢地就导完了
当然LZ也可以把数据导出成excel 放到toad for oracle 去导入oracle
[解决办法]
数据太多就分步执行吧,用ajax来回调
[解决办法]
分批次导入。