如何处理用户代码无法处理的索引超出范围异常

本文关键字:处理 索引 异常 范围 代码 何处理 用户 | 更新日期: 2023-09-27 17:50:00

我的工作程序有问题。一切构建成功,但当我调试时,我得到了一个索引超出范围的异常在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)values[1]values[1] as double)。

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

如果有更简单的方法,您也应该重新考虑删除while (true),除非您期望得到意外的计数。

在您的问题中,两个查询都只返回一个数据字段,因此您应该在这两种情况下使用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