2016-08-16 5 views
0

Я пытался добавить поле со списком, которое могло бы получить все имя продукта, но, к сожалению, я следую некоторым учебникам и заканчиваю так.Инициализация Combo Box в C# Access

void fillCombo() 
    { 
     try 
     { 
      con.Open(); 
      OleDbCommand command = new OleDbCommand("Select * from IblInventory"); 
      command.Connection = con; 
      OleDbDataReader reader = command.ExecuteReader(); 

      while (reader.Read()) 
      { 
       String product = reader.GetString("ProductName"); // << invalid argument 
       cmbProduct.Items.Add(product); 
      } 
      con.Close(); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    } 

В чем может быть причина?

+0

Указать ошибку, слово «ошибка» ничего не значит. – 3615

+0

У меня есть четыре столбца сэр. И не могу найти правильный синтаксис на '' reader.GetString() '' Я не могу запустить программу из-за этого –

+1

«Я пытался добавить поле со списком ... но ... в конечном итоге так Что может быть причиной? Этот вопрос слишком расплывчатый. Пожалуйста, подробно опишите, в чем заключается ваша проблема. Каковы были ваши ожидания? Что не работает? Если у вас есть сообщения об ошибках -> что это такое? –

ответ

3

Из документации OleDbDataReader.GetString вы заметите, что аргумент, требуемый методом, представляет собой целое число, представляющее позицию столбца в возвращенной записи, а не ее имя.

Если вы (по праву) предпочитаете использовать имя столбца, то вам нужно сделать обход и использовать метод GetOrdinal для получения позиции столбца с именем.

while (reader.Read()) 
{ 
    int pos = reader.GetOrdinal("ProductName"); 
    String product = reader.GetString(pos); 
    cmbProduct.Items.Add(product); 
} 

Другой пример, практически идентична ситуации, можно найти на странице документации на MSDN о OleDbDataReader.GetOrdinal

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

public static class ReaderExtensions 
{ 
    public string GetString(this OleDbDataReader reader, string colName) 
    { 
     string result = ""; 
     if(!string.IsNullOrEmpty(colName)) 
     { 
      int pos = reader.GetOrdinal(colName); 
      result = reader.GetString(pos); 
     } 
     return result; 
    } 
    ... other extensions for Int, Decimals, DateTime etc... 
} 

Теперь с этим классом на месте и доступны вы можете позвонить

string product = reader.GetString("ProductName"); 
0

он работает в моем проекте First заполнить ваши данные, чтобы DataTable увидеть ниже код

DataTable results = new DataTable(); 

using(OleDbConnection conn = new OleDbConnection(connString)) 
{ 
    OleDbCommand cmd = new OleDbCommand("Select * from IblInventory", conn); 

    conn.Open(); 

    OleDbDataAdapter adapter = new OleDbDataAdapter(cmd); 

    adapter.Fill(results); 
} 

Теперь

cmbProduct.DataSource = results ; 
cmbProduct.DisplayMember = "ProductName"; 
cmbProduct.ValueMember = "Id feild of IblInventory table";