通过名称

时间:2016-12-21 07:37:08

标签: c# database access

通过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();
}

4 个答案:

答案 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.TextInqName.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();