网易首页 > 网易号 > 正文 申请入驻

Delphi 编程 -- 访问数据库(1)

0
分享至

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.

相关推荐
热点推荐
爆大冷!马竞耻辱惨败,西蒙尼不敢相信,5.8亿欧豪阵也没用

爆大冷!马竞耻辱惨败,西蒙尼不敢相信,5.8亿欧豪阵也没用

足球狗说
2026-02-16 01:10:43
最令大龄剩女崩溃的一瞬间在什么时候?看网友的评论引起万千共鸣

最令大龄剩女崩溃的一瞬间在什么时候?看网友的评论引起万千共鸣

夜深爱杂谈
2026-01-10 22:27:12
美国永远是欧洲的孩子?慕尼黑真正的和平活动!祝朋友们新年快乐

美国永远是欧洲的孩子?慕尼黑真正的和平活动!祝朋友们新年快乐

鹰眼Defence
2026-02-16 12:13:45
烧成骨架的残骸,开始反噬电车行业,吹牛造成的恶果

烧成骨架的残骸,开始反噬电车行业,吹牛造成的恶果

柏铭锐谈
2025-10-31 16:38:05
刚刚,王毅把话挑明后,日本外务省连夜驳斥,结果连称呼都不敢提

刚刚,王毅把话挑明后,日本外务省连夜驳斥,结果连称呼都不敢提

走进事件的中心
2026-02-16 10:51:36
马科斯喊停已经迟了!即日起十几名菲律宾参议员禁止入境

马科斯喊停已经迟了!即日起十几名菲律宾参议员禁止入境

二大爷观世界
2026-02-15 23:13:53
国务院国资委点名中国电信、中国移动!

国务院国资委点名中国电信、中国移动!

通信头条
2026-02-14 19:56:17
志愿军16军:军长、政委都被开除党籍,参谋长却受到重用,为何

志愿军16军:军长、政委都被开除党籍,参谋长却受到重用,为何

红色先驱
2025-09-12 20:00:05
伊能静春晚彩排状态差,脸僵馒化医美明显,曾自曝一年花百万保养

伊能静春晚彩排状态差,脸僵馒化医美明显,曾自曝一年花百万保养

萌神木木
2026-02-15 12:17:33
婚姻里的“哄”,是最高级的浪漫

婚姻里的“哄”,是最高级的浪漫

青苹果sht
2025-12-27 05:12:18
在河北发现了《甲方乙方》的取景地

在河北发现了《甲方乙方》的取景地

阿废冷眼观察所
2026-02-09 18:24:46
全用简体字!马来西亚和新加坡都改了,为何中国的港澳台还不改?

全用简体字!马来西亚和新加坡都改了,为何中国的港澳台还不改?

钦点历史
2026-02-09 20:10:09
离队倒计时?北京首钢水货外援第1阶段场均仅9分,许利民忍无可忍

离队倒计时?北京首钢水货外援第1阶段场均仅9分,许利民忍无可忍

老叶评球
2026-02-16 09:37:28
莫斯科遭无人机袭击,泽连斯基与卢比奥对话揭示乌美严重对立

莫斯科遭无人机袭击,泽连斯基与卢比奥对话揭示乌美严重对立

近距离
2026-02-16 09:30:21
除了孙悟空,菩提祖师还有三个得意弟子,分别是:一佛一帝一妖王

除了孙悟空,菩提祖师还有三个得意弟子,分别是:一佛一帝一妖王

金宝哥讲故事
2025-12-27 09:15:08
女子专为老人提供服务,500元一次,常抱怨:他们身上全是烂疮

女子专为老人提供服务,500元一次,常抱怨:他们身上全是烂疮

刘哥谈体育
2026-02-16 04:49:02
身高1米8的小孩哥!网友调侃:再大也是个宝宝

身高1米8的小孩哥!网友调侃:再大也是个宝宝

另子维爱读史
2026-01-26 22:45:09
中国短道速滑王牌项目陨落,32年首次无缘冬奥决赛,2010夺冠巅峰

中国短道速滑王牌项目陨落,32年首次无缘冬奥决赛,2010夺冠巅峰

米修体育
2026-02-15 21:50:56
你见过的最沉得住气的人是怎样?网‬友:五分钟连超10万人的奇迹

你见过的最沉得住气的人是怎样?网‬友:五分钟连超10万人的奇迹

夜深爱杂谈
2026-01-04 23:05:06
曝某车企明知刹车有隐患仍推出:结果撞车事故马上增加

曝某车企明知刹车有隐患仍推出:结果撞车事故马上增加

沙雕小琳琳
2026-02-15 20:04:37
2026-02-16 13:43:00
娱乐督察中
娱乐督察中
独乐乐不如众乐乐
315文章数 20633关注度
往期回顾 全部

科技要闻

OpenAI拿下OpenClaw之父 承诺开源绝不动摇

头条要闻

牛弹琴:被王毅痛斥后 日本急了

头条要闻

牛弹琴:被王毅痛斥后 日本急了

体育要闻

遭针对?谷爱凌炮轰国际雪联安排

娱乐要闻

好甜蜜!郭富城随方媛回安徽过年

财经要闻

2025,中国商业十大意外,黄金只排第九

汽车要闻

叫停纯屏操作 工信部拟推车内实体操作件强制国标

态度原创

房产
数码
家居
公开课
军事航空

房产要闻

三亚新机场,又传出新消息!

数码要闻

消息称苹果平价版MacBook不采用塑料外壳,有望3月上市

家居要闻

中古雅韵 乐韵伴日常

公开课

李玫瑾:为什么性格比能力更重要?

军事要闻

慕安会美国角色逆转 中国议题"打满全场"

无障碍浏览 进入关怀版