【问题标题】:Delphi & ADO - How to get value of ID column after Post?Delphi & ADO - 如何在发布后获取 ID 列的值?
【发布时间】:2019-01-13 13:23:37
【问题描述】:

为了在 MS SQL 数据库表中添加新记录,我使用了 TADOTable 组件,它是 AppendPost 方法。

我的表包含ID 列(PK, auto-increment),在我执行Post 方法后,我需要知道在新记录中分配了什么ID 值。

怎么做?

【问题讨论】:

  • 最终该值将自动读回 TADOTable,但尚未在 OnAfterInsert 中。但是,您确实获得了该事件的数据集参数,其中已经可以从参数中读取新值。
  • 一般来说,我建议使用 TADOQuery 而不是 TADOTable。不是因为这个原因,而是因为它允许您为您想要的数据指定准确的查询,这在大多数情况下将使您的应用程序更快和/或更高效地使用数据库。

标签: sql-server delphi c++builder ado


【解决方案1】:

使用 TDOQuery 组件和 OUTPUT 子句插入数据并返回 IDs as

AQ.Close;
AQ.SQL.Clear;
AQ.SQL.Add('INSERT INTO Table (Col1, Col2) OUTPUT INSERTED.ID VALUES (:Param1, :Param2)');
AQ.Parameters.ParamByName('Param1').Value:= SomeValue;
AQ.Parameters.ParamByName('Param2').Value:= SomeValue;
AQ.Open;

请注意,您需要使用 Open 方法而不是 ExecSQL 来返回结果。

您也可以使用SCOPE_IDENTITY,您需要创建一个参数来为您返回值,并将pdReturnValue分配给该参数的Direction

Var InsertedID: Integer;
...
AQ.Close;
AQ.SQL.Clear;
AQ.SQ.Add('INSERT INTO Table (Col1, Col2) VALUES (:Param1, :Param2);');
AQ.SQL.Add('SET :ID = SCOPE_IDENTITY()');
AQ.Parameters.ParamByName('Param1').Value:= SomeValue;
AQ.Parameters.ParamByName('Param2').Value:= SomeValue;
AQ.Parameters.ParamByName('ID').Direction:= pdReturnValue 
AQ.ExecSQL;
InsertedID:= AQ.Parameters.ParamByName('ID').AsInteger;

AQ 在示例中是TADOQuery

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    • 1970-01-01
    • 2021-12-12
    • 2011-01-30
    相关资源
    最近更新 更多