2016-08-16 58 views
0

我试图添加一个组合框,它可以获得所有的产品名称,但不幸的是我遵循一些教程并最终像这样。在C#中初始化组合框

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

它工作在我的项目 首先填写您的数据的数据表看看下面的代码

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";