Delphi 连接数据库的方式有多种,我们只讨论通过 ADO 访问 SQL Server 数据库的情形。
微软将 OLE DB 的低层级的数据库访问接口封装在对象模型中,就成了 ActiveX Data Objects,简称 ADO。ADO 以其功能丰富、简单易用成为 Windows 平台访问数据库的标准方式,不仅微软旗下的 VB 类语言(VB、VBA、VBScript)的首选,也成为 Delphi 的支柱之一。
Delphi 为数据库访问提供了 TADOXXX 类型(TADOConnection、TADOQuery、TADOCommand 等等)。如果说 ADO 是 OLE DB 的封装,那 TADOXXX 就是 ADO 的封装。TADOXXX 类型定义在 Data.Win.ADODB unit 中。下面以 TADOConnection 为例加以说明。
类型 TADOConnection 定义如下(Data.Win.ADODB.pas):
type TADOConnection = class(TCustomConnection, IUnknown, ConnectionEventsVT)privateFCommands: TList;FConnectionObject: _Connection; // holds Winapi.ADOInt._Connectionprotectedpublicpublishedend;这就是说,TADOConnection 封装了 _Connection 接口,而这个接口定义如下(Winapi.ADOInt.pas):
type _Connection = interface(Connection15)end;type Connection15 = interface(_ADO)end;由此可见,Delphi 的 TADOConnection 封装了 ADO 的 Connection 对象(接口),将对 TADOConnection 的各种调用都转发给 ADO 的 Connection 接口,进而转发给 ADO 封装的 OLE DB 底层接口。
Delphi 中其他的 TADOXXX 对象与 TADOConnection 的实现类似。
由于以上的实现机制,理论上,你可以绕过 TADOXXX 直接操作 ADO 的各种接口访问数据库。但不如使用 TADOXXX 来得方便。
Delphi 的 Data.Win.ADODB 命名空间提供了如下一些类型:
- TADOConnection
- 用来与后端的数据库建立连接,下面所有类型都是通过这个连接对象与数据库进行交互的。
- TADOCommand
- 主要用于执行更新数据库的 SQL 语句,如 INSERT、UPDATE、DELETE 等。
- TADOQuery
- 主要用于执行数据库查询的 SQL 语句,当然也可以执行数据库更新语句。
- TADOTable
- 直接对应于数据库中的表。
- TADOStoredProc
- 直接对应于数据库中的存储过程。
- TADODataSet
- 不严格地说,TADODataSet 是 TADOTable、TADOStoredProc 和 TADOQuery 的综合体,既能够直接对应于表、存储过程,也能执行 SQL 语句查询与更新数据库。
一般而言,TADOConnection 是所有数据库应用程序中都需要使用的共同类型,其他几种类型就看个人偏好了。从最低限度上来说,只需要使用 TADOConnection 和 TADOQuery 就可以了,因为 TADOQuery 既可以执行数据库查询从而返回数据集,又可以执行数据库更新,这是一个“多面手”,但 TADOCommand 可能更擅长数据库更新操作。所以,TADOQuery 负责查询数据库,TADOCommand 负责更新数据库,这样的搭配基本上就可以满足一般的数据库应用。
在讨论具体的数据库应用之前,我们先来看一个例子。
我们以前说过,OLE DB 不仅限于访问数据库,而是可以面向所有数据源。现在我们就来看看 OLE DB 如何枚举机器中的 OLE DB Providers(后面我们都将 OLE DB 的提供者称为 OLE DB Provider)。
我们构造 ADO 的连接字符串时必须要给出使用哪一个 OLE DB Provider。一般而言,我们的机器中会安装有面向不同数据源的 OLE DB Provider。但要想知道机器中到底都安装了哪些 OLE DB Provider,怎么办呢?
Delphi 的 ADODB.pas 中提供了一个全局过程 GetProviderNames,我把这个过程稍加修改,写了一个控制台应用 ListProviders。代码如下:
![]()
过程 EnumerateProviders(取自 ADODB.pas 中的 GetProviderNames)很有意思,先是创建一个 OLEDB Enumerator,然后用这个 Enumerator 去枚举机器中所安装的 OLE DB Providers,得到一个 Rowset。接下来创建一个 ADORecordsetConstruction 对象,这个对象接受一个 OLE DB 的 Rowset,构造一个 ADO Recordset 对象。接着,创建 ADODataSet 对象,以前面构造的 ADO Recordset 来初始化 ADODataSet 对象。有了 ADODataSet 对象,就可以遍历这个对象中的记录,列出各个字段了。此流程可以图示如下:
![]()
Delphi 代码很容易操作 TADODataSet,但不容易操作 OLE DB 所呈现的 IRowset 接口,但可以通过 ADORecordsetConstruction 将 OLE DB 的 IRowset 转换为 ADORecordset,并进而转换为 TADODataSet。这种编程技巧很值得学习。
ListProviders 的运行结果如下:
![]()
上图的结果只截取了一部分。有了这个应用程序,就可以随时查看机器中的 OLE DB Provider 了。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.