在Delphi中的TQuery组件上发布和ApplyUpdates方法

时间:2017-09-27 09:03:34

标签: sql-server-2008 delphi delphi-2006

我如何理解Post组件上的ApplyUpdatesTQuery方法之间的区别现在是Post正在将更改写入本地内存,然后使用ApplyUpdates它将数据写入表中。所以我的第一个问题是,如果这是对的吗?

现在还有其他我不明白的事情。这是代码:

if (TQuery.State in [dsEdit, dsInsert]) then
begin
TQuery.Post;    
end;
TQuery.ApplyUpdates;

使用Post后,TQuery.SQL.Text会自行删除吗?实际上我可以输入新的SQL语句并执行它吗?准确地说,新的SQL语句将是用于检查表中是否已存在记录的SQL代码,并且仅当答案为“否”时才会出现。 ApplyUpdates应该完成。

我要问的是,这段代码是否正确(让我们说 var 是一个整数的局部变量):

if (TQuery.State in [dsEdit, dsInsert]) then
begin
TQuery.Post;     
TQuery.SQL.Text := 'IF EXIST (Select ...) SET '+ var.l + ' = 1';
TQuery.ExecSQL;  
end;
If var <> 1
TQuery.ApplyUpdates;

2 个答案:

答案 0 :(得分:0)

要回答我的问题,http://xxx.xxx.xxx.net in driver.get 方法不会从Post组件中删除SQL查询。 解决此问题的方法是分配新的本地TQuery变量,并使用它来检查表中是否已存在记录。

答案 1 :(得分:0)

如果启用CachedUpdates,您就是对的。然后,Post将仅在本地内存中存储对数据集的更新,而不是将它们写入底层数据库表。请注意,可以在内存中存储多个更改。您的应用程序可能不需要它并且有办法阻止它,但我不知道为什么然后将CachedUpdates用于单个记录。但这意味着您尝试检查数据库中是否已存在活动记录可能是徒劳的,因为它缺少其他更新的记录。

但有关Applying BDE-based Cached Updates的内容可能会对您有所帮助:

  

在数据库事务控制下应用更新时,   发生以下事件:

     
      
  • 数据库事务开始。
  •   
  • 缓存更新将写入数据库(阶段1)。如果您提供它,则会为每条记录触发一次OnUpdateRecord事件   写入数据库。如果应用记录时发生错误   对于数据库,如果提供,则触发OnUpdateError事件   之一。
  •   
  • 如果写入成功则提交事务,如果写入不是
  • 则回滚事务   

因此,可以使用OnUpdateRecord事件对每个记录进行控制。使用该事件及其TUpdateKindTUpdateAction类型的参数,您应该能够获得所需的行为。下面的事件将根据问题中的伪代码跳过修改或插入的记录。您可能想要重新考虑修改/编辑的记录。我没有实现检查记录是否存在的函数。

procedure TForm1.Query1UpdateRecord(DataSet: TDataSet;
  UpdateKind: TUpdateKind; var UpdateAction: TUpdateAction);
begin
  // In case of edit or insert
  if UpdateKind in [ukModify, ukInsert] then
  begin
    // Skip existing records
    if ExistsCurrentRecord(DataSet) then
      UpdateAction := uaSkip;
  end;
end;

当您准备好保存缓存数据时,您可能希望Post查询在缓存中进行最新更改,然后检查UpdatesPending以确定是否需要如下所示应用缓存中的更改:

if Query.UpdatesPending then
  Query.ApplyUpdates;