DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: sprblck
今日帖子: 10
在线用户: 15
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 earthsbest (全能中间件) ▲▲▲▲△ -
普通会员
2020/9/11 8:25:22
标题:
FireDAC 获取 INSERT 记录的自增 ID 浏览:1848
加入我的收藏
楼主:     将数据插入具有自动增量字段的数据库表中时的常见模式是使用 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。

以SQLite数据库为例:

procedure TForm1.FormCreate(Sender: TObject);
begin
  FDConnection1.Params.Clear;
  // 设置数据库驱动类型为 SQLite
  FDConnection1.Params.Add('DriverID=SQLite');
  // 为了测试方便,设置为内存数据库
  FDConnection1.Params.Add('Database=:memory:');
  FDConnection1.Connected := True;

  // 创建一个名为 TBL1 的数据表
  FDConnection1.ExecSQL('CREATE TABLE TBL1(ID INTEGER PRIMARY KEY AUTOINCREMENT, F1 VARCHAR(15), F2 VARCHAR(20))');

  Memo1.Clear;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  // 使用 FDQuery 插入一条数据
  FDQuery1.SQL.Text := 'INSERT INTO TBL1(F1, F2) VALUES (:F1, :F2)';
  FDQuery1.ParamByName('F1').AsString := 'Delphi';
  FDQuery1.ParamByName('F2').AsString := 'Object Pascal';
  FDQuery1.ExecSQL;

  // 方法一、 通过 GetLastAutoGenValue 获取自增字段值
  Memo1.Lines.Add(FDConnection1.GetLastAutoGenValue('TBL1'));

  // 方法二、通过查询 last_insert_rowid 函数获取
  FDQuery1.Open('SELECT last_insert_rowid()');
  Memo1.Lines.Add(FDQuery1.Fields[0].Value);

  // 打开表
  FDQuery1.Open('SELECT * FROM TBL1');
end;
此帖子包含附件:
PNG 图像
大小:415.7K
----------------------------------------------
Delphi4Linux Delphi三层/FireDAC 技术群:734515869 http://www.cnblogs.com/rtcmw
作者:
男 hz_2009 (盒子) ★☆☆☆☆ -
普通会员
2020/9/11 8:36:51
1楼: 学习了,谢谢!
----------------------------------------------
-
作者:
男 abencat (远离delphi的人) ★☆☆☆☆ -
盒子活跃会员
2020/9/11 8:43:19
2楼: 如果是并发同时插入多条记录是否还能读取到各自插入值得那个ID呢
----------------------------------------------
delphi爱好者
作者:
男 ksrsoft (cb168) ★☆☆☆☆ -
普通会员
2020/9/11 8:55:39
3楼: GetLastAutoGenValue
----------------------------------------------
-
作者:
男 earthsbest (全能中间件) ▲▲▲▲△ -
普通会员
2020/9/11 8:58:29
3楼: 像MS SQL Server、MySQL、Oracle等大型数据库,并发也是可以获取的。
----------------------------------------------
Delphi4Linux Delphi三层/FireDAC 技术群:734515869 http://www.cnblogs.com/rtcmw
作者:
男 ksrsoft (cb168) ★☆☆☆☆ -
普通会员
2020/9/11 8:59:47
4楼: MS SQL Server, MySQL etc  
 The last autogenerated value in the session.  
 是支持并发
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2020/9/11 11:13:24
5楼: 学习了,谢谢!
----------------------------------------------
(C)(P)Flying Wang
作者:
男 janker (janker) ★☆☆☆☆ -
盒子活跃会员
2020/9/11 13:27:23
6楼: 学习了,谢谢!
----------------------------------------------
-
作者:
男 jfhyn (贺兰之边) ★☆☆☆☆ -
普通会员
2020/9/11 15:39:26
7楼: Oracle,Pg 传到中间件时,把字段设置为自增,会自动处理的.连
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2020/9/11 21:43:44
8楼: 如果是 FireBird 的话,它的自增是有生成器创建的。我的做法是从生成器取数字然后由自己的程序填入,这样并发也不怕。
----------------------------------------------
-
作者:
男 zhyhero (zhyhero) ★☆☆☆☆ -
盒子活跃会员
2020/9/11 21:59:01
9楼: sqlserver 的insert语句有个 output子句 可以返回 包括id的任意字段
----------------------------------------------
z@S7
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2020/9/11 23:35:18
10楼: 如果使用 FireBird,我的办法:

https://blog.csdn.net/pcplayer/article/details/108487231
----------------------------------------------
-
作者:
男 earthsbest (全能中间件) ▲▲▲▲△ -
普通会员
2020/9/12 9:15:21
11楼: 如果不使用SQL插入,而是用 DataSet.Append/Insert 的方式,直接可以获取:

  FDQuery1.Open('SELECT * FROM TBL1');
  FDQuery1.Append;
  FDQuery1.FieldByName('F1').AsString := 'Delphi';
  FDQuery1.FieldByName('F2').AsString := 'Object Pascal';
  FDQuery1.Post;

  Memo1.Lines.Add(FDQuery1.FieldByName('ID').AsString);
----------------------------------------------
Delphi4Linux Delphi三层/FireDAC 技术群:734515869 http://www.cnblogs.com/rtcmw
作者:
男 bbnn38 (伟大的咸鱼) ★☆☆☆☆ -
普通会员
2020/9/15 15:50:51
12楼: 这么实用的帖子必须留名关注
----------------------------------------------
-
作者:
男 andyliuxp (andyliuxp) ★☆☆☆☆ -
普通会员
2020/9/28 13:57:50
13楼: 这么实用的帖子必须留名关注
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行97.65625毫秒 RSS