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