在尝试从例如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值?
答案 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上,但我无法保存回复)