ADO实战指南

这里写目录标题

ADO概念

ADO(ActiveX Data Objects)是一组用于访问和处理数据的组件和对象模型。它是Microsoft提供的一种数据访问技术,用于在应用程序中连接到数据库、执行查询、检索和更新数据等操作。

ADO主要对象

  1. Connection对象:用于建立与数据源的连接,并管理连接的打开和关闭。

  2. Command对象:用于执行SQL语句或存储过程,并处理查询结果。

  3. Recordset对象:用于表示从数据源中检索的结果集,可以对结果集进行浏览、修改和更新。

详细内容可参考我的另一篇博客: 数据库访问和组件技术相关概念

对象间的相互联系

  • Command对象和Recordset对象依赖于Connection对象的连接;
  • Command对象结合SQL命令可以取代Recordset对象,但远没有Recordset对象灵活、实用
  • Recordset对象它只能实现数据表内记录集操作.

对象模型示意图

ADO提供了一系列的类和对象来完成各种操作。ADO对象模型定义了可编程的分层的对象集合,它支持部件对象模型(COM)和OLEDB数据源,与其它的数据访问对象相比,包含在ADO的对象少得多,也更加容易使用。

关键代码

使用 ADO 对象模型时,先创建一个连接对象,然后使用该连接对象创建命令对象或记录集对象,在命令或记录集对象上执行相应的操作,最后关闭连接对象。通过 ADO 对象模型可以实现对数据源的查询、插入、更新和删除等操作。

创建连接对象

vbnet 复制代码
Dim conn As New ADODB.Connection
conn.ConnectionString = "Provider=SQLOLEDB;Data Source=myServerAddress;Initial Catalog=myDatabase;User ID=sa;Password=123456;"
conn.Open

执行查询语句

vbnet 复制代码
Dim cmd As New ADODB.Command
cmd.ActiveConnection = conn
cmd.CommandText = "SELECT * FROM Students"
Dim rs As ADODB.Recordset
Set rs = cmd.Execute

command的对象属性

关闭连接,释放资源

vbnet 复制代码
rs.Close
Set rs = Nothing
conn.Close
Set conn = Nothing

关于代码中的一些问题

设置字符串连接对象

要连接到SQL Server数据库

vbnet 复制代码
connStr = "Provider=MSOLEDBSQL;Data Source=.;Initial Catalog=student;User ID=sa;Password=123456;"

连接到一个Access数据库,使用Microsoft.Jet.OLEDB.4.0

vbnet 复制代码
connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\training program\student.mdb"

Provider=MSOLEDBSQL 和 Provider=Microsoft.Jet.OLEDB.4.0 都是用于指定数据库引擎的连接字符串中的 Provider 参数的值。它们对应的是不同的 OLE DB 提供程序。

Provider=MSOLEDBSQL,也称为 Microsoft OLE DB Driver for SQL Server,是用于与 Microsoft SQL Server 数据库进行通信的 OLE DB 提供程序。它是针对 SQL Server 2012 及更高版本的新型 OLE DB 提供程序。它具有更好的性能和功能支持,并与最新的 SQL Server 功能和特性保持兼容。这个提供程序适用于使用 SQL Server 2012、2014、2016、2017、2019 或 Azure SQL Database 的应用程序。

Provider=Microsoft.Jet.OLEDB.4.0 是用于访问 Microsoft Access 数据库文件(.mdb 和 .accdb 文件)的 OLE DB 提供程序。它是旧版的 OLE DB 提供程序,适用于较旧的版本的 Microsoft Access(Access 2003 及之前的版本)。

OLE DB是什么?与ADO的关系是什么?

上面提到的OLE DB 是一种通用的数据访问技术,是基于COM接口来进行数据库的访问工作,它为不同种类的数据源提供了统一接口,比如在与 SQL Server 进行交互时,OLE DB 可以被用作中间层,提供与 SQL Server 数据库的连接和数据操作。它有较高的访问速度和访问效率,但OLE DB属于底层接口,技术比较复杂,对设计人员要求较高。常见的数据库访问技术还有ODBC(Open Data Base Connectivity)、MFC ODBC(Microsoft Foundation Classes ODBC)、DAO(Data Access Object)、ADO (ActiveX Data Object)等。

其中ODBC简单易用,但访问数据库速度较慢,且ODBC的使用需要配置数据源,同时依赖于很多相应部件的支持,不利于数据库的移植。MFC ODBC的本质是ODBC,只是对ODBC API进行了封装,简化ODBC数据库开发的程序编制。DAO基于Microsoft Jet数据库引擎来访问数据库,它克服了ODBC的一些缺陷,但它仍存在着MFC DAO与Jet数据库引擎之间的兼容问题。

ADO技术是建立在OLE DB底层技术之上的高级编程接口,它对OLE DB接口进行了封装,在继承OLE DB优点的同时很大程度上简化了访问操作。使用ADO不仅与使用ODBC一样简单、方便,而且ADO具有更为强大的数据处理能力,可以处理不同类型的数据源。

使用ADO进行数据库的访问需要用到上面提到的ADO的对象模型。

执行命令时,使用连接对象来访问数据库。

vbnet 复制代码
cmd.ActiveConnection = cn

这句代码 表示将命令对象 cmd 的 ActiveConnection 属性设置为指向已经建立的数据库连接对象 cn。这意味着执行命令时,将使用该连接对象来访问数据库。

在 ADO 中,连接对象和命令对象是不同的对象类型,但是命令对象需要与连接对象关联才能够执行数据库操作。因此,在创建命令对象后,需要设置其 ActiveConnection 属性为一个有效的连接对象,即可使用该命令对象执行 SQL 语句并返回记录集。

close与nothing做了什么事?

以recordset为例来看一下

rs.Close() 是用于关闭记录集对象(ADODB.Recordset)的方法,它会释放记录集对象所占用的系统资源并将其从内存中清除,具体执行:

释放记录集缓存:当调用 rs.Close() 方法时,ADO 会释放记录集缓存,这样可以释放所占用的系统资源,并将缓存中的数据清除。

关闭相关的驱动程序和网络连接:在打开记录集时,ADO 使用 OLE DB 驱动程序建立与数据源之间的通信。通过调用 rs.Close() 方法,ADO 会关闭与数据源的网络连接,并释放相关的驱动程序资源。

清除记录集对象本身:rs.Close() 方法会将记录集对象从内存中清除,以便给其他对象或程序腾出空间。

而 rs = Nothing 则是将记录集对象变量 rs 指向 Nothing,这样做的目的是显式地释放对象并通知垃圾回收器进行内存回收,它可以帮助进一步释放资源和垃圾回收。通过将对象变量设置为 Nothing,可以确保对象所占用的内存空间被及时释放,从而避免内存泄漏和资源占用过高。

在某些情况下,尤其是在长时间运行或在循环中使用记录集对象时,如果不将对象变量设置为 Nothing,可能会导致内存泄漏或资源占用过高。通过将对象变量设置为 Nothing,可以确保该对象的内存资源被及时回收和释放,从而提高应用程序的性能和资源利用率。

因此,在关闭记录集后,将记录集对象变量 rs 设置为 Nothing 是一种良好的编程习惯,以确保资源的彻底释放和内存的有效管理。

可以将记录集对象理解为在内存中的表格,它占用系统资源。记录集对象保存了从数据库中获取的数据,并提供了对这些数据进行操作和访问的方法。

连接对象为什么也要关闭?

连接对象(ADODB.Connection)是用于与数据库建立连接并执行数据库操作的对象。连接对象不仅包含连接字符串(连接语句),还维护了与数据库服务器之间的通信和状态信息。连接对象需要在内存中保存这些信息,并且在连接期间维持与数据库的网络连接。因此,连接对象也会占用系统资源。

关闭连接是为了释放连接所占用的系统资源,并通知数据库服务器断开与客户端的连接。数据库服务器的连接数是有限的,如果不及时关闭连接,可能会导致连接池的资源耗尽,从而无法建立新的连接。

同时,关闭连接也是为了避免资源浪费。在某些情况下,数据库服务器会限制每个用户或每个应用程序可以打开的最大连接数。如果不关闭连接,那么连接将一直保持打开状态,即使不再使用。这样会占用宝贵的数据库资源,影响其他用户或应用程序的连接能力。

因此,在使用完毕后,关闭连接可以释放系统资源,避免连接数超限,以及优化数据库资源的使用。当然,关闭连接并不意味着关闭数据库的物理连接,而是断开客户端和数据库服务器之间的逻辑连接。

为什么command不需要关闭?

对于命令对象.Command),在使用完毕后通常不需要显式地调用 Close 方法进行关闭。命令对象本身并不占用像记录集(Recordset)或连接对象(Connection)那样的系统资源。

命令对象主要用于执行 SQL 语句或存储过程,并返回相应的记录集对象。当命令对象执行完成后,可以通过 Set rs = cmd.Execute 方法返回的记录集对象来获取结果集。

关闭命令对象并不是必须的,因为它不会持有数据库连接或其他重要资源。一般情况下,最重要的是关闭记录集对象和连接对象,以释放相关资源。

请注意,即使不显式关闭命令对象,它仍然会被垃圾回收器在合适的时机自动释放。但是,如果您在使用命令对象后确实想要立即释放它,可以将其设置为 Nothing,例如: Set cmd = Nothing。这样可以确保命令对象在内存中被完全清除。

总之,在大多数情况下,只需关闭和释放记录集对象和连接对象,而不需要显式关闭命令对象。

Java中用于访问和操作数据源对象的类和框架

JDBC(Java Database Connectivity):JDBC 是 Java 提供的标准 API,用于与关系型数据库进行交互。它提供了一组接口和类,用于连接数据库、执行 SQL 命令、处理结果集等操作。通过 JDBC,开发人员可以使用标准的 Java 代码来访问不同的数据库。

JPA(Java Persistence API):JPA 是一种 Java 规范,用于对象关系映射(ORM)和持久化。它定义了一套 API,使得开发人员可以将 Java 对象映射到数据库表,并通过 API 对这些对象进行操作。JPA 可以通过各种 ORM 框架实现,如 Hibernate、EclipseLink 等。

Spring JDBC:Spring JDBC 是 Spring 框架提供的模块,用于简化 JDBC 的使用。它提供了一组辅助类和模板,用于简化数据库连接、SQL 执行和结果集处理等操作。通过 Spring JDBC,开发人员可以更方便地使用 JDBC 进行数据库访问。

这些对象和框架提供了在 Java 中访问和操作数据源的功能,并与 ADO 的目标相似。虽然它们不是直接的 ADO 对象,但它们可以实现类似的功能并提供相似的接口和方法。

相关推荐
月光水岸New1 小时前
Ubuntu 中建的mysql数据库使用Navicat for MySQL连接不上
数据库·mysql·ubuntu
狄加山6751 小时前
数据库基础1
数据库
我爱松子鱼1 小时前
mysql之规则优化器RBO
数据库·mysql
chengooooooo2 小时前
苍穹外卖day8 地址上传 用户下单 订单支付
java·服务器·数据库
Rverdoser3 小时前
【SQL】多表查询案例
数据库·sql
Galeoto3 小时前
how to export a table in sqlite, and import into another
数据库·sqlite
人间打气筒(Ada)3 小时前
MySQL主从架构
服务器·数据库·mysql
leegong231113 小时前
学习PostgreSQL专家认证
数据库·学习·postgresql
喝醉酒的小白3 小时前
PostgreSQL:更新字段慢
数据库·postgresql
敲敲敲-敲代码3 小时前
【SQL实验】触发器
数据库·笔记·sql