C# 条件表达式中的数据类型不匹配错误(ms Access)

C# 条件表达式中的数据类型不匹配错误(ms Access),c#,ms-access-2003,C#,Ms Access 2003,请找出我代码中的错误。它显示 条件表达式中的数据类型不匹配错误 一定是这样 OleDbCommand cmd = new OleDbCommand( "DELETE tbbill.*, tbgrid.* FROM tbbill INNER JOIN tbgrid ON tbbill.invoice = tbgrid.ginovice

请找出我代码中的错误。它显示

条件表达式中的数据类型不匹配错误

一定是这样

OleDbCommand cmd = new OleDbCommand(
                "DELETE tbbill.*, tbgrid.* 
                 FROM tbbill 
                 INNER JOIN tbgrid 
                    ON tbbill.invoice = tbgrid.ginovice 
                 WHERE tbbill.invoice = " + Convert.ToInt32(txtinvoice.Text) , con);
我已从发票中删除
'

然而,您应该始终使用参数化SQL来防止SQL注入

OleDbCommand cmd = new OleDbCommand(
                "DELETE tbbill.*, tbgrid.* 
                 FROM tbbill 
                 INNER JOIN tbgrid 
                    ON tbbill.invoice = tbgrid.ginovice 
                 WHERE tbbill.invoice = @invoice", con);

cmd.Parameters.Add("@invoice", Convert.ToInt32(txtinvoice.Text) );  
cmd.ExecuteNonQuery();

单引号用于字符,如果您的
发票
为数字类型,则需要删除这些引号,如

tbbill.invoice = " + Convert.ToInt32(txtinvoice.Text) + ...
但不要用这种方式。 始终使用。这种类型的字符串连接对攻击是开放的

并使用自动处理命令和连接,而不是手动调用
dispose
方法

using(OleDbConnection con = new OleDbConnection(conString))
using(OleDbCommand cmd = con.CreateCommand())
{
    cmd.CommandText = "DELETE tbbill.*, tbgrid.* FROM tbbill INNER JOIN tbgrid ON tbbill.invoice = tbgrid.ginovice WHERE tbbill.invoice = @invoice";
    cmd.Parameters.Add("@invoice", OleDbType.Integer).Value = Convert.ToInt32(txtinvoice.Text);
    // I used OleDbType.Integer in my example. You should use proper OleDbType for your column.
    con.Open();
    cmd.ExecuteNonQuery();
}

您的
发票是字符还是数字?你应该经常使用。这种字符串串接容易受到攻击。它是数值型的
using(OleDbConnection con = new OleDbConnection(conString))
using(OleDbCommand cmd = con.CreateCommand())
{
    cmd.CommandText = "DELETE tbbill.*, tbgrid.* FROM tbbill INNER JOIN tbgrid ON tbbill.invoice = tbgrid.ginovice WHERE tbbill.invoice = @invoice";
    cmd.Parameters.Add("@invoice", OleDbType.Integer).Value = Convert.ToInt32(txtinvoice.Text);
    // I used OleDbType.Integer in my example. You should use proper OleDbType for your column.
    con.Open();
    cmd.ExecuteNonQuery();
}