通过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();
}
答案 0 :(得分:2)
大多数答案告诉您应该使用参数,这很好。 他们还告诉你,如果你在它周围加上单引号,这是正确的,不正确。添加单引号不是一个解决方案,只适用于某些值(很多但不是全部),并且对SQL注入攻击持开放态度。
只有一种方法可以正确使用参数。对于OleDb,参数不是命名而是位置。但是,通过访问,您可以使用命名参数为@。
添加前缀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,但这是可以接受的并且有效。
答案 1 :(得分:0)
您的查询中缺少包含txtInqID.Text
和InqName.Text
值的引号:
DA.SelectCommand = new OleDbCommand("SELECT * FROM INQUIREt WHERE InqID = '" + txtInqID.Text + "'", CON);
DA.SelectCommand = new OleDbCommand("SELECT * FROM INQUIREt WHERE InqName = '" + txtInqName.Text + "'", CON);
同样动态构建您的查询字符串,如very bad practice。请考虑使用命令parameters:
DA.SelectCommand = new OleDbCommand("SELECT * FROM INQUIREt WHERE InqID = ?", CON);
DA.SelectCommand.Parameters.Add("InqID").Value = txtInqID.Text;
DA.SelectCommand = new OleDbCommand("SELECT * FROM INQUIREt WHERE InqName = ?" , CON);
DA.SelectCommand.Parameters.Add("InqName").Value = txtInqName.Text;
答案 2 :(得分:0)
您没有指定搜索字符串参数,您应该按如下方式添加引号:
DA.SelectCommand = new OleDbCommand("SELECT * FROM INQUIREt WHERE InqName='" + txtInqName.Text + "'", CON);
但是,将查询字符串构造为string
并不是一种有效且可读的方法,最好的做法是使用OleDbParameters,如下所示:
DA.SelectCommand = new OleDbCommand("SELECT * FROM INQUIREt WHERE InqName=?", CON);
DA.SelectCommand.Parameters.AddWithValue("?", txtInqName.Text);
答案 3 :(得分:0)
您需要在引号中包含Name的值,但最好使用Parameterized Sql。
DA.SelectCommand = new OleDbCommand("SELECT * FROM INQUIREt WHERE InqName=@Name " , CON);
DS.Clear();
DA.SelectCommand.Parameters.AddWithValue("@Name",txtInqName.Text);
DA.Fill(DS);
dataGridView.DataSource = DS.Tables[0];
此外,您不需要使用以下代码,因为已使用DataAdapter
选择了数据CON.Open();
DA.SelectCommand.ExecuteNonQuery();
CON.Close();