Jonald Samilo
Jonald Samilo

Reputation: 327

Initializing Combo Box in C# Access

I was trying to add a combo box which could get all the product name but unfortunately I follow some tutorials and end up like this.

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);
        }
    }

What could possibly the reason?

Upvotes: 0

Views: 172

Answers (2)

Steve
Steve

Reputation: 216293

From the documentation of OleDbDataReader.GetString you will notice that the argument required by the method is an integer representing the position of the column in the returned record not its name.

If you (rightly) prefer to use the column name then you need to take a detour and use the GetOrdinal method to retrieve the position of the column given the name.

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

Another example, practically identical to your situation, can be found in the documentation page on MSDN about OleDbDataReader.GetOrdinal

It is also a common practice to write an extension method that allows you to write code as yours hiding the details of the mapping between name and position. You just need a static class with

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...
}

Now with this class in place and accessible you can call

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

Upvotes: 3

Dharti Sojitra
Dharti Sojitra

Reputation: 217

it is working in my project First fill your data in to datatable see the below code

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);
}

Now

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

Upvotes: 0

Related Questions