我想问一下有经验的用户,如果您更喜欢使用数据感知控件在数据库中添加,插入,删除和编辑数据,或者您愿意手动执行此操作。
我开发了一些数据库应用程序,其中为了“用户友好的策略”,我遇到了复杂的表事件网络(afterinsert,afteredit,after ...和beforeedit,beforeinsert,之前......)。之后,调试应用程序是一项非常糟糕的工作。
意识到这种风险(后来由另一个应用程序)我试图避免这个问题,所以我更加注意编写代码,可读性和全面性。从一开始它似乎一切都好,但由于我需要在发送和加载数据之前处理一些预处理内容,我再次遇到同样的问题,“慢慢地,不可避免地”。有时候无论如何我都无法使用数据控件,而DAControl在开始时看起来像是一个“酷”的功能,最终会成为一个障碍。我“必须”为非数据控件控件编写特殊例程,以便表现为数据感知。然后我问自己,为什么我应该使用数据控件?在非数据控件控件上找到应用程序架构是否更好?当然,它需要更多时间来编写防错代码,但是它值得吗?我不知道......
我好几次碰到过我,就像jinxed:天堂开始时的地狱......
我不知道,如果我使用错误的方法编写DB程序,如果有一些标准的通用做法如何进行。或者,如果这是每个人的常见问题?
Thanx建议和您的经历
答案 0 :(得分:5)
我编写的应用程序使用数据感知组件来对抗使用非数据感知组件的TTable样式组件和应用程序。
我最喜欢的是使用数据感知组件但使用TClientDataSets而不是TTable样式组件。
使用TClientDataSet我不必使我的用户界面结构模仿我的数据库结构。它足够灵活,可以用几个表中的数据填充它,然后当您将更新应用到数据库时,您可以根据需要手动添加/删除/更新记录。
答案 1 :(得分:0)
秘密应该在DataSet参数自动化中,您可以创建一个控件,以主从方式将数据集粘合在一起,只需定义它们之间的连接即可。当然,这种控制应该以其他一般化的方式提供表格参数。在这种情况下调用带有实体标识符的表单,所有数据集都将以正确的顺序填充,并允许提供者自动更新数据库中的数据。
通常,最好让DataSet成为具有可选计算字段的表的精确表示(fkInternalCalc有时效果更好,因为它更新时行更改而非字段更改)绑定到数据感知控件。数据感知控件是最佳方法,并且不易出错。就像在每个方面一样,也有例外。
如果必须编写太多胶水功能,问题可能在于设计模式,而不是在VCL中。
答案 2 :(得分:0)
很多时候我使用链接到从查询填充的内存表(kbmMemTable)的数据感知控件。
我看到的好处是:
使用内存表非常简单:
dataset.sql.add('select a.field,b.field from a,b');
dataset.open;
inMemoryTable.loadfromdataset(dataset);
inMemoryTable.checkpoint;
然后“解析”回数据库,您可以访问每条记录中每个字段的原始数据和新数据(类似于触发器) - 您可以轻松地进行事务处理并解决整个编辑毫秒 - 即使最终用户需要30分钟来填写数据感知控件。
答案 3 :(得分:0)
您是否考虑过像O/R mapper或tiOPF这样的Delphi hcOPF?
这会将业务域逻辑与数据库层分开。对于大型系统和旧系统,通常会添加另一个层“Anti Corruption Layer”,以保护模型免受数据库设计中的更改。