System.IndexOutOfRangeException: 索引超出了数组界限
场景:急问:System.IndexOutOfRangeException: 索引超出了数组界限解决方案
急问:System.IndexOutOfRangeException: 索引超出了数组界限
最近需要从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);
}
}
------解决方案--------------------
可以试试分多次导出,一次导出1000条
------解决方案--------------------
从上面的代码看不出有什么问题,请贴InputData(para);的代码
ArrayList para = new ArrayList();//优化:这句话应放在循环外面
------解决方案--------------------
重新生成应该没什么问题,当然你也可以用外面new里面clear的方法,但觉得问题不是在那,因为你有try catch如果是那里面报出的异常应该在CATCH里
------解决方案--------------------
一种有效的方法是分多次取数据,每次只取有限行,比如1万行,不仅效率高,吃内存还小。
只需在select语句后加上行数控制,如:rownumber> 100 and rownumber <201
相信此法能解决,为测试,如果可以说一声。
------解决方案--------------------
你首先要找出错误行, 可以使用你的日志功能来找出(取消try/catch)
------解决方案--------------------
可以试试分多次导出
------解决方案--------------------
这个根本不是程序的问题,你看一下MySQL和Oracle在字段类型定义方面的差异,是在你的第100多万行时,从Oracle中获得的数据在写入MySQL时,数组溢出,比如MySQL的字段长度不够,或者数值类型的长度与Oracle中的长度不匹配之类的。
急问:System.IndexOutOfRangeException: 索引超出了数组界限
最近需要从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);
}
}
------解决方案--------------------
可以试试分多次导出,一次导出1000条
------解决方案--------------------
从上面的代码看不出有什么问题,请贴InputData(para);的代码
ArrayList para = new ArrayList();//优化:这句话应放在循环外面
------解决方案--------------------
重新生成应该没什么问题,当然你也可以用外面new里面clear的方法,但觉得问题不是在那,因为你有try catch如果是那里面报出的异常应该在CATCH里
------解决方案--------------------
一种有效的方法是分多次取数据,每次只取有限行,比如1万行,不仅效率高,吃内存还小。
只需在select语句后加上行数控制,如:rownumber> 100 and rownumber <201
相信此法能解决,为测试,如果可以说一声。
------解决方案--------------------
你首先要找出错误行, 可以使用你的日志功能来找出(取消try/catch)
------解决方案--------------------
可以试试分多次导出
------解决方案--------------------
这个根本不是程序的问题,你看一下MySQL和Oracle在字段类型定义方面的差异,是在你的第100多万行时,从Oracle中获得的数据在写入MySQL时,数组溢出,比如MySQL的字段长度不够,或者数值类型的长度与Oracle中的长度不匹配之类的。