【问题标题】:How to get last inserted id on ms sql server with FireDac component?如何使用 FireDac 组件在 ms sql server 上获取最后插入的 id?
【发布时间】:2013-04-11 12:43:05
【问题描述】:

使用 FireDac,如何在 ms sql 服务器上获取最后插入的 id? 谢谢

【问题讨论】:

    标签: sql sql-server delphi anydac firedac


    【解决方案1】:

    将该 id 设置为标识列,然后通过 Using

    获取它
    SELECT SCOPE_IDENTITY()
    

    插入语句之后

    请参考以下链接

    http://msdn.microsoft.com/en-us/library/ms190315.aspx

    【讨论】:

    • 这仅适用于 Microsoft SQL Server,不适用于 PostgrSQL、Oracle、MySQL 等其他 SQL Server。而是在 TFDConnection 上使用GetLastAutoGenValue 方法
    【解决方案2】:

    使用自增字段类型

    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 值的属性(如果您使用自动增量字段)?换句话说,如何从数据集后代组件中获取该值?
    • @TLama DataSet.Insert; .... DataSet.Post; id := DataSet.FieldByName('ID').AsInteger;
    • 所以使用自动增量字段强制第一个记录集返回标识列,即使您不想要它?
    • @TLama 那有什么问题?无论如何,您都会从服务器返回结果数据包(成功/失败),现在该数据包将包含额外的 4 个字节。这些不是单独的 SQL 请求所需的额外往返。
    • 如果我想获得那个值,我会通过SELECT 查询来请求它。这完全是你无法控制的。如果您想同时INSERT 一条记录和SELECT 一些数据怎么办?您需要从结果集的第二个数据集中获取该记录集吗?真烦人……
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-16
    • 2016-04-16
    • 1970-01-01
    相关资源
    最近更新 更多