我有一个项目,它需要在Combobox上选择数据库列表并在Datagridview中显示它。这是我的代码:
private void Form2_Load(object sender, EventArgs e)
{
OleDbConnection con = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;" + @"data source= D:\Database\đồ án\Đồ án.mdb");
DataTable dt = new DataTable();
DataSet ds = new DataSet();
ds.Tables.Add(dt);
OleDbDataAdapter da = new OleDbDataAdapter("Select * from Sheet1", con);
da.Fill(dt);
da.Dispose();
comboBox1.DataSource = dt;
comboBox1.DisplayMember = "Tên đề tài";
comboBox1.ValueMember = "Mã đề tài";
}
private void comboBox1_SelectionChangeCommitted(object sender, EventArgs e)
{
OleDbConnection con = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;" + @"data source= D:\Database\đồ án\Đồ án.mdb");
DataTable dt = new DataTable();
DataSet ds = new DataSet();
ds.Tables.Add(dt);
OleDbDataAdapter da = new OleDbDataAdapter("Select * from Sheet11 Where Mã đề tài = "+comboBox1.SelectedValue, con);
da.Fill(dt);
da.Dispose();
dataGridView1.DataSource = dt;
}
当我运行此程序并单击Combobox时,它显示错误:
https://i.stack.imgur.com/C7DdZ.png
起初,我认为数据库中的2张(表格)没有显示并且没有关系,但是当我完成它并尝试重新开始时,它再次显示错误。我该如何解决?
答案 0 :(得分:2)
2个重要说明:
考虑到上述情况,请尝试:
string query="Select * from Sheet11 Where [Mã đề tài] = @param";
OleDbCommand command = new OleDbCommand(query, con);
cmd.Parameters.Add(new OleDbParameter("@param", comboBox1.SelectedValue))
答案 1 :(得分:1)
除了列名称中的'空格' 错误之外,当您设置{{1}时,绑定的顺序也会出错}}
您需要首先设置成员,只需然后 数据源。所以改变
ComboBox
为:
comboBox1.DataSource = dt;
comboBox1.DisplayMember = "Tên đề tài";
comboBox1.ValueMember = "Mã đề tài";
现在不是整个表都绑定了,而只是你想要的列。
之前,comboBox1.DisplayMember = "Tên đề tài";
comboBox1.ValueMember = "Mã đề tài";
comboBox1.DataSource = dt;
不是单个值,而是整个SelectedValue
,您必须从中选择正确的项目/列。
并且,由于它是一个引用对象,将其强制转换为字符串(隐式使用DataRowView
运算符或明确地使用+
调用)只会导致类名 ToString
而不是数据值。
补充说明:
避免使用任何类型的名称;一些moderen系统可能会使用它们,但它会使代码不那么健壮。非ascii字符也是如此。
虽然此处查询中的值仅来自数据库,但建议仅使用参数化查询以避免任何 sql注入。
由于您已经将数据加载到System.Data.DataRowView
,您也可以过滤它们,而无需再次返回数据库。为此,请创建DataTable
或BindingSource
DataView
并将DGV绑定到该RowFilter
。为此,请将DataTable
设为类变量。