Как мне обработать индекс вне исключительной ситуации, не обработанный кодом пользователя? - PullRequest
2 голосов
/ 14 апреля 2011

У меня проблемы с моей программой для работы. Все строится успешно, но при отладке я получил исключение индекса из диапазона при totalUnits = Convert.ToDouble (values ​​[1] .ToString ()) ;. Предполагается, что программа рассчитает формулу и вернет значение в текстовое поле. Я весьма озадачен. Может кто-нибудь, пожалуйста, помогите мне? Спасибо.

Justin

Вот часть моего кода, чтобы посмотреть:

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;

    }

Ответы [ 5 ]

4 голосов
/ 14 апреля 2011

Вы должны убедиться, что values[1] существует и что он конвертируется в удвоение.

Кроме того, если объект является двойным, вам не нужно конвертировать его, просто используйте приведение ((double)values[1] или values[1] as double).

Я не знаю, должен ли я сказать, но на всякий случай массивы начинаются с нуля, что означает, что если вы хотите сослаться на первый элемент вмассив, вы должны values[0] вместо values[1].извините, если в этом нет необходимости.

Вам также следует пересмотреть вопрос об удалении while (true), если есть более простой способ сделать это, если только вы не ожидаете неожиданного подсчета.

В вашем вопросе,оба запроса возвращают только одно поле данных, и поэтому вы должны использовать values[0] в обоих случаях.

0 голосов
/ 14 апреля 2011

На основании вашего запроса:

//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).Либо это так, либо запрос неправильный, и вы хотите вернуть другие столбцы.

0 голосов
/ 14 апреля 2011

Скорее всего, проблема связана с возвратом, которого вы не ожидаете от своей базы данных.Там, где число полей равно 0 и там нет значений [1], и вы получаете исключение индекса

0 голосов
/ 14 апреля 2011

Сначала вы должны проверить длину значений и убедиться, что индекс (в данном случае 1) меньше длины значений.

В целом ваш код должен быть более структурированным и подготовленным для обработкиусловия ошибки (например, отсутствие данных)

при использовании структурированной обработки исключений также могут помочь.Поместите весь этот блок кода в блок try ... catch.

0 голосов
/ 14 апреля 2011

Вы захотите убедиться, что массив имеет столько элементов ...

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...