Delphi 10 配合 Firemonkey 和 SQLite:在运行下面的代码之后,我想获取插入到 SQLite 表中的最后一条记录的 ID。我该如何获得最后一个 ID?
注意:Table 1 的 ID 字段是自增的。
var myQr: TFDQuery;
begin
myQr := TFDQuery.Create(Self);
with myQr do begin
SQL.Add('Insert into table1 values (:_id, :_name, :_dthr)');
Params.ParamByName('_id').ParamType := TParamType.ptInput;
Params.ParamByName('_id').DataType := TFieldType.ftInteger;
Params.ParamByName('_id').Value := null;
ParamByName('_name').AsString := 'name test';
ParamByName('_dthr').AsDateTime := Now;
ExecSQL;
end;
// How to get last ID? <<<<<<<<<<<<<=================
myQr.DisposeOf;
select top 1 _id from table1 order by 1 desc
,但我建议使用 select 语句,打开查询,使用 append,然后在发布后简单地读取 ID。特别是因为从插入此时到运行第二个查询的时间,很有可能另一个客户端已经在这段时间内插入了其他内容,所以必须添加事务模式。长话短说,不要执行“Insert”语句。相反,打开“Select”语句,使用“Append”和“Post”。 - Jerry Dodgeappend
但无法使用参数使其正常工作。我知道使用参数可以使系统更安全,例如防止SQL注入攻击。使用append
是否可以继续使用我在SQL语句中指定的parameters
?如何实现? - Zayn BarcktuAppend
并将值传递到每个字段内部会使用参数,或者至少,从本质上讲应该可以防止SQL注入。换句话说,在使用Append
方法时不需要使用参数。 - Jerry DodgeQ.SQL.Text := 'select * from ThisTable'; Q.Open; Q.Append; Q.FieldByName('MyField').AsString := 'Some Value'; Q.Post; NewID := Q.FieldByName('ID').AsInteger;
这样,至少我在ADO中是这样做的,但FireDac应该几乎没有什么不同。 - Jerry Dodge