使用Delphi中的StrUtils删除SQL UPDATE语句中的最后一个逗号

Anï*_*éli -1 sql delphi string sql-update

假设我们有这个SQL语句:

UPDATE article SET saison='12E', mode='ECH', client='SAS', WHERE ID='3448fe81-1bec-e011-8546-001f3ccf8f20'
Run Code Online (Sandbox Code Playgroud)

此SQL语句由连接的字符串生成,如下所示:

// saison change
procedure TarticleEditForm.saisonComboChange(Sender: TObject);
begin
    SQLQuery := SQLQuery + 'saison=''' + saisonCombo.Text + ''',';
end;

// client change
procedure TarticleEditForm.clientComboChange(Sender: TObject);
begin
    SQLQuery := SQLQuery + 'client=''' + clientCombo.Text + ''',';
end;
.
.
.
Run Code Online (Sandbox Code Playgroud)

如您所见,在"WHERE"子句之前有一个逗号.如何删除最后一个逗号以获得​​正确的语句:

UPDATE article SET saison='12E', mode='ECH', client='SAS' WHERE ID='3448fe81-1bec-e011-8546-001f3ccf8f20'
Run Code Online (Sandbox Code Playgroud)

RMQ:逗号的数量不固定,可以是1,2,5 ......

谢谢.

解决方案是将",WHERE"替换为"WHERE"

 SQLQuery := StringReplace(SQLQuery , ', WHERE', 'WHERE', [rfReplaceAll]);
Run Code Online (Sandbox Code Playgroud)

我用这个跟踪HISTORY表中的每个变化.谢谢你们.

Ton*_*ony 7

不是在发生更改时将更改连接到SQL字符串,而是将它们存储在集合中,并在评估完所有选项后构建SQL字符串.

然后您将知道将要更改的字段数并正确构建语句.当然,这将要求您不仅要存储值,还要存储要更改的fild的名称:

[伪代码]

for i=0 to fields_changed.count {
  sql = sql + fields_changed(i).field_name + " = " + fields_changed(i).new_value
  if i < fields_changed.count {
    sql = sql + ", "
  }
}
sql = sql + " WHERE ..."
Run Code Online (Sandbox Code Playgroud)

编辑:你有另一种选择是简单地执行字符串替换, WHEREWHERE刚刚执行语句之前; 因为'where'这个词是一个保留字,在SQL语句中不应出现多次.这可能是更简单的解决方案,即使它感觉有点像黑客.