通过 InqID 搜索工作正常,但是当我提供代码以使用 InqName 进行搜索时,它给我一个错误(我猜所有连接都正确给出)谢谢.. 错误详情 System.Data.dll 中出现“System.Data.OleDb.OleDbException”类型的未处理异常
附加信息:没有为一个或多个必需参数给出值。
private void btnSearch_Click(object sender, EventArgs e)
{
DA.SelectCommand = new OleDbCommand("SELECT * FROM INQUIREt WHERE InqID=" +txtInqID.Text, CON);
DS.Clear();
DA.Fill(DS);
dataGridView.DataSource = DS.Tables[0];
CON.Open();
DA.SelectCommand.ExecuteNonQuery();
CON.Close();
}
private void btnNameSearch_Click(object sender, EventArgs e)
{
DA.SelectCommand = new OleDbCommand("SELECT * FROM INQUIREt WHERE InqName=" + txtInqName.Text, CON);
DS.Clear();
DA.Fill(DS);
dataGridView.DataSource = DS.Tables[0];
CON.Open();
DA.SelectCommand.ExecuteNonQuery();
CON.Close();
}
最佳答案
大多数答案告诉您应该使用参数,这很好。 他们还告诉您,如果您在其周围加上单引号,那将是正确的,这是不正确。添加单引号不是解决方案,它只适用于某些值(很多但不是全部)并且对 SQL 注入(inject)攻击很开放。
只有一种方法可以做到这一点,那就是使用参数。对于 OleDb,参数不是命名的而是位置的。但是,通过 Access ,您可以通过在命名参数前加上 @ 来使用命名参数。
private void btnSearch_Click(object sender, EventArgs e)
{
DA.SelectCommand = new OleDbCommand("SELECT * FROM INQUIREt WHERE InqID=@ID", CON);
DA.SelectCommand.Parameters.Add("@ID", OleDbType.VarChar).Value = txtInqID.Text;
DS.Clear();
DA.Fill(DS);
dataGridView.DataSource = null;
dataGridView.DataSource = DS.Tables[0];
}
private void btnNameSearch_Click(object sender, EventArgs e)
{
DA.SelectCommand = new OleDbCommand("SELECT * FROM INQUIREt WHERE InqName=@name", CON);
DA.SelectCommand.Parameters.Add("@name", OleDbType.VarChar).Value = txtInqName.Text;
DS.Clear();
DA.Fill(DS);
dataGridView.DataSource = null;
dataGridView.DataSource = DS.Tables[0];
}
PS:您正在以一种奇怪的方式使用 DataSet 和 DataAdapter,但这是可以接受的并且有效。
关于C# 和 Access 数据库通过名称搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41257468/