查询表达式中的语法错误(缺少运算符)- Delphi

myzjeezk  于 2023-03-18  发布在  其他
关注(0)|答案(2)|浏览(133)

我收到一个语法错误(缺少运算符)在查询表达式中,如下所示.

请任何人都可以协助,代码运行良好,除了当我更新一个特定的“请求”。

qryRequests.Close;
qryRequests.SQL.Clear;
qryRequests.SQL.Add('Update tblRequest SET State = "' + cmbStates.Text + '"');
qryRequests.SQL.Add('Update tblRequest SET AssignmentGroup = "' + cmbAssignmentF.Text + '"');
qryRequests.SQL.Add('WHERE RequestNumber = "' + edtREQNum.Text + '"');
qryRequests.ExecSQL;
qryRequests.Close;
qryRequests.SQL.Clear;
qryRequests.SQL.Add('SELECT * FROM tblRequest');
qryRequests.Open;

我试过了,添加了“QuoteStr”,看看这是否能解决问题,然而,它只会产生更多。

r8xiu3jd

r8xiu3jd1#

您的SQL语法不正确。为了补充@June7提供的完美答案,您可以在SQL中使用参数。这可以防止SQL注入,也可以使代码更具可读性。

qryRequests.Close;
qryRequests.SQL.Clear;

// Enable Param check
qryRequests.ParamCheck := True;

// Build SQL Query with params
qryRequests.SQL.Add('Update tblRequest SET State = :aState, '); //<-- Notice the comma
qryRequests.SQL.Add('AssignmentGroup = :aAssignmentGroup ');
qryRequests.SQL.Add('WHERE RequestNumber = :aReqNum');

// Assign Values to Params
qryRequests.ParamByName('aState').Value := cmbStates.Text;
qryRequests.ParamByName('aAssignmentGroup').Value := cmbAssignmentF.Text;
qryRequests.ParamByName('aReqNum').Value := edtREQNum.Text;

// Execute
qryRequests.ExecSQL;

qryRequests.Close;
qryRequests.SQL.Clear;
qryRequests.SQL.Add('SELECT * FROM tblRequest');
qryRequests.Open;
czq61nw1

czq61nw12#

虽然Access查询设计器会添加分号,但以编程方式执行SQL时不需要分号。Access无法在一条语句中执行多个SQL查询。我认为您只希望为匹配RequestNumber的记录更新这两个字段。请确保在WHERE前面或上一行末尾的空格中编写代码,以便在编译时连接的部分不会一起运行。如果担心SQL注入,查看Delphi Adoquery SQL add or text

qryRequests.SQL.Add('Update tblRequest SET State = "' + cmbStates.Text + '", ');
qryRequests.SQL.Add('AssignmentGroup = "' + cmbAssignmentF.Text + '" ');
qryRequests.SQL.Add('WHERE RequestNumber = "' + edtREQNum.Text + '"');

如果字段为文本类型,请使用撇号分隔符,如果为数字,则不使用,日期/时间字段使用#分隔符。
顺便说一句,如果这两个UPDATE操作都可以执行,结果将是更新具有相同State值的每条记录,并且只有与RequestNumber匹配的记录才会更新AssignmentGroup。如果这确实是您想要的,则必须执行两个单独的UPDATE操作。

相关问题