有效访问具有相同数据对象名称的两个Delphi数据模块中的任何一个

时间:2014-07-28 05:04:14

标签: delphi datamodule

我有一个丑陋的情况,我需要在Delphi应用程序中使用两个数据模块(TDMA,TDMB)。每个数据模块具有相同的数据对象名称(查询,表等),但来自不同的组件集(TZQuery,TADOQuery)。我需要这个,因为我想支持多个数据库,但我的组件套件并不支持所有数据库。我需要访问哪个数据模块由DBFlag布尔变量决定。除了为每个数据访问分别几乎相同的代码段之外,还有一些更有效的方法吗?

如果我可以将基于DBFlag的全局数据模块变量(如DMG)设置为DMA或DMB,那么我的代码可以引用DMG而不是DMA或DMB。这是理想的,只需要很少的代码修改,但据我所知是不可能的。

2 个答案:

答案 0 :(得分:1)

我的建议是根据特定数据集删除DataModules。仅使用TClientDataSet构建它们并编写所有代码或将所有DataSources链接到这些数据集。然后创建其他DataModules来保存您的特定数据集,并使用您的选择方法选择响应哪个作为CDS实例的数据提供者。使用界面来实现这一点的想法确实很好。

这种方法将删除所有重复的代码,您将业务逻辑(处理CDS内部数据的代码)与持久性(将数据行传输到数据服务器的代码)分开。

答案 1 :(得分:0)

完全可能有一个全局变量,或者更好的是一个函数或单例 class或者最重要的是,一个接口,它返回对抽象的引用 dmA和dmB的共同点取决于布尔标志。究竟该怎么做, 但是,会受益于一些仔细的思考,其中大部分都是你需要的 做你自己,因为只有你了解项目的细节及其要求。

但是,我认为它可能会带给您一些潜在的问题 对于一个像现在删除的评论建议的实现,这消失了 数据模块(或隐藏它们)并使用自定义数据库对象或接口代替 通过表单,报告等提供消费者访问。

一个大问题是对象可见性在Delphi + IDE中的工作方式。

考虑一个具有单元MyForm1u的项目,该单元将成为数据库对象的使用者。 和单位dmAu和dmBu,其中包含您通过IDE设计人员添加的DB组件, 在两个单元中可能具有相同的名称,但可以是不同的实例类型。

现在,MyForm1u当然可以使用dmAu和dmBu,但是这有DB组件的问题 在dmA和dmB中必须具有公开的可见性(因为这是需要的 它们是可流动的和IDE可设计的情况。所以,虽然你可以有一个函数返回(实例)dmA或dmB,如果MyForm1u使用dmAu和dmBu,那么就没有强制执行 对它们进行封装,以便只通过该函数访问它们。

可以做的是定义一个共同的祖先数据模块,在单元中称之为dmCA dmCAu然后从它下降dmA和dmB - 事实之后这将是有点繁琐的事情 因为如果已经存在dmA和dmB,则需要手动编辑其DFM文件 如果你想在dmCA上有一些组件,调整组件祖先。但 重新开始,您可以轻松地在项目中创建一个包含任何数据库的新dmCA dmA和dmB 之间的共同组件,它们具有相同的实例类型,然后在IDE中从它下降dmA和dmB。

这将为您提供一个项目结构,其中myFormu1不使用dmAu或dmBu 直接也没有,有些人会说,dmCA。更好的方法可能是使用none 它们是一个单元X,它包含一个返回某个类或更好的函数 接口,它又有一组函数返回对它的引用 dmA和dmB的组成部分,它们在名称(实际上重要的是它们在数据模块的数据模型中的功能)和祖先类型中具有共同点,例如

function MyDataSet1:TDataSet;

这样它就可以返回dmA的AdoQuery1或者dmB的SqlQuery1,具体取决于 你的布尔标志。

如果您的消费者单位仅使用单位X而不使用dmAu,dmBu或dmCAu, 强制封装其内容。

这种基于类或接口的方法将排除“连接”消费者对象 像TmyForm1到DB对象使用通常的点'n点击方式礼貌的 IDE的Object Inspector,但是现在很多人会说这不是坏事。