zoukankan      html  css  js  c++  java
  • FireDAC 获取 INSERT 记录的自增 ID

        将数据插入具有自动增量字段的数据库表中时的常见模式是使用 SQL 查询来选择新创建的记录的最后插入ID。使用 TFDQuery 运行 INSERT 查询后,您可以运行第二个查询来获取新插入的自动增量 ID。例如,MySQL 具有一个 SELECT 查询函数,您可以运行该函数,称为 LAST_INSERT_ID(),比如:SELECT LAST_INSERT_ID() ,但是,这种方法耦合度太高,不同的数据库,使用的函数也不一样。

        FireDAC 提供了一个函数,您可以通过 TFDConnection 组件调用该函数,称为GetLastAutoGenValue。它将返回最后插入的 ID,支持许多不同的数据库,包括 Oracle、InterBase/Firebird、MySQL、MSSQL 和其他一些数据库。它使用每个不同数据库的任何唯一 SQL 查询来返回上次插入的 ID。以下是来自 DocWiki

    DBMS 

    Description 

    Oracle 

    AName is the name of a sequence. The method returns CurrValue if it exists in the session. 

    InterBase / Firebird 

    AName is the name of a generator. The method returns GEN_ID(0). 

    MS SQL Server, MySQL etc 

    The last autogenerated value in the session. 

    以SQLite数据库为例:

     1 procedure TForm1.FormCreate(Sender: TObject);
     2 begin
     3   FDConnection1.Params.Clear;
     4   // 设置数据库驱动类型为 SQLite
     5   FDConnection1.Params.Add('DriverID=SQLite');
     6   // 为了测试方便,设置为内存数据库
     7   FDConnection1.Params.Add('Database=:memory:');
     8   FDConnection1.Connected := True;
     9 
    10   // 创建一个名为 TBL1 的数据表
    11   FDConnection1.ExecSQL('CREATE TABLE TBL1(ID INTEGER PRIMARY KEY AUTOINCREMENT, F1 VARCHAR(15), F2 VARCHAR(20))');
    12 
    13   Memo1.Clear;
    14 end;
    15 
    16 procedure TForm1.Button1Click(Sender: TObject);
    17 begin
    18   // 使用 FDQuery 插入一条数据
    19   FDQuery1.SQL.Text := 'INSERT INTO TBL1(F1, F2) VALUES (:F1, :F2)';
    20   FDQuery1.ParamByName('F1').AsString := 'Delphi';
    21   FDQuery1.ParamByName('F2').AsString := 'Object Pascal';
    22   FDQuery1.ExecSQL;
    23 
    24   // 方法一、 通过 GetLastAutoGenValue 获取自增字段值
    25   Memo1.Lines.Add(FDConnection1.GetLastAutoGenValue('TBL1'));
    26 
    27   // 方法二、通过查询 last_insert_rowid 函数获取
    28   FDQuery1.Open('SELECT last_insert_rowid()');
    29   Memo1.Lines.Add(FDQuery1.Fields[0].Value);
    30 
    31   // 打开表
    32   FDQuery1.Open('SELECT * FROM TBL1');
    33 end;

    运行截图如下:

    奥利给!

  • 相关阅读:
    Jemter---基础概念
    Jmeter---线程操作
    性能接口面试题
    Linux---网络命令
    测试所用链接地址
    Linux---压缩解压命令
    Linux----用户管理命令
    性能面试题
    Linux---帮助命令
    Linux--文件搜索命令
  • 原文地址:https://www.cnblogs.com/rtcmw/p/13645308.html
Copyright © 2011-2022 走看看