条件表达式ExecuteNonQuery()中的数据类型不匹配

时间:2016-10-20 07:46:10

标签: c#-4.0

大家好,当我进行更新或删除时,我得到了这个错误我该怎么办

OleDbConnection con = new 
 OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" +
 Application.StartupPath + "\\db\\it.accdb");  

    con.Open();

    OleDbCommand cmd = new OleDbCommand();
    cmd.Connection = con;
    cmd.CommandType = CommandType.Text;
    string query = "UPDATE data SET [Target Name]= '" +textBox1.Text+ "' where ID = '" + textBox9.Text + "' ";
    cmd.CommandText = query;

    cmd.ExecuteNonQuery();               
    con.Close();

1 个答案:

答案 0 :(得分:0)

首先要始终使用参数化查询。之后检查Id的类型,它可能是一个int,所以当你添加该参数时,请确保将该值添加为int类型。

另见https://msdn.microsoft.com/en-us/library/system.data.oledb.oledbcommand.parameters(v=vs.110).aspx

  

说明

     

当CommandType设置为Text时,OLE DB .NET提供程序不支持将参数传递给SQL语句或OleDbCommand调用的存储过程的命名参数。在这种情况下,必须使用问号(?)占位符。

重构代码

using (OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + MediaTypeNames.Application.StartupPath + "\\db\\it.accdb"))
using (OleDbCommand cmd = new OleDbCommand())
{
    cmd.Connection = con;
    cmd.CommandType = CommandType.Text;
    cmd.CommandText = "UPDATE data SET [Target Name]= ? where ID = ?";

    cmd.Parameters.Add(new OleDbParameter("@target", OleDbType.VarChar)).Value = textBox1.Text;
    cmd.Parameters.Add(new OleDbParameter("@id", OleDbType.Integer)).Value = int.Parse(textBox9.Text);

    con.Open();
    cmd.ExecuteNonQuery();
}

请注意:

  • OleConnection和OleDbCommand包含在using块中,因此即使发生异常也会对它们进行处理/清理。
  • 现在使用参数而不是硬编码字符串值
  • 参数使用正确的数据类型
  • 在将id分配给参数之前将其转换为int,这很关键,因为否则可以将其视为不是(基于您的摘要的根)的字符串。