首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

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

2013-05-02 
C# 大批量数据高效导入 oracle 【急!!!!!】在网上找了一个例子http://www.cnblogs.com/isline/archive/2010/

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来回调
[解决办法]
分批次导入。

热点排行