Как получить значение нового значения поля AutoInc после вставки с TFDUpdateSQL - PullRequest
0 голосов
/ 04 июля 2019

Я пытаюсь получить доступ к недавно сгенерированному значению поля автоматического увеличения при использовании TFDUpdateSQL, например, с SQL Server.

Пример Cached Updates включает это в качестве вставки 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 в коде (или любой другой способ, который я могу определить), и сетка таблицы данных в форме не отражает новое значение ProductID, которое SQLСервер сгенерирован.

Я попытался посмотреть на TField из компонента TFDQuery, но этот компонент поля также не имеет нового значения в своем свойстве NewValue.

Как получить доступ и использоватьновое значение AutoInc, которое было получено из @@ identity из кода?

1 Ответ

0 голосов
/ 04 июля 2019

Я нашел решение, по крайней мере для SQL Server.Оказывается, что InsertSQL, сгенерированный компонентом TFDUpdateSQL, отличается от InsertSQL в образце.Сгенерированный код содержит предложение INSERT INTO, за которым следует

SELECT SCOPE_IDENTITY() AS ProductID

Если я использую исходное предложение INSERT INTO, а затем это предложение, то я могу получить доступ к новому значению AutoInc в обработчике OnUpdateRecord, используяTField на TFDQuery.Новый 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

. Затем я могу получить доступ к новому значению AutoInc ProductID в обработчике OnUpdateRecord после вызова usProducts.Apply () с помощью

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

Тот же код такжеразрешает доступ к временному значению AutoInc (перед вставкой) при использовании до usProducts.Apply ().

(примечание: я пытался опубликовать это на community.idera.com, но не смог получить ответ насохранить)

...