C# C和Access数据库通过名称进行搜索

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

通过InqID进行搜索工作正常,但当我给出使用InqName进行搜索的代码时,它会给我一个错误,所有连接都正确给出,我想谢谢。。 错误详细信息 System.Data.dll中发生类型为“System.Data.OleDb.OLEDBEException”的未处理异常

附加信息:没有为一个或多个必需参数提供值

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字体你为什么不关心我?