最近需要从Oracle库中将大量(百万级)的数据用程序导入到mysql中程序每次跑到一百万多一点就出现这样的异常,不知道如何解决.主要代码很简单,请大家帮忙看看,如何解决,谢谢.
        public void Oracle2Mysql()
        {
            GetConn();
            GetMySqlConn();         
            OracleCommand cmd = conn.CreateCommand();
            cmd.CommandText = "select s.email,s.createdate,s.iforder,s.updatedate from s_subscriber s";            conn.Open();
            mysqlconn.Open();            OracleDataAdapter oracleDAP = new OracleDataAdapter(cmd);
            DataSet ds = new DataSet();
            oracleDAP.Fill(ds, "table");
            conn.Close();
            
            try
            {
                foreach (DataRow dr in ds.Tables[0].Rows)
                {
                    
                    string EmailSupplier = GetEmailSupplier(dr["email"].ToString());
                    string EmailSupplierCode = GetEmailSupplierCode(EmailSupplier.ToString());                    ArrayList para = new ArrayList();
                    para.Add(dr["email"].ToString());
                    para.Add(EmailSupplierCode.ToString());
                    para.Add(dr["iforder"].ToString());
                    para.Add(dr["createdate"].ToString());
                    para.Add(dr["updatedate"].ToString());
                    InputData(para);
                    Console.WriteLine("Email:{0}", para[0]);
                    Console.WriteLine("EmailSupplierCode:{0}", EmailSupplierCode.ToString());
                    Console.WriteLine("IfOrder:{0}", para[2]);
                    Console.WriteLine("CreateDate:{0}", para[3]);
                    Console.WriteLine("UpdateDate:{0}", para[4]);
                    Console.WriteLine("*************");                }
                ds.Clear();
                ds.Dispose();
                mysqlconn.Close();
                Console.WriteLine("Complete");
            }
            catch (Exception ex)
            {
                Log(ex.ToString());
                Console.WriteLine(ex.Message);
            }        }

解决方案 »

  1.   

    下面是log里的信息,但是看不出来
    ,这个时候已经跑了一百零几万个数据了.System.IndexOutOfRangeException: 索引超出了数组界限。
       在 EmailInitialize.Initialize.Oracle2Mysql() 位置 D:\code\EmailInitialize\EmailInitialize\Initialize.cs:行号 127
      

  2.   

    给出的127行与程序基本没关系的
    是个oracle的连接函数 GetConn();//127行
      

  3.   

    看是哪行出错了,结合trace更明显一些,不然这样没法找
      

  4.   

    报出是第127行GetConn()?那你给出调用Oracle2Mysql()的代码我们看看
      

  5.   

    public static System.Data.OracleClient.OracleConnection GetConn()
            {
                try
                {
                    conn = new OracleConnection(GetConnString());
                    return conn;
                    
                }
                catch (Exception ex)
                {
                    Log("读取Oracle数据库连接错误:\n" + ex.ToString());
                    return null;
                }
            }        public static string GetConnString()
            {
                try
                {
                    XmlDocument xml = new XmlDocument();
                    xml.Load(Environment.CurrentDirectory + "\\SysConfig.xml");
                    return xml.DocumentElement.SelectNodes("appSetting").Item(0).SelectNodes("add").Item(0).Attributes.GetNamedItem("value").InnerText.Trim();
                }
                catch (Exception ex)
                {
                    Log("读取数据库连接字符串错误:\n" + ex.ToString());
                    return String.Empty;
                }
            }
      

  6.   

    从上面的代码看不出有什么问题,请贴InputData(para);的代码
    ArrayList para = new ArrayList();//优化:这句话应放在循环外面
      

  7.   

    public void InputData(ArrayList para)
                 {               
                     try
                     {
                         string query = "insert into T_Subscriber(email,EmailSupplierCode,IfOrder,CreateDate,UpdateDate) values('" + para[0] + "','" + para[1] + "','" + para[2] + "','" + para[3] + "','" + para[4] + "');";
                         MySQLCommand cmd = new MySQLCommand(query.ToString(), mysqlconn);
                         cmd.ExecuteNonQuery();
                         Log(query.ToString());
                         
                     }
                     catch (Exception ex)
                     {
                         Log(ex.ToString());
                         Console.WriteLine(ex.Message);
                     }
              
                 }
      

  8.   

    哪里调用Oracle2Mysql()的。。?
      

  9.   

    如果把ArrayList para = new ArrayList();放在外面
    那么不是只有一个para了吗?数组会不会被撑的不行?
    这样每次循环重新生成一个有问题吗?
    请指教
      

  10.   

    main函数啊
    namespace EmailInitialize
    {
        class ClassMain
        {
            static void Main(string[] args)
            {
                Initialize email = new Initialize();
                
                email.Oracle2Mysql();            Console.ReadLine();
            }    }
    }
      

  11.   

    重新生成应该没什么问题,当然你也可以用外面new里面clear的方法,但觉得问题不是在那,因为你有try catch如果是那里面报出的异常应该在CATCH里
      

  12.   

    不知道有人遇见过类似的问题没有,
    不知道是c#的问题还是有可能是oracle的问题~~~
    貌似无法解决了~~晕~~~
      

  13.   

    一种有效的方法是分多次取数据,每次只取有限行,比如1万行,不仅效率高,吃内存还小。
    只需在select语句后加上行数控制,如:rownumber>100  and rownumber<201
    相信此法能解决,为测试,如果可以说一声。
      

  14.   

    更正自己上面的回复,写错了。将rownumber改成rownum
      

  15.   

    那应该使用什么方法呢?总不能有上千万的数据每次用rownum>几或者<几来实现吧?那不实际而且麻烦~~~这个程序是需要定期来跑更新的~~
      

  16.   

    你首先要找出错误行, 可以使用你的日志功能来找出(取消try/catch)
      

  17.   

    楼上的 已经试过几次了我想问一下就是 dataset这个函数的定义的空间有多大??string[] 这样的数组最大界限又是多少??
      

  18.   

    这个根本不是程序的问题,你看一下MySQL和Oracle在字段类型定义方面的差异,是在你的第100多万行时,从Oracle中获得的数据在写入MySQL时,数组溢出,比如MySQL的字段长度不够,或者数值类型的长度与Oracle中的长度不匹配之类的。