C# 在C Access中初始化组合框

C# 在C Access中初始化组合框,c#,visual-studio,ms-access,combobox,C#,Visual Studio,Ms Access,Combobox,我试图添加一个组合框,可以得到所有的产品名称,但不幸的是,我遵循一些教程,并最终像这样 void fillCombo() { try { con.Open(); OleDbCommand command = new OleDbCommand("Select * from IblInventory"); command.Connection = con; OleD

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

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);
        }
    }
原因可能是什么?

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

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

while (reader.Read())
{
    int pos = reader.GetOrdinal("ProductName");
    String product = reader.GetString(pos); 
    cmbProduct.Items.Add(product);
}
另一个与您的情况几乎相同的示例,可以在MSDN上关于的文档页面中找到

编写一个允许您编写代码以隐藏名称和位置之间映射的细节的代码也是一种常见做法。您只需要一个带有

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");
从的文档中,您会注意到该方法所需的参数是一个整数,表示返回记录中列的位置,而不是其名称

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

while (reader.Read())
{
    int pos = reader.GetOrdinal("ProductName");
    String product = reader.GetString(pos); 
    cmbProduct.Items.Add(product);
}
另一个与您的情况几乎相同的示例,可以在MSDN上关于的文档页面中找到

编写一个允许您编写代码以隐藏名称和位置之间映射的细节的代码也是一种常见做法。您只需要一个带有

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,请参见下面的代码

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


它在我的项目中起作用 首先将数据填入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);
}
现在


指定错误,单词error没有任何意义。我有四列,先生。在reader.GetString上找不到正确的语法我无法运行程序,因为我试图添加一个组合框。。。但是就这样结束了。原因可能是什么?这个问题太模糊了。请详细描述你的问题是什么。你的期望是什么?什么不起作用?如果您有一些错误消息->它们是什么?指定错误,单词Error没有任何意义。我有四列,先生。在reader.GetString上找不到正确的语法我无法运行程序,因为我试图添加一个组合框。。。但是就这样结束了。原因可能是什么?这个问题太模糊了。请详细描述你的问题是什么。你的期望是什么?什么不起作用?如果您有一些错误消息->它们是什么?