C# C和Access数据库通过名称进行搜索
通过InqID进行搜索工作正常,但当我给出使用InqName进行搜索的代码时,它会给我一个错误,所有连接都正确给出,我想谢谢。。 错误详细信息 System.Data.dll中发生类型为“System.Data.OleDb.OLEDBEException”的未处理异常 附加信息:没有为一个或多个必需参数提供值C# C和Access数据库通过名称进行搜索,c#,database,ms-access,C#,Database,Ms Access,通过InqID进行搜索工作正常,但当我给出使用InqName进行搜索的代码时,它会给我一个错误,所有连接都正确给出,我想谢谢。。 错误详细信息 System.Data.dll中发生类型为“System.Data.OleDb.OLEDBEException”的未处理异常 附加信息:没有为一个或多个必需参数提供值 private void btnSearch_Click(object sender, EventArgs e) { DA.SelectCommand = new OleDbCom
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();
}
查询中缺少包含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);
还可以动态构建查询字符串,就像这样。考虑使用命令代替:
如果未指定搜索字符串参数,应按如下方式添加引号:
DA.SelectCommand = new OleDbCommand("SELECT * FROM INQUIREt WHERE InqName='" + txtInqName.Text + "'", CON);
DA.SelectCommand = new OleDbCommand("SELECT * FROM INQUIREt WHERE InqName=?", CON);
DA.SelectCommand.Parameters.AddWithValue("?", txtInqName.Text);
但是,将查询字符串构造为字符串并不是一种有效且可读的方法,最佳做法是使用以下方法:
DA.SelectCommand = new OleDbCommand("SELECT * FROM INQUIREt WHERE InqName='" + txtInqName.Text + "'", CON);
DA.SelectCommand = new OleDbCommand("SELECT * FROM INQUIREt WHERE InqName=?", CON);
DA.SelectCommand.Parameters.AddWithValue("?", txtInqName.Text);
您需要将Name的值括在引号中,但最好使用参数化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();
大多数答案告诉您应该使用参数,这很好。 他们还告诉你,如果你在它周围加上单引号,这是正确的,这是不正确的。添加单引号并不是一个解决方案,它只适用于某些值——很多但不是全部——并且极易受到SQL注入攻击 只有一种方法可以做到正确,那就是使用参数。使用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,但这是可以接受的,并且可以正常工作。SELECT*FROM InqName='+txtInqName.Text+',CON@jose字体你为什么不关心我?