6

从 Delphi Win32 应用程序(ADO 或 DBX(Database Express))连接到 MS SQL、Oracle 或 Firebird 哪个更好(以及出于什么原因)?

两者都允许您连接到主要数据库。我喜欢 ADO 通过更改连接字符串来完成这一切的方式,以及 ADO 和驱动程序包含在 Windows 中的事实,因此无需额外部署(似乎,如果我错了,请纠正我)。

DBX 也很灵活,我可以将驱动程序编译到我的应用程序中,不是吗?

如果可能的话,我真的很想拥有一个单一的来源,能够根据客户的 IT 部门/偏好来改变数据库。

但是哪个更容易编程、性能更好、内存使用效率最高呢?还有什么其他的东西可以区分它们吗?

谢谢,理查德

4

6 回答 6

7

ADO 使用简单,只要确保在客户端安装相应的客户端驱动程序即可。

我发现 DBX 更灵活,它更好地集成在 IDE 和 DataSnap 等其他技术中。

出于与您相同的目的,我将 DBX 与来自DevArt的第三方驱动程序一起使用。如果您购买驱动程序源,您可以使用您的应用程序编译驱动程序。

于 2009-08-20T12:25:35.670 回答
5

在 Delphi 诞生之初,人们就称赞 Delphi 对多 DBMS 的支持。每个人都喜欢 BDE(因为这是做到这一点的唯一方法)。

但是在过去十年中查看客户时,我发现他们的应用程序中的多 DBMS 支持稳步减少。

从一个应用程序支持多个 DBMS 的成本很高。

不仅因为您必须了解每个 DBMS,还因为每个 DBMS 都有自己的一组特性,您必须在数据访问层适应这些特性。这些不仅包括语法和底层数据类型的差异,还包括优化策略。

此外,一些 DBMS 与 ADO 一起工作得更好,一些与直接连接更好(比如一起跳过你的 Oracle 客户端)。

最后,测试您的软件与多个 DBMS 系统的所有组合是非常密集的。

我参与了一些项目,我们必须更改 DBMS 后端和/或数据访问技术(即从 BDE 到 DBX,或从 DBX 到直接连接)。改变后端总是比改变数据访问技术要痛苦得多。多层方法使它们更容易一些,但增加了自由度,因此增加了测试工作。

我看到的一些支持多 DBMS 的产品是在垂直市场应用程序中,最终客户已经拥有自己的 DBMS 基础架构,并且应用程序需要适应它。例如在荷兰政府领域,Oracle 一直很强大,但 SQL Server 也建立了相当多的用户群。

因此,您需要考虑要支持哪些 DBMS 组合,不仅在功能方面,而且在成本方面。

如果您坚持使用一个 DBMS,那么使用 BDE、DBX 或 ADO 之类的通用数据访问层是没有意义的:尽可能直接地进行连接是有回报的。我的经验告诉我,这些组合效果很好:

希望这能让您深入了解从 Delphi 应用程序支持多个 DBMS 的可能性和限制。

——杰伦

于 2009-08-21T08:40:56.967 回答
4

一般规则:每一层组件都可能会增加一层额外的错误。ADO 和 DBX 都是围绕标准数据库功能的组件包装器,因此它们都同样强大。因此,正确的选择应该基于其他因素,例如您要使用的数据库。如果您想连接到 MS-Access 或 SQL Server,ADO 将是更好的选择,因为它更适合这些数据库。但 Firebird 和 Oracle 更适合 DBX 组件。

不过,我个人倾向于使用原始 ADO API。再说一次,我不在我的项目中使用数据感知组件。我知道,它的 RAD 较低。但是我经常需要以这种方式工作,因为我通常在数据库和 GUI 之间编写具有多层的客户端/服务器应用程序,从而使事情变得更加复杂。

于 2009-08-20T12:40:02.820 回答
4

我的两分钱:DBX 明显更快(在 oracle 和 sql 上),并且更挑剔且更难部署。

如果性能是一个因素,我会选择 DBX。否则,为了简单起见,我只会使用 ADO。

于 2009-08-20T20:12:15.757 回答
2

正如其他人所说,DBX 在某些情况下或特定情况下可能在原始性能上具有优势,但 ADO 是世界上大量应用程序的基础,因此虽然 ADO 的性能可能相对较差,但显然这并不意思是“不可接受”的穷人。

对我自己而言,并从我参与的主要项目中得知,DBX 最大的“问题”是,无论它有多好,它都是语言/工具公司提供的关键基础设施技术。

任何在以前的 BDE 技术上构建应用程序的人都将证明该技术被弃用且不再受支持时造成的中断。虽然没有任何技术可以免于被其供应商弃用,但 ADO 显然在技术供应商本身之外的行业支持方面具有优势。

出于这个原因,我自己现在总是使用 ADO。然而,当从一种数据库类型更改为另一种时,仅仅更改连接字符串并不总是唯一需要担心的事情。存储过程调用语法可能因一个 ADO 提供程序而异,如果您打算针对多个不同的 SQL 引擎进行部署,您仍然必须注意您使用的 SQL 语法,其中 SQL 支持可能因另一个而异。

为了缓解这些问题,我使用了我自己的 ADO 对象模型封装。这种封装不会尝试将对象模型转变为与 ADO 不相似的东西,它只是公开了我需要以更 ObjectPascal 更友好(和“类型”安全)的形式直接使用的 ADO 的那些部分(例如枚举类型和设置常量和标志等,而不仅仅是分数,如果不是数百个整数常量)。

我的封装还考虑了不同提供者行为/要求中的一些细微变化,例如前面提到的存储过程调用语法的差异。

我还应该说,与另一张海报类似,我很久以前就停止使用“数据感知控件”,这开辟了这种方法。如果您需要或希望使用数据感知控件并希望使用 ADO,那么您不能直接使用 ADO,而必须找到一些通过 VCL 数据集模型公开 ADO 的封装。

于 2009-08-20T20:29:20.077 回答
0

ADO 是微软的世界

DBX 最初是为跨平台和 Kylix 创建的(Delphi 6)

于 2009-08-20T20:09:43.750 回答