![]() |
1
13
你的问题的答案是,Post、ApplyUpdates和Commit做的事情完全不同,通常发生在数据库应用程序的不同位置(进程)和上下文中。
如果考虑三层服务器,最容易理解它们的区别。SQLite有点古怪,因为它不是真正的Sql Server,它的设计目的是响应来自不同机器上不同进程的调用(尽管它可以作为三层系统的后端)。
最简单的传统三层结构有一个中间层Delphi服务器,它位于Sql server(例如MS Sql服务器)和客户端层(通常是在客户端机器上运行的Delphi程序)之间。Borland/EMBA实现这一点的传统技术是
客户端层通常包含
当您在CDS(或任何TDataset后代)中编辑数据时,这会将数据集置于dsEdit状态(请参阅TDataSetState的联机帮助)。所做的更改是临时的,这意味着它们可以在CDS中撤消,直到您调用.Post,后者将它们保存到CDS的数据中(对于TClientDataSet,只要尚未调用.ApplyUpdates,对客户端数据的更改可以在调用.Pos后回滚事件)。请记住,当在客户端层的CDS上调用.Post时,Sql Server上没有挂起的事务(或者至少不应该有)。 正在打电话。Post正在打电话 不 导致更改传播回对应的中间层数据集。首先,在客户机层CD上调用ApplyUpdate,它会波及到中间层的TDataSetProvider,后者将CD与中间层面向服务器的数据集相连接。生成SQL的是DataSetProvider(或者更准确地说是与其关联的TSqlResolver),该SQL实际上被发送到SQL服务器,以将更改应用到SQL数据库。因此,在标准的DataSnap 3层设置中,您无法直接控制是否调用Commit。
您需要在多大程度上关注事务控制取决于您使用的后端服务器以及您的应用程序在与其他使用服务器数据的并发性方面的要求。如果您对SLite的事务处理感兴趣,请查阅您正在使用的DB组件或其源代码的文档。 一些用于处理真正的SQL server的Delphi组件库确实支持用于控制服务器端事务的公开工具,例如用于Interbase的IBX。
顺便说一句,
|
![]() |
2
-1
使用ApplyUpdates时,必须设置CachedUpdates 属性设置为True。然后 您可以使用post、delete(和其他)来更改数据,这些 更改将首先放入缓存。 调用ApplyUpdates时,您所做的所有更改都存储在 数据库使用CancelUpdates 您可以撤消所做的所有更改。 当您将CachedUpdates属性设置为false时 将直接 存储到数据库中。命令ApplyUpdate和CancelUpdates可以 不得使用。 |
|
kaiselwyvrn · 我无法打开Visual Studio项目 1 年前 |
![]() |
4SadMemeXD · 无法在Django中选择相关类别 2 年前 |
![]() |
Agrim Singh · 用户数据。名称未显示用户名 2 年前 |
![]() |
Peloucvo · 用数据库中的数据填充JTable 2 年前 |
![]() |
Montaser Majid · 用于从多行中提取单行的SQL查询 2 年前 |
![]() |
Max J. · 用整数作为键将dict写入csv 2 年前 |