|
|
导航: |
论坛 -> DELPHI技术
斑竹:liumazi,sephil |
|
作者: |
|
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;
此帖子包含附件:
大小:415.7K |
----------------------------------------------
Delphi4Linux Delphi三层/FireDAC 技术群:734515869 http://www.cnblogs.com/rtcmw |
作者: |
|
2020/9/11 8:36:51 |
1楼: |
学习了,谢谢!
----------------------------------------------
-
|
作者: |
abencat (远离delphi的人) |
★☆☆☆☆ |
-
|
盒子活跃会员 |
|
2020/9/11 8:43:19 |
2楼: |
如果是并发同时插入多条记录是否还能读取到各自插入值得那个ID呢
----------------------------------------------
delphi爱好者
|
作者: |
|
2020/9/11 8:55:39 |
3楼: |
GetLastAutoGenValue
----------------------------------------------
-
|
作者: |
|
2020/9/11 8:58:29 |
3楼: |
像MS SQL Server、MySQL、Oracle等大型数据库,并发也是可以获取的。
----------------------------------------------
Delphi4Linux Delphi三层/FireDAC 技术群:734515869 http://www.cnblogs.com/rtcmw
|
作者: |
|
2020/9/11 8:59:47 |
4楼: |
MS SQL Server, MySQL etc The last autogenerated value in the session. 是支持并发
----------------------------------------------
-
|
作者: |
|
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 传到中间件时,把字段设置为自增,会自动处理的.连
----------------------------------------------
-
|
作者: |
|
2020/9/11 21:43:44 |
8楼: |
如果是 FireBird 的话,它的自增是有生成器创建的。我的做法是从生成器取数字然后由自己的程序填入,这样并发也不怕。
----------------------------------------------
-
|
作者: |
|
2020/9/11 21:59:01 |
9楼: |
sqlserver 的insert语句有个 output子句 可以返回 包括id的任意字段
----------------------------------------------
z@S7
|
作者: |
|
2020/9/11 23:35:18 |
10楼: |
如果使用 FireBird,我的办法:
https://blog.csdn.net/pcplayer/article/details/108487231
----------------------------------------------
-
|
作者: |
|
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
|
作者: |
|
2020/9/15 15:50:51 |
12楼: |
这么实用的帖子必须留名关注
----------------------------------------------
-
|
作者: |
|
2020/9/28 13:57:50 |
13楼: |
这么实用的帖子必须留名关注
----------------------------------------------
-
|
|