上TQuery组件岗位和方法的ApplyUpdates德尔福

问题描述:

如何理解上TQuery组件PostApplyUpdates方法之间的差别现在是Post被更改写入到本地内存,然后用ApplyUpdates它是将数据写入到表中。所以我的第一个问题是如果这是正确的?上TQuery组件岗位和方法的ApplyUpdates德尔福

现在还有其他的东西我不明白。下面是代码:

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

后,我用Post没有TQuery.SQL.Text删除本身?其实我可以输入新的SQL语句并执行它吗?准确地说,新的SQL语句应该是检查表中是否存在记录的SQL代码,并且只有当答案是'否'时才应该完成。

什么我问,是该代码正确(假设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; 
+0

请不要发布不会编译的伪码,就像您在q中包含的示例一样,因为它只会浪费读者的时间。同时,-1。相反,cut'n从你的项目中粘贴你的实际代码。 – MartynA

+0

@MartynA这并不好。我已经很好地解释了我需要的帮助。整个应用程序太大了,不能在这里粘贴,我的工作只是创建这个程序,我不是很了解整个应用程序。如果我那时我不会问,相反我会回答你的问题。 – nikname

+0

呃,我很抱歉,但是您应该通过发布**实际**代码来显示您对FOC帮助的读者的一些小问题,而不是您在编写问题时键入的内容。如果你不能这么做,为什么有人需要麻烦回答? – MartynA

如果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; 
    
  • +0

    谢谢你这么好的解释!我的代码和你写的代码类似,我使用的是UpdatesPending,而不是在这个过程中。但是,再次,我会再次看看,也许这会更好,如果我在这里也使用它。再次感谢你 :) – nikname

    回答我的问题,Post方法不从TQuery组件删除SQL查询。 解决此问题的方法是分配新的本地TQuery变量并使用它来检查记录是否已存在于表中。