使用TFDUpdateSQL插入后如何获取新的AutoInc字段值的值

时间:2019-07-04 14:37:05

标签: sql-server delphi firedac

在尝试从例如SQL Server使用TFDUpdateSQL时,我尝试访问新生成的自动增量字段值。

Cached Updates sample将此作为插入SQL:

INSERT INTO {id Products} (
  ProductName, SupplierID, CategoryID,
  QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder,
  ReorderLevel, Discontinued)
VALUES (
  :NEW_ProductName, :NEW_SupplierID,
  :NEW_CategoryID, :NEW_QuantityPerUnit, :NEW_UnitPrice,
  :NEW_UnitsInStock, :NEW_UnitsOnOrder, :NEW_ReorderLevel,
  :NEW_Discontinued
)
{IF MSSQL} select :NEW_ProductID = @@identity {FI}
{IF MSAcc} select @@identity as ProductID {FI}
{IF MySQL} select LAST_INSERT_ID() as ProductID {FI}
{IF IB} returning ProductID {into :NEW_ProductID} {FI}
{IF PG} returning ProductID {into :NEW_ProductID} {FI}
{IF SQLite}; select LAST_INSERT_ROWID() as ProductID {FI}
{IF Ora} returning ProductID into :NEW_ProductID {FI}

但是,该示例未在代码中使用NEW_ProductID结果(或我可以确定的任何其他方式),并且表单上的数据表网格未反映SQL Server生成的新ProductID值

我尝试从TFDQuery组件查看TField,但是该字段组件的NewValue属性中也没有新值。

如何访问和使用从代码中@@ identity检索到的新AutoInc值?

1 个答案:

答案 0 :(得分:0)

我确实找到了解决方案,至少对于SQL Server。事实证明,由TFDUpdateSQL组件生成的InsertSQL与示例中的InsertSQL不同。生成的代码包含INSERT INTO子句,后跟

SELECT SCOPE_IDENTITY() AS ProductID

如果我使用原始的INSERT INTO子句,然后使用该子句,则可以使用TFDQuery上的TField访问OnUpdateRecord处理程序中的新AutoInc值。 新的InsertSQL是

INSERT INTO {id Products} (
  ProductName, SupplierID, CategoryID, 
  QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, 
  ReorderLevel, Discontinued)
VALUES (
  :NEW_ProductName, :NEW_SupplierID, 
  :NEW_CategoryID, :NEW_QuantityPerUnit, :NEW_UnitPrice, 
  :NEW_UnitsInStock, :NEW_UnitsOnOrder, :NEW_ReorderLevel, 
  :NEW_Discontinued
)

SELECT SCOPE_IDENTITY() AS ProductID

在调用usProducts.Apply()之后,我可以在OnUpdateRecord处理程序中访问新的ProductID AutoInc值,

theIdField := qryProducts.FindField('ProductID');
theIdValue := theIdField.AsInteger;

当在usProducts.Apply()之前使用时,相同的代码还允许访问临时(插入前)的AutoInc值。

(注意:我尝试将其发布在community.idera.com上,但我无法保存回复)