我如何理解Post
组件上的ApplyUpdates
和TQuery
方法之间的区别现在是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;
答案 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
事件对每个记录进行控制。使用该事件及其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;