Coc*_*cin 9 database delphi transactions delphi-7 data-aware
使用事务和数据感知组件编写Delphi数据库应用程序的首选方法是什么?
我必须编写一个访问InnoDB表的客户端应用程序,并在事务中执行一些主要的详细信息.在对交易进行一些研究之后(从一般的观点来看),我谦虚地得出结论,非数据感知组件和手工编码的SQL将是交易的"完美匹配"; 但数据感知组件不会.它们似乎并不是为彼此而制造的.
我真的需要使用事务,但另一方面,我不能只是抛弃数据感知组件,因为它们大大简化了事情.
有人可以赐教我吗?我一直在谷歌搜索它,但我没有找到任何有用的答案.也许是因为我的英语不够好,我的关键词有限.
顺便说一下,我正在使用Delphi 7,目前正在评估UniDAC作为数据访问库.
谢谢.
编辑
用于描述我的问题的一个方面的示例:
想象一下有一个包含2个DBGrids的表单.第一个网格是MasterGrid,上面是这些按钮:添加,编辑和删除.第二个网格是DetailGrid.如果用户单击"添加",则它将如下所示:
我知道交易应该尽可能短,但你可以看到,交易只是填写表格的用户的速度.
如果我使用的是非数据感知组件,我会根据用户输入自定义插入SQL,然后在StartTransaction和Commit之间执行SQL.所以我可以实现非常短的交易.
编辑2
我感谢你们所有人的亲切参与.我从vcldeveloper中选择答案,因为它是我目前需要的最接近的解决方案.
小智 5
我想,我理解你的问题.当打开一个TADODataSet,例如要在表单上编辑10行数据时,使用数据感知组件,在某些情况下,您可能希望缓存对所有10行(以及可能的删除和插入)所做的所有更改并将其作为一个批次提交.您无法在第一次更改时打开事务,因为这会阻止其他用户更改相同的数据.交易应尽可能短.
我在草绘场景中所做的是在链中使用以下组件:
TADOConnection >> TADODataSet >> TDataSetProvider >> TClientDataSet >> TDataSource >> TDBEdits等
现在所有更改都缓存在TClientDataSet中,您可以调用它的方法ApplyUpdates在一个快速事务中发布所有更改.请注意,对于具有嵌套数据集的主细节(-detail-etc)结构,也可以使用多个TADODataSets和多个TClientDataSets.所有主 - 细节更改也可以在一个事务中缓存并应用于一个批处理中.有关实现此功能的所有详细信息,请参阅其他地方的帮助和资源 起初并不容易.但如果你弄清楚它很容易并且提供了大量的可能性.(离线编辑,在应用之前检查更改等)
其他人提到使用DatasetProvider和ClientDataset的组合来进行批量更新,但是如果使用ADO或UniDAC组件,则不需要额外的DatasetProvider + ClientDataset层,因为ADO和UniDAC都支持批量更新。
对于ADO,您应该做的是将数据集的LockType设置为ltBatchOptimistic。对于UniDAC,您应该将CacheUpdate属性设置为True。
此更改使您的数据集缓存您对其内存中记录集所做的所有更改,并仅在您调用UpdateBatch方法 (ADO) 或ApplyUpdates方法 (UniDAC) 时将它们全部发送到数据库。
现在您应该做的是让您的用户使用您喜欢的任何数据感知组件在主数据集中插入/编辑一条记录以及他/她想要在详细数据集中插入/编辑的任何记录。所有更改都将被缓存。当您的用户完成后,您可以启动一个新事务,并首先针对主数据集调用 UpdateBatch(或在 UniDAC 的情况下为 ApplyUpdate),然后针对详细数据集调用,如果一切顺利,则提交事务。
这将使您的交易变得简短,而不需要额外的 ClientDataset 层。
问候