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表中的每个变化.谢谢你们.
不是在发生更改时将更改连接到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)
编辑:你有另一种选择是简单地执行字符串替换, WHERE与WHERE刚刚执行语句之前; 因为'where'这个词是一个保留字,在SQL语句中不应出现多次.这可能是更简单的解决方案,即使它感觉有点像黑客.