我的工作计划存在问题。一切都成功构建,但是当我调试时,我在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;
}
答案 0 :(得分:4)
您应该确保values[1]
存在,并且它可以转换为double。
此外,如果对象是双精度型,则无需转换它,只需使用强制转换((double)values[1]
或values[1] as double
)。
我不知道我是否应该告诉,但为了以防万一,数组是从零开始的,这意味着如果你想引用数组中的第一项,你应该values[0]
而不是values[1]
。对不起,如果没有必要的话。
如果您有更简洁的方法,您还应该重新考虑删除while (true)
,除非您确实需要意外的计数。
在您的问题中,两个查询只返回一个数据字段,因此在两种情况下都应使用values[0]
。
答案 1 :(得分:0)
您需要确保数组中包含许多项...
if (values.Length >= 2) myvar = values[1];
这将允许您在使用之前看到该数组包含许多对象。
并记住数组使用对象0开始计数,因此您要访问的任何对象都比长度少一个。你需要。
it might be values.count im working from memory. let me know and i will ammend my post
答案 2 :(得分:0)
首先应检查值的长度,确保索引(在本例中为1)小于值的长度。
通常,您的代码应该更加结构化并准备好处理错误条件(例如无数据)
使用结构化异常处理也可以提供帮助。将整个代码块放入try ... catch块。
答案 3 :(得分:0)
问题很可能来自您不希望从数据库中获得的回报。如果字段计数为0,并且没有值[1],则会得到索引异常
答案 4 :(得分:0)
根据您的查询:
//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") + "' ";
您应该使用值[0]而不是值[1],因为此查询只返回1列count(distinct rp.repair_ord)
。它或者是这个或查询是错误的,你想要返回其他列。