2017-01-07 4 views
1

У меня есть таблица под названием Product. Один из столбцов этой таблицы называется Naam. Это название продукта. Когда вы нажимаете на кнопку, все имена продуктов должны быть добавлены в поле со списком.Колонка SQL Server для Combobox?

Итак, если у меня есть 2 продукта: Cola & Fanta.

Программа должна показывать только столбец Naam в поле со списком. Не другие столбцы.

У меня уже есть эта кнопка, но она не работает.

db.AlleProducten("Select Naam from Product;", Product); 
cb_product.Items.Add(Product.Naam); 

И это метод, который выполняет запрос:

public void AlleProducten(string commandText, product Product) 
{ 
    using (SqlConnection conn = new SqlConnection(connectionString)) 
    using (SqlCommand cmd = new SqlCommand(commandText, conn)) 
    { 
     conn.Open(); 

     using (var rdr = cmd.ExecuteReader()) 
     { 
      if (rdr.HasRows) 
      { 
       rdr.Read(); 
       Product.Naam = rdr.GetString(1); 
       conn.Close(); 
      } 
     } 
    } 
} 

Ошибка:

An unhandled exception of type 'System.IndexOutOfRangeException' occurred in System.Data.dll

Additional information: De index ligt buiten de matrixgrenzen.

Дополнительная информация на голландском языке. В переводе на английский язык:

The index is located outside of the array bounds.

+1

Вы не заполнения любых выпадающий. – McNets

+1

У вас есть только один столбец в вашем запросе. Этот столбец можно получить с помощью индекса 0, а не индекса 1. В NET-массивах индексы начинаются с нуля – Steve

+0

, потому что я уже выбрал только 1 столбец с запросом, у меня есть только 1 столбец? Думал, что мне нужен индекс всей таблицы. – Gigitex

ответ

1

1 - Вы из диапазона из-за вы используете rdr.GetString(1) вместо rdr.GetString(0)

2 - Существует не ComboBox в вашем коде.

using (var rdr = cmd.ExecuteReader()) 
{ 
    while (reader.Read()) 
    { 
     Product.Naam = rdr.GetString(0); 
     YourComboBox.Items.Add(Product.Naam); 
    } 
} 

Посмотрите на документацию SqlCommand.ExecuteReader.

+0

Существует combobox, он называется cb_product. Но этот человек в моей форме. Метод выполнения находится в другом классе. Я не могу использовать «System.Windows.Forms» в своем классе. Благодаря школе. Я исправил проблему с индексом, просто глупая ошибка. Но когда я запускаю этот код, я получаю только первый «Продукт» в своей таблице. Второй не отображается – Gigitex

+0

В вашем запросе нет предложения WHERE. 'Выберите Naam из продукта Where ProductId = SelectedProduct' – McNets

+0

Тогда вы получите выбранный продукт. В combobox должны быть указаны все имена продуктов в базе данных. Поэтому он должен запускать Select Name from Product. Если он получает X-colums, он должен добавить все X-имена в combobox. Объяснение – Gigitex

2

Первой проблемой в вашем коде является попытка получить значение в индексе 1 вашего SqlDataReader. Ваш запрос содержит только один столбец и в NET массивы начинаются с нулевого индекса, так что вам нужно получить значение Наама с помощью этой линии

Product.Naam = rdr.GetString(0); 

Однако, если у вас есть более одной записи, чтобы извлечь значение Наама, то вам нужно к циклу с использованием SqlDataReader, пока он не вернет false из метода Read и сохранит значения Naam в какой-либо структуре коллекции.
я предлагаю использовать List<string>

public List<string> AlleProducten(string commandText) 
{ 
    List<string> names = new List<string>(); 
    using (SqlConnection conn = new SqlConnection(connectionString)) 
    using (SqlCommand cmd = new SqlCommand(commandText, conn)) 
    { 
     conn.Open(); 
     using (var rdr = cmd.ExecuteReader()) 
     { 
      while(rdr.Read()) 
       names.Add(rdr.GetString(0)); 
     } 
     conn.Close(); 
    } 
    return names; 

}

Код выше петель над возвращенными результатами SqlDataReader и добавить все На в список строк, и, наконец, возвращаю список к абоненту.
Таким образом, вы можете присвоить возвращаемое значение метода AlleProducten к DataSource из выпадающего списка

List<string>result = db.AlleProducten("Select Naam from Product;"); 
cb_product.DataSource = result; 
+0

Отлично! Я тоже думал использовать Список. Перед редактированием у вас были имена .Add (rdr.GetString (1)); и вы изменили его на 0. Та же ошибка, что и у меня? : P или имеет конкретную причину? – Gigitex

+0

Нет, это была простая ошибка копирования/вставки – Steve

+0

Почему вы используете цикл while вместо a для каждого цикла? Он делает то же самое, не так ли? По крайней мере, школа научила меня этому. – Gigitex

Смежные вопросы