上TQuery组件岗位和方法的ApplyUpdates德尔福
如何理解上TQuery
组件Post
和ApplyUpdates
方法之间的差别现在是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;
如果CachedUpdates
已启用,您是对的。然后,Post
将仅将数据集的更新存储在本地存储器中,而不是将其写入底层数据库表。请注意,可以将多个更改存储在内存中。你的应用程序可能不需要它,并有办法阻止它,但我不知道为什么然后使用CachedUpdates进行单个记录。但是这意味着您尝试检查数据库中是否存在活动记录可能是徒劳的,因为它缺少其他更新的记录。
但一些关于Applying BDE-based Cached Updates可能会帮助你的情况:
当应用数据库事务的控制下更新的 发生以下事件:
- 一个数据库事务开始。
- 缓存的更新被写入数据库(阶段1)。如果您提供它,则会为写入数据库的每条记录 触发一次OnUpdateRecord事件。如果在向数据库应用 记录时发生错误,则在您提供 之一时会触发OnUpdateError事件。如果写成功或回滚,如果他们不
因此,有可能会对使用OnUpdateRecord
事件每条记录的基础控制
TUpdateKind
和TUpdateAction
你应该能够得到所需的行为。下面的事件将跳过修改或插入记录,根据您的问题中的伪代码。您可能想重新考虑修改/编辑的记录。我没有实现检查记录是否存在的函数。 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;
谢谢你这么好的解释!我的代码和你写的代码类似,我使用的是UpdatesPending,而不是在这个过程中。但是,再次,我会再次看看,也许这会更好,如果我在这里也使用它。再次感谢你 :) – nikname
回答我的问题,Post
方法不从TQuery
组件删除SQL查询。 解决此问题的方法是分配新的本地TQuery
变量并使用它来检查记录是否已存在于表中。
请不要发布不会编译的伪码,就像您在q中包含的示例一样,因为它只会浪费读者的时间。同时,-1。相反,cut'n从你的项目中粘贴你的实际代码。 – MartynA
@MartynA这并不好。我已经很好地解释了我需要的帮助。整个应用程序太大了,不能在这里粘贴,我的工作只是创建这个程序,我不是很了解整个应用程序。如果我那时我不会问,相反我会回答你的问题。 – nikname
呃,我很抱歉,但是您应该通过发布**实际**代码来显示您对FOC帮助的读者的一些小问题,而不是您在编写问题时键入的内容。如果你不能这么做,为什么有人需要麻烦回答? – MartynA