Anele Ngqandu Ответов: 4

Исключение Индекса Вне Диапазона .


Привет, ребята, я пытаюсь загрузить gridView, используя 3-уровневую архитектуру.Теперь я не совсем уверен в своем коде, но на данный момент получаю эту ошибку "IndexOutOfRangeException productID" и это сбивает меня с толку.


Ниже приведен метод в бизнес - слое, чтобы получить все мои продукты

public ArrayList getProducts()
        {
            using (SqlConnection con = new SqlConnection(ConnectionString))
            {
                SqlCommand cmd = new SqlCommand("procReturnAllProducts", con);
                cmd.CommandType = CommandType.StoredProcedure;
                ArrayList productsList = new ArrayList();
                try
                {
                    con.Open();
                    SqlDataReader reader = cmd.ExecuteReader();
                    while (reader.Read())
                    {
                        Products products = new Products(Convert.ToInt32(reader["productID"]), Convert.ToString(reader["productName"]), Convert.ToInt32(reader["supplierID"]), Convert.ToInt32(reader["categoryID"]), Convert.ToString(reader["quantityPerUnit"]), Convert.ToDouble(reader["unitPrice"]), Convert.ToInt16(reader["unitInStoct"]), Convert.ToInt16(reader["unitOnOrder"]), Convert.ToInt16(reader["reOrderLevel"]), Convert.ToBoolean(reader["discontinue"]));
                        productsList.Add(products);
                    }//End while
                    reader.Close();
                }
                catch (SqlException)
                {
                    throw new ApplicationException("Error connection to database");
                }
                return productsList;
            }//End Using
        }


Теперь ниже находится моя клиентская форма

public partial class Form1 : Form
    {
        public ProductsBL productBL;
        public ArrayList prodList;
        public Form1()
        {
            InitializeComponent();
             productBL = new ProductsBL();
             prodList = new ArrayList();
             prodList = productBL.getProducts();
             dataGridView1.DataSource = prodList;
        }
    }

4 Ответов

Рейтинг:
28

CodeHawkz

Если я не ошибаюсь, попробуйте запустить хранимую процедуру, которая выполняется с этим кодом на sql server вручную, и проверьте результаты. Убедитесь, что есть столбец с именем "productID", которого, как мне кажется, нет :)

Если я прав, то исключение IndexOutOfRangeException возникает при вызове свойства reader["productID"], поскольку в возвращаемом результирующем наборе такого поля нет.

И о, просто на заметку ... метод "getProducts()" всегда возвращает ArrayList, который никогда не будет равен null. Поэтому в вашей клиентской форме отбросьте строку "prodList = new ArrayList();". поскольку объект, созданный с помощью этой строки кода, игнорируется в следующей строке, когда сохраняется ссылка на ArrayList, возвращенный из вашего метода, вместо объекта, созданного с помощью вышеупомянутой строки кода.

Надеюсь, это поможет

С Уважением, Пасан.


Anele Ngqandu

К спасибо, все работает

Рейтинг:
23

Dylan Morley

Он не может найти поле "кодтовара"

Перейдите в окно SQL - запроса и выполните его procReturnAllProducts, существует ли это поле в результирующем наборе? Может быть, пишется немного по-другому?


Anele Ngqandu

К спасибо, все работает

Рейтинг:
19

Olivier Levrey

Я полагаю, что исключение было отправлено из-за этого: reader["productID"].
Проверьте это productID существует.


Anele Ngqandu

К спасибо, все работает

Рейтинг:
1

Manjinder.Singh

почему вы используете метод преобразования. SQlDataReader предоставляет методы Get для преобразования в стандартные типы данных.

Класс sqldatareader-узел MSDN[^]

Подобный этому:

int a = reader.GetInt32(reader.GetOrdinal("productID"));


Anele Ngqandu

К его работам. только то, что я использовал "productID" вместо "ProductID"