如何解决如何处理用户代码未处理的索引超出范围异常?
| 我的工作计划有问题。一切都成功构建,但是当我调试时,在totalUnits = Convert.Todouble(values [1] .ToString());处出现索引超出范围异常。该程序应该计算公式并将该值返回到文本框。我很困惑。有人可以帮帮我吗?谢谢。 贾斯汀 这是我要看的一些代码:private double GetRefurbRate()
{
string sql = \"\";
double Refurb_Rate = 0;
double totalRefurb = 0;
double totalUnits = 0;
string error_msg = \"\";
//Getting the value for sql for totalRefurb
sql = \"SELECT COUNT(distinct rp.repair_ord) \" +
\"FROM \" + schema + \".repair_part rp \" +
\"WHERE rp.repair_type = \'REFURB\' and rp.created_date > \'\" + DateTime.Now.ToString(\"d-MMM-yyyy\") + \"\' \";
while (true)
{
if (!myDb.Runsql(sql,true))
{
error_msg = \"DBError for getting Refurb Rate\";
break;
}
if (myDb.dbRdr.HasRows)
{
if (myDb.dbRdr.Read())
{
object[] values = new object[myDb.dbRdr.FieldCount];
myDb.dbRdr.GetValues(values);
Console.WriteLine(values[0].ToString());
totalRefurb = Convert.Todouble(values[0].ToString());
//Getting the value from sql for totalUnits
sql = \"SELECT count(distinct rp.repair_ord) \" +
\"FROM \" + schema + \".repair_part rp \" +
\"WHERE rp.repair_type = \'REFURB\' and rp.ref_desig is null and rp.created_date > \'\" + DateTime.Now.ToString(\"d-MMM-yyyy\") + \"\' \";
while (true)
{
if (!myDb.Runsql(sql,true))
{
error_msg = \"DBError for getting Refurb Rate\";
break;
}
if (myDb.dbRdr.HasRows)
{
if (myDb.dbRdr.Read())
{
values = new object[myDb.dbRdr.FieldCount];
myDb.dbRdr.GetValues(values);
Console.WriteLine(values[1].ToString());
totalUnits = Convert.Todouble(values[1].ToString());
try
{
//Formula for Refurb Rate
Refurb_Rate = totalRefurb / totalUnits * 100;
break;
}
catch (Exception e)
{
Console.WriteLine(e);
}
myDb.dbRdr.Close();
if (error_msg != String.Empty)
{
MessageBox.Show(error_msg,\"Get Refurb Rate\",MessageBoxButtons.OK,MessageBoxIcon.Asterisk);
}
break;
}
}
}
}
}
}
return Refurb_Rate;
}
解决方法
您应该确保存在“ 1”,并且可以将其转换为双精度。
另外,如果对象是双精度对象,则无需转换它,只需使用强制转换(
(double)values[1]
或values[1] as double
)。
我不知道该怎么说,但以防万一,数组是从零开始的,这意味着如果要引用数组中的第一项,则应使用values[0]
而不是values[1]
。很抱歉,如果没有必要。
如果有更简单的方法,您也应该重新考虑删除ѭ6,除非您确实预期到了意外的数目。
在您的问题中,两个查询仅返回一个数据字段,因此在两种情况下都应使用values[0]
。
,您应该首先检查值的长度,确保索引(在本例中为1)小于值的长度。
通常,您的代码应更结构化并准备处理错误情况(例如无数据)
使用结构化异常处理也可以提供帮助。将整个代码块放入try ... catch块中。
,该问题很可能是由于您没有从数据库中获得期望的回报而引起的。字段计数为0且没有Values [1]的地方,您将获得索引异常
,根据您的查询:
//Getting the value from sql for totalUnits
sql = \"SELECT count(distinct rp.repair_ord) \" + \"FROM \" + schema + \".repair_part rp \" +
\"WHERE rp.repair_type = \'REFURB\' and rp.ref_desig is null and rp.created_date > \'\" + DateTime.Now.ToString(\"d-MMM-yyyy\") + \"\' \";
您应该使用values [0]而不是values [1],因为此查询将仅返回1列count(distinct rp.repair_ord)
。是这个原因还是查询错误,您想返回其他列。
,您将要确保数组中有很多项...
if (values.Length >= 2) myvar = values[1];
这样您就可以在使用数组之前看到该数组包含的对象太多。
并且请记住,数组从对象0开始计数,因此,要访问的任何对象的长度都要比长度小1。你需要。
it might be values.count im working from memory. let me know and i will ammend my post
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。