gpt4 book ai didi

c# - 如何处理用户代码未处理的索引超出范围异常?

转载 作者:行者123 更新时间:2023-11-30 21:15:38 25 4
gpt4 key购买 nike

我的工作程序有问题。一切都成功构建,但是当我调试时,我在 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;

}

最佳答案

您应该确保 values[1] 存在,并且它可以转换为 double。

此外,如果对象是double,则不需要转换它,只需使用强制转换 ((double)values[1]values[1] as double )。

我不知道我是否应该告诉,但为了以防万一,数组是从零开始的,这意味着如果你想引用数组中的第一项,你应该 values[ 0] 而不是 values[1]。抱歉,如果没有必要。

如果有更简单的方法,您还应该重新考虑删除 while (true),除非您确实期望出现意外计数。

在您的问题中,两个查询都只返回一个数据字段,因此您应该在这两种情况下都使用 values[0]

关于c# - 如何处理用户代码未处理的索引超出范围异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5658141/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com