什么是最好的方式来编写Delphi数据库应用程序使用的交易和数据感知的组件?

我必须要写一个客户应用程序访问少表,并做一些主详细样的东西内部的交易。后做了一些研究上的交易(从一般角度来看),那么我谨作一个结论是,无数据-知道还有件和手工编码SQL将是"绝配"的交易;但是数据感知的成分就不会。他们似乎不对。

我真正需要使用交易,但另一方面,我不能只是掷的数据感知的分离,因为它们极大地简化了的东西。

可能有人请告诉我?我已经Google搜索它,但是我还没有找到任何有用的答案。也许是因为我的英语不够好,我的关键词是有限的。

顺便说一句,我使用德尔菲7和目前正在评估UniDAC作为数据访问图书馆。

谢谢你。

编辑

例描述的一个方面我的问题:

想象一下一种形式,与2DBGrids。第一个网格是MasterGrid和它上面是这些按钮:增加、修改和删除。第二网是DetailGrid.如果用户击增加,那么它是这样的:

  • 连接。StartTransaction
  • 掌握。然后追加的主人。后后来的主人。编辑(所掌握的数据集已经自动递增的主要关键,并且它现在可编辑)
  • 显示的形式编辑模式,其中的用户填写所掌握的记录,并且还添加了一些细节的记录使用的另一种形式。
  • 如果用户点击OK,程序就会做主人。员额和连接。提交。如果用户单击"取消",然后该程序将不连接。回退。

我知道交易应当尽可能短,但你可以看到上述交易只是作为最短的速度用户填写的表格。

如果我们使用的无数据-知道还有件,我会做定义插入Sql根据从用户输入的,然后执行SQL之间StartTransaction和提交。这样我就可以实现的非常短的事务。

编辑2

我感谢所有你为你的那种参与。我选择的回答从vcldeveloper,因为它是最近解决我的当前需要。

有帮助吗?

解决方案

其他人提到使用一个组合DatasetProvider和ClientDataset有一个批次更新,但在使用ADO或UniDAC件,则不需要额外的层的DatasetProvider+ClientDataset,因为这两个ADO和UniDAC支持批次更新。

对于 ADO, 什么你应该做的是设置 LockType 你的数据集 ltBatchOptimistic.对于 UniDAC, ,你应该设置 CacheUpdate 酒店来 真的.

这一改变使得数据集,以缓所有的更改在其存记录,并送他们的产品总数数据库只有当你打电话 UpdateBatch 方法(ADO)或 ApplyUpdates 方法(UniDAC).

现在你应该做的就是让你的用户插入/编辑的记录在掌握数据集和任何记录,他/她希望在详细信息数据集的使用的任何数据-知道还有件你喜欢。所有变化,将缓存。当你的用户完成,您可以开始一个新的事务,第一个电话UpdateBatch(或ApplyUpdate的情况下UniDAC)对掌握的数据集,然后对细节的数据集,如果一切顺利,提交事务。

这会让你交易的短期不需要额外的层的ClientDataset.

关于

其他提示

我明白你的问题,我想。当打开一个TADODataSet有例如10行的数据进行编辑上的一种形式,与数据-知道成分,在有些情况下你会想要的高速缓存的所有变化,所有10个行(以及有可能删除并插入)和提交这一批次。你不能打开交易的第一个变化,因为这将阻止其他用户改变的相同数据。交易记录应尽可能短。

我做什么我在勾勒的情况是使用的下列部件在一个链:

TADOConnection>>TADODataSet>>TDataSetProvider>>TClientDataSet>>TDataSource>>TDBEdits等。

现在,所有的改变是缓存在TClientDataSet你可以叫它的方法ApplyUpdates以后所有的更改在一个快速的事务。记住,这也有可能使用多个TADODataSets和多TClientDataSets为一个主详细(细节-等等)的结构与嵌套数据集。所有主详细的更改也可以缓和适用在一个批次中的一种交易。看到的帮助和资源的其他地方的所有细节有关实现这一点。在第一是不容易的。但如果你想通了它的方便和提供吨的可能性。(离线编辑,审查更改申请之前,等等。)

为避免需要进行大笔交易我用 DataSetProvidersClientDatasets (甚至在本地).

考虑使用这种缓和它给你的两个最好的世界。你可以使用数据感知的控制,以简化工作时的用户界面。用户操作的数据集"记录"的ClientDataSets(一种数据库,缓冲存储)。

当你的用户准备好 保存 变化的数据库(例如,该发票的数据是在所有地方),你打电话的 ApplyUpdates 方法的数据集(s)。

在最简单的方案,其中所有的数据集是在主详细的关系(嵌套的提供者),提供商开始,并承诺/返回的交易本身,所以你在一个全有或全无的情况。

如果你有更多的复杂关系,你可以叫StartTransaction之前开始采用更新的每个参与ClientDataSet组,并在结束时呼吁提交或Rollback如需要)。逻辑用于提供者如果连接有一个活跃的交易的当ApplyUpdates称,那么它不会有事务,但只需员额变动的数据库,假设你是在控制该交易。

你有读取有关TClientDataSet和如何处理OnReconcileError和实验与技术之前把它放在生产环境中,但它的工作非常,非常好我。

我2美分。

你是对的那一个 交易应当尽可能短,并应不会活着所有的时间,同时用户的形式。

一般的解决方法,如已经回答说,是采用中间层(a ClientDataSet).但真正的问题与你的情形是,无法获得一个自动增量值主表没有掌握。追加和掌握。员额,并因此开始 交易很久以前它实际上是必需的。

所以如果你不想使用的中间层,仍然使用数据感知的部件短 交易你应该想一个数据库,支持获得autoincremented值而不执行插入(主要表)。例是 火鸟 数据库,并FibPlus数据访问的组件,用于火鸟完全支持这一特征。

交易应作为短 需要.问题是如何不同的数据库处理锁。数据库只执行行级锁定和可以立即返回自锁而不必等待具有远远低概率来的僵局。通常插入问题较少(虽然其他用户不会看到新行,直至承诺,取决于隔离等)、更新和删除是更大的问题。犯往往可能是"坏"。缓存的变化并将它们应用在一个单一的行动是另一种可能-但是你必须要处理的问题,由于其他用户改变的记录的同时。没有一个"更好"的解决方案-一切都取决于实际需要。对于某些应用程序(和一些数据库)保持记录锁只要它们改变是确定的,他人不可以。批次更新可以确定,在某些情况下并且不在其他人。你有选择的模式最适合你的应用程序和数据库。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top