ADO 查询(长文讲解)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观

在编程开发中,与数据库的交互是应用系统的核心功能之一。ADO 查询作为访问和操作数据库的标准化技术,为开发者提供了高效、灵活的数据管理能力。无论是构建小型工具还是大型企业级应用,掌握 ADO 查询的原理与实践技巧,都能显著提升开发效率和代码质量。本文将从基础概念到实战案例,系统讲解如何通过 ADO 查询实现数据库操作,帮助读者快速上手并深入理解这一技术。


一、什么是 ADO 查询?

ADO(ActiveX Data Objects) 是微软开发的一套用于访问和操作数据库的组件集合,它提供了统一的接口,使得开发者可以通过相同的代码逻辑,连接不同的数据库系统(如 SQL Server、MySQL、Oracle 等)。ADO 查询则专注于通过 ADO 组件执行 SQL 语句,完成数据的增删改查(CRUD)操作。

可以将 ADO 比喻为“数据库的通用翻译器”:

  • 数据库如同不同国家的图书馆,存储着数据资源;
  • ADO则是精通多国语言的图书管理员,能够将开发者的请求(如“查找某本书”)翻译成数据库能理解的指令,并返回结果。

二、ADO 查询的核心组件与工作流程

1. 核心对象与层次结构

ADO 包含三个核心对象,共同协作完成数据库操作:
| 对象 | 作用描述 |
|---------------|------------------------------------------|
| Connection | 管理与数据库的连接,如打开、关闭、提交事务等。 |
| Command | 定义并执行 SQL 语句,支持参数化查询。 |
| Recordset | 存储查询结果的内存集合,提供数据遍历功能。 |

工作流程示意图

  1. 创建 Connection 对象,建立与数据库的物理连接;
  2. 通过 Command 对象构造 SQL 查询语句;
  3. 执行查询后,将结果存入 Recordset 对象;
  4. 遍历 Recordset 获取数据或执行更新操作。

2. 连接字符串的配置

连接字符串是 ADO 查询的“通行证”,决定了与哪个数据库建立通信。其基本格式如下:

Provider=数据库提供程序; Data Source=数据库地址; Initial Catalog=数据库名; User ID=用户名; Password=密码;  

示例(连接 SQL Server)

Provider=SQLOLEDB; Data Source=localhost; Initial Catalog=MyDatabase; User ID=sa; Password=123456;  

注意:不同的数据库提供程序(如 MySQL 的 MySQL ODBC 8.0 Driver)需要对应的驱动支持,需提前安装。


三、基础查询操作:从连接到执行

1. 创建连接对象并打开数据库

以下以 VBScript 为例,演示连接 SQL Server 的步骤:

' 创建 Connection 对象  
Set conn = CreateObject("ADODB.Connection")  

' 配置连接字符串  
strConn = "Provider=SQLOLEDB; Data Source=localhost; Initial Catalog=MyDatabase; User ID=sa; Password=123456;"  

' 打开连接  
conn.Open strConn  

2. 执行简单查询(SELECT)

通过 Recordset 对象存储查询结果:

' 创建 Recordset 对象  
Set rs = CreateObject("ADODB.Recordset")  

' 定义 SQL 查询语句  
sql = "SELECT * FROM Users WHERE Age > 18"  

' 执行查询  
rs.Open sql, conn  

' 遍历结果集  
Do While Not rs.EOF  
    WScript.Echo "姓名:" & rs.Fields("Name").Value  
    rs.MoveNext  
Loop  

' 关闭资源  
rs.Close  
Set rs = Nothing  
conn.Close  
Set conn = Nothing  

3. 插入、更新与删除操作(CRUD)

插入数据(INSERT)

INSERT INTO Users (Name, Age) VALUES ('张三', 25)  

更新数据(UPDATE)

UPDATE Users SET Age = 26 WHERE Name = '张三'  

删除数据(DELETE)

DELETE FROM Users WHERE Age < 18  

技巧:执行非查询操作时,可以使用 Connection.Execute 方法直接返回影响的行数:

rowsAffected = conn.Execute("UPDATE Users SET Age = 26 WHERE Name = '张三'")  
WScript.Echo "更新了 " & rowsAffected & " 行数据"  

四、进阶技巧与常见问题处理

1. 参数化查询:防止 SQL 注入

直接拼接 SQL 字符串易引发安全漏洞。参数化查询通过预编译语句和参数绑定,既能提升性能,又能避免注入攻击。

示例(VBScript)

' 定义 SQL 语句  
sql = "INSERT INTO Users (Name, Age) VALUES (?, ?)"  

' 创建 Command 对象  
Set cmd = CreateObject("ADODB.Command")  
cmd.ActiveConnection = conn  
cmd.CommandText = sql  

' 添加参数  
cmd.Parameters.Append cmd.CreateParameter("Name", 200, 1, 50, "李四")  
cmd.Parameters.Append cmd.CreateParameter("Age", 3, 1, , 30)  

' 执行命令  
cmd.Execute  

2. 事务处理:保证数据一致性

通过事务(Transaction)可将多个操作包装为一个不可分割的单元,确保“要么全成功,要么全回滚”。

示例(VBScript)

' 开始事务  
conn.BeginTrans  

' 执行操作1  
cmd.CommandText = "UPDATE Account SET Balance = Balance - 100 WHERE Id = 1"  
cmd.Execute  

' 执行操作2  
cmd.CommandText = "UPDATE Account SET Balance = Balance + 100 WHERE Id = 2"  
cmd.Execute  

' 提交事务  
conn.CommitTrans  

3. 处理大数据量查询

当查询结果包含大量数据时,直接加载到内存可能导致性能问题。可通过以下方式优化:

  • 分页查询:使用 RecordsetPageSizeAbsolutePage 属性实现分页。
  • 游标类型选择:根据需求选择静态游标(adOpenStatic)或动态游标(adOpenDynamic)。

五、实际案例:用户管理系统

1. 需求场景

构建一个简单的用户管理系统,实现以下功能:

  • 查询年龄大于 25 岁的用户
  • 插入新用户
  • 更新用户年龄

2. 完整代码示例(VBScript)

' 初始化连接  
Set conn = CreateObject("ADODB.Connection")  
conn.Open "Provider=SQLOLEDB; Data Source=localhost; Initial Catalog=MyDatabase; User ID=sa; Password=123456;"  

' 查询操作  
Set rs = CreateObject("ADODB.Recordset")  
rs.Open "SELECT * FROM Users WHERE Age > 25", conn  

WScript.Echo "年龄大于25岁的用户:"  
Do While Not rs.EOF  
    WScript.Echo "姓名:" & rs("Name") & ",年龄:" & rs("Age")  
    rs.MoveNext  
Loop  

' 插入操作  
Set cmd = CreateObject("ADODB.Command")  
cmd.ActiveConnection = conn  
cmd.CommandText = "INSERT INTO Users (Name, Age) VALUES (?, ?)"  
cmd.Parameters.Append cmd.CreateParameter("Name", 200, 1, 50, "王五")  
cmd.Parameters.Append cmd.CreateParameter("Age", 3, 1, , 28)  
cmd.Execute  

' 更新操作  
conn.Execute "UPDATE Users SET Age = 30 WHERE Name = '王五'"  

' 清理资源  
rs.Close  
conn.Close  
Set rs = Nothing  
Set conn = Nothing  

六、性能优化与最佳实践

1. 避免全表扫描

通过添加索引或优化 SQL 语句,减少查询时间。例如:

-- 低效写法  
SELECT * FROM Orders WHERE CustomerID = 123  

-- 高效写法(添加索引)  
CREATE INDEX idx_CustomerID ON Orders (CustomerID)  

2. 减少数据库往返次数

批量操作比单条操作更高效。例如,批量插入可通过以下方式实现:

INSERT INTO Users (Name, Age) VALUES ('赵六', 22), ('孙七', 24)  

3. 及时释放资源

确保每次操作后关闭 RecordsetConnection 对象,避免内存泄漏。


结论

ADO 查询作为连接代码与数据库的桥梁,其核心在于理解组件协作、规范操作流程,并通过参数化查询、事务控制等技巧保障数据安全与性能。无论是构建个人项目还是企业级系统,掌握 ADO 查询的原理与实践方法,都能显著提升开发效率。通过本文的案例与代码示例,读者可以快速上手 ADO 查询,并逐步深入优化复杂场景下的数据库交互逻辑。

提示:随着技术发展,ADO 在现代 Web 开发中逐渐被 Entity Framework、ORM 框架等替代,但其底层原理仍值得学习,尤其在需要直接操作数据库或兼容旧系统时,掌握 ADO 查询将大有裨益。

最新发布