更新ExceptionNonQuery

时间:2016-06-09 21:35:48

标签: c# ms-access oledbconnection

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

  

未处理的类型' System.Data.OleDb.OleDbException'发生在System.Data.dll

中      

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

onDateSet在数据库中。请帮忙

    public void onDateSet(DatePicker view, int year, int month, int day) {
        if(getActivity.isDateEdit1){
          DateEdit1.setText(""+day + "/" + (month + 1) + "/" + year);
          return;
        }
        DateEdit2.setText("" + day + "/" + (month + 1) + "/" + year);
    }

1 个答案:

答案 0 :(得分:3)

您忘记在WHERE值之后添加结束引号。但修复问题添加缺少的引用仅用于隐藏其他问题。

如果您的某个文本框包含单引号,该怎么办?您将再次获得由字符串连接引起的语法错误异常,其中引号用作值的分隔符。使用您的用户输入的单引号,您将再次混淆Sql Parser。

要解决此问题(以及一个更严重的问题,称为Sql Injection),您需要开始使用参数

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