gaurav.s23 Ответов: 3

Как мне решить, что индекс был вне диапазона. Должен быть неотрицательным и меньше размера коллекции. Ошибка


Я получаю следующие исключения в своем коде
Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index


Я не мог понять, почему он бросает это исключение.

Поток программы выглядит примерно так :

У меня есть коллекция чисел, скажем, от 1 до 200.
для каждого номера в коллекциях он идет и запускает приведенный ниже код. до 120 года он не бросал исключения, но для 121 года он бросал исключение.
и это происходит случайным образом, если запустить программу снова, я могу получить такое же исключение для 123.

В чем может быть причина? Это что-то связано с подключением к базе данных? Есть ли какие-то проблемы в моем коде? если это так, то не следует ли его выбрасывать на первой итерации? Я ничего не понимал. Пожалуйста, помогите мне.

Что я уже пробовал:

public DataTable GetGrade(DataTable dtReportTbl)
       {
           dtReportTbl.Columns.Add("Salary_Grade", typeof(System.String));
           dtReportTbl.Columns.Add("InsertedDate", typeof(DateTime));
           string query = "select Grade from student_grade where myTable in ('JMS','JSM') and  student_Num in ({StudentNums}) order by student_Num";

           try
           {
               using (OracleConnection con = new OracleConnection(connectionString))
               {
                   List<string> storeNums = new List<string>();


                   foreach (DataRow row in dtReportTbl.Rows)
                   {
                       storeNums.Add(row["store"].ToString());
                   }

                   var cmd = new OracleCommand(query, con);

                   // extension method to get StudentNums as to achieve cmd.Parameters.Add(new OracleParameter("pStudentNums", studentNum)
                   cmd.AddArrayParametersOra(storeNums, "StudentNums");

                   var rdr = cmd.ExecuteReader();
                   List<string> salGradelist = new List<string>();
                   while (rdr.Read())
                   {
                       salGradelist.Add(rdr["Grade"].ToString());
                   }

                   int i = 0;
                   foreach (DataRow row in dtReportTbl.Rows)
                   {
                       row["Grade"] = salGradelist[i];
                       row["RecordInsertedDate"] = DateTime.Today;
                       i++;
                   }
               }
           }
           catch (Exception ex)
           {
               throw;
           }

           return dtReportTbl;
       }

3 Ответов

Рейтинг:
22

OriginalGriff

Чтобы узнать это, вам нужно посмотреть на данные в вашем приложении во время его работы - и мы не можем этого сделать!
Так что все будет зависеть от вас.
Поместите точку останова в первую строку метода и запустите код через отладчик. Затем посмотрите на свой код и на свои данные и определите, что должно произойти вручную. Затем по одному шагу в каждой строке проверяйте, что именно то, что вы ожидали, произошло. Когда это не так, тогда у вас есть проблема, и вы можете вернуться назад (или запустить ее снова и посмотреть более внимательно), чтобы выяснить, почему.

Извините, но мы не можем сделать это за вас-вам пора освоить новый (и очень, очень полезный) навык: отладку!


Рейтинг:
15

Richard Deeming

Наиболее вероятная причина заключается в том, что количество строк, возвращаемых из вашего запроса, не совпадает с количеством элементов в вашем массиве.

int i = 0;
foreach (DataRow row in dtReportTbl.Rows)
{
    ... = salGradelist[i]; // <-- Exception here
    ...
    i++;
}

Если запрос возвращает меньше строк, чем количество элементов в вашем массиве, то ваш код просто проигнорирует более поздние элементы.

Но если он вернется больше строки, затем переменная i он выйдет за пределы конца вашего массива, и вы получите исключение "index out of bounds".

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


[no name]

Теперь, как мне справиться с этой проблемой. поскольку мой запрос возвращает меньше строки, чем строка в таблице данных, например, мой datatable имеет studentNum 1,2,3, и теперь запрос возвращает оценку для 1 и 2.

Richard Deeming

Вам нужно будет вернуться Student_Num из запроса и найдите какой-нибудь способ сопоставить его с соответствующей оценкой в массиве.

[no name]

Благодарю вас сэр

Рейтинг:
1

Patrice T

Цитата:
Я не мог понять, почему он бросает это исключение.

Не делайте программы, полагающиеся на ожидания, сделайте так, чтобы ваша программа проверяла, оправдались ли ожидания. Когда ваша программа терпит неудачу, используйте отладчик для проверки переменных и проверки того, что является неожиданным условием.

Существует инструмент, который позволяет вам видеть, что делает ваш код, его имя отладчик Это также отличный инструмент обучения, потому что он показывает вам реальность, и вы можете увидеть, какие ожидания соответствуют реальности.
Когда вы не понимаете, что делает ваш код или почему он делает то, что делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик-Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010-YouTube[^]
Отладка кода C# в Visual Studio-YouTube[^]
Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.