在c# Access中初始化组合框

本文关键字:组合 初始化 Access | 更新日期: 2023-09-27 18:02:29

我试图添加一个组合框,可以得到所有的产品名称,但不幸的是,我遵循一些教程,最终像这样。

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

原因可能是什么?

在c# Access中初始化组合框

来自OleDbDataReader的文档。您会注意到,该方法所需的参数是一个整数,表示返回记录中列的位置,而不是列的名称。

如果您(正确地)喜欢使用列名,那么您需要绕道使用GetOrdinal方法来检索给定列名的列的位置。

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

另一个与您的情况几乎相同的例子,可以在MSDN上关于OleDbDataReader的文档页面中找到。GetOrdinal

编写一个扩展方法也是一种常见的做法,它允许您按照自己的方式编写代码,隐藏名称和位置之间映射的细节。你只需要一个带有

的静态类
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");

它在我的项目中工作首先,请参见下面的代码

将数据填写到数据表中
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";