【发布时间】:2013-04-11 12:43:05
【问题描述】:
使用 FireDac,如何在 ms sql 服务器上获取最后插入的 id? 谢谢
【问题讨论】:
标签: sql sql-server delphi anydac firedac
使用 FireDac,如何在 ms sql 服务器上获取最后插入的 id? 谢谢
【问题讨论】:
标签: sql sql-server delphi anydac firedac
将该 id 设置为标识列,然后通过 Using
获取它SELECT SCOPE_IDENTITY()
插入语句之后
请参考以下链接
【讨论】:
使用自增字段类型
http://www.da-soft.com/anydac/docu/Auto-Incremental_Fields.html
这将提供像
这样的代码DataSet.Insert;
....
DataSet.Post;
id := DataSet.FieldByName('ID').AsInteger;
另一种方法可能是制作适当的 SQL 语句,如
中所述AnyDAC 作者还建议通过http://docs.embarcadero.com/products/rad_studio/firedac/uADCompClient_TADCustomConnection_GetLastAutoGenValue@String.html 获取特定于 DBMS 的工具的特殊方法
但是所有带有SELECT @@identity 或SELECT SCOPE_IDENTITY 的事后请求都是脆弱和危险的。当您将数据插入表 A 时,其触发器可能会将数据插入相关的表 B 和 C 中,并且标识会调用 C 的 autoinc,而不是您开始插入的表。
【讨论】:
INSERT 查询不返回数据集,你如何获得最后一个 IDENTITY 值?我的意思是,数据集类是否包含用于获取最后一个 IDENTITY 值的属性(如果您使用自动增量字段)?换句话说,如何从数据集后代组件中获取该值?
DataSet.Insert; .... DataSet.Post; id := DataSet.FieldByName('ID').AsInteger;
SELECT 查询来请求它。这完全是你无法控制的。如果您想同时INSERT 一条记录和SELECT 一些数据怎么办?您需要从结果集的第二个数据集中获取该记录集吗?真烦人……