我正在努力弄清楚我想在更改数据库后使用的命令。我通过SQLite3和db-aware控件学习,这是我的理解...
当用户在db-aware控件中键入内容(或以其他方式将内存数据集置于编辑状态)时,POST
会将更改存储在内存中。控件通常会自动或隐式地为您执行此操作。
虽然您必须在任何地方发现任何更改之前发布,但更改尚未发送到磁盘上的实际数据库文件。他们只是在记忆中。将更改发送到磁盘需要APPLYUPDATES
。
即使通过APPLYUDATES
发送到磁盘上的文件,他们也可以仍然进行更改或回滚。这就像击中撤消一样。在调用COMMIT
之前,它们不会永久保存到磁盘。
这听起来不错吗?我真的很想知道我在做什么,所以我不只是复制和粘贴代码。但请随时复制,粘贴和编辑我的回复尝试。
答案 0 :(得分:10)
你的问题的答案是Post,ApplyUpdates和Commit做了完全不同的事情,通常发生在数据库应用程序的不同地方(进程)和上下文中。
Post
和ApplyUpdates
都是真正的客户端操作,而Commit
是一个SQL操作,可能(或不需要)在服务器端显式调用以完成事务。
如果考虑使用三层服务器,最容易理解差异。 SQLite有点奇怪,因为它不是真正的Sql Server,它的设计目的是响应来自不同机器上不同进程的调用(尽管它可以作为后端一个3层系统_。
关于最简单的传统3层安排,中间层的Delphi服务器位于Sql Server(比如MS Sql Server)和客户端层之间,通常是在客户端计算机上运行的Delphi程序。 Borland / EMBA实现这一目标的传统技术是DataSnap
。
客户端层通常包含TClientDataSet
(或第三方等效项),它通过中间层中特定于服务器的TDataSet后代从后端SQL Server接收数据。虽然从Sql Server获取数据到中间层通常涉及Sql Server上的事务,但是一旦数据全部加载到客户端层中的CDS中,SQL Server上就没有待处理的事务(除非您没有您在服务器上保持事务处理的方式,这对服务器的其他用户不友好,并且消耗服务器上的锁资源,这是有限的。)
当您编辑CDS(或实际上任何TDataset后代)中的数据时,会将数据集置于dsEdit状态(请参阅TDataSetState的在线帮助)。所做的更改是临时的,这意味着它们可以在CDS中撤消,直到您调用.Post,它将它们保存到CDS的数据(在TClientDataSet的情况下,可以回滚对客户端数据的更改)调用后的事件.Post,只要.ApplyUpdates没有被调用)。请记住,在客户端层的CDS上调用.Post时,Sql Server上没有待处理的事务(或者至少不存在事务)。
调用.Post 不会导致更改传播回对应的中间层数据集。要启动它,请在客户端层CDS上调用ApplyUpdates,该CDS会传递到中间层中的TDataSetProvider,该中间层将CDS与中间层的面向服务器的数据集连接起来。它是DataSetProvider(或者更确切地说是与之关联的TSqlResolver),它生成实际发送到SQL服务器以将更改应用于SQL数据库的SQL。因此,在标准的DataSnap 3层设置中,您无法直接控制是否调用Commit。
Commit
是由Sql Server执行的SQL操作,作为完成事务的两种可能方式之一(另一种是Rollback
)。使用MS Sql Server,f.i。,与服务器的连接可以配置为在隐式事务中自动包装收到的UPDATE
,INSERT
和DELETE
语句。
您需要关注事务控制的程度取决于您使用的后端服务器以及应用程序在与其他服务器数据使用的并发性方面的要求。如果您对SLite处理交易感兴趣,请查阅您正在使用的DB组件或其源代码的文档。
一些用于处理真正SQL Server的Delphi组件库确实支持公开用于控制服务器端事务的工具,例如: Interbase的IBX。
Btw,在Delphi术语中,CachedUpdates
是长期过时的BDE的遗留问题,这是Borland首次尝试使用各种后端服务器的通用数据库访问框架。它坚持一些TDataSet后代的实现,并且(令人遗憾的是,imo)在FireDAC,EMBA的最新跨数据库产品中引起了一些反击。
答案 1 :(得分:-1)
使用ApplyUpdates时,必须设置CachedUpdates 属性为True。然后 您可以使用帖子,删除(和其余的)来更改您的数据 更改将首先放入缓存中。 调用ApplyUpdates时,您所做的所有更改都存储在 数据库。使用CancelUpdates 您可以撤消所做的所有更改。 当您将CachedUpdates属性设置为false时,所有更改都会对您进行更改 已经直接做了 存储到数据库中。命令ApplyUpdate和CancelUpdates可以 不被使用。