更新异常非查询



我正在尝试更新MS Access表,但它不断抛出错误:

System.Data 中发生了类型为"System.Data.OleDb.OleDbException"的未处理异常.dll

其他信息:查询表达式"EmID = '234'中的字符串中的语法错误。

EmID位于数据库中。请帮忙

public partial class Sales : Form
{
    ...
    private void btnUpdate_Click(object sender, EventArgs e)
    {
        int EmpID = int.Parse(txtEmpID.Text);
        OleDbConnection con = new     OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\SalesData.mdb");
        OleDbCommand update = new OleDbCommand("UPDATE Sales SET Printer = '" + txtPrinter.Text + "', Ink = '" +txtInk.Text + "', Paper = '"+txtPaper.Text+"' WHERE EmID = '" + txtEmpID.Text + " ", con);
        con.Open();
        update.ExecuteNonQuery();
        con.Close();
        MessageBox.Show("Sales Updated");
    }
    ...
}

您忘记在 WHERE 值后添加结束引号。但是修复添加缺少的引号的问题只能隐藏其他问题。

如果其中一个文本框包含单引号怎么办?您将再次收到由字符串串联引起的语法错误异常,其中引号用作值的分隔符。使用用户键入的单引号,您将再次混淆 Sql 解析器。

要解决此问题(以及称为SQL注入的更严重的问题),您需要开始使用参数

string cmdText = @"UPDATE Sales SET Printer = @printer,
                   Ink = @Ink, Paper = @Paper 
                   WHERE EmID = @id";
using(OleDbConnection con = new OleDbConnection(...))
using(OleDbCommand cmd = new OleDbCommand(cmdText, con))
{
    con.Open();
    cmd.Parameters.Add("@printer", OleDbType.VarWChar).Value = txtPrinter.Text;
    cmd.Parameters.Add("@ink", OleDbType.VarWChar).Value = txtInk.Text;
    cmd.Parameters.Add("@paper", OleDbType.VarWChar).Value = txtPaper.Text;
    cmd.Parameters.Add("@id", OleDbType.VarWChar).Value = txtEmpID.Text;
    cmd.ExecuteNonQuery();
}

相关内容

  • 没有找到相关文章

最新更新