ADO实战指南

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介: 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 对象模型可以实现对数据源的查询、插入、更新和删除等操作。

创建连接对象

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

执行查询语句

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

command的对象属性

关闭连接,释放资源

rs.Close
Set rs = Nothing
conn.Close
Set conn = Nothing

关于代码中的一些问题

设置字符串连接对象

要连接到SQL Server数据库

connStr = "Provider=MSOLEDBSQL;Data Source=.;Initial Catalog=student;User ID=sa;Password=123456;"

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

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的对象模型。

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

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 对象,但它们可以实现类似的功能并提供相似的接口和方法。

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
相关文章
|
SQL 运维 监控
第七章:OCP工具简介
第七章:OCP工具简介
394 0
|
4月前
|
数据库 C# 开发者
WPF开发者必读:揭秘ADO.NET与Entity Framework数据库交互秘籍,轻松实现企业级应用!
【8月更文挑战第31天】在现代软件开发中,WPF 与数据库的交互对于构建企业级应用至关重要。本文介绍了如何利用 ADO.NET 和 Entity Framework 在 WPF 应用中访问和操作数据库。ADO.NET 是 .NET Framework 中用于访问各类数据库(如 SQL Server、MySQL 等)的类库;Entity Framework 则是一种 ORM 框架,支持面向对象的数据操作。文章通过示例展示了如何在 WPF 应用中集成这两种技术,提高开发效率。
72 0
|
SQL 存储 数据库
在Visual C++中的用ADO进行数据库编程
1. 生成应用程序框架并初始化OLE/COM库环境  创建一个标准的MFC AppWizard(exe)应用程序,然后在使用ADO数据库的InitInstance函数中初始化OLE/COM库(因为ADO库是一个COM DLL库)。
1031 0
|
SQL 存储 关系型数据库
艾伟:小巧优美的ORM框架-doodads入门指南[转载]
  关于.net下的ORM框架,大家最为耳熟的可能就是NHibernate了,当然,很多公司正在使用自己开发的ORM框架,笔者至少见过3家不同公司的ORM框架,其实都是大同小异,借助于codesmith、mygeneration等代码生成工具,自己开发一个ORM框架也不是什么难事,关键的问题是,你能不能设计出代码优美简洁、功能灵活、定制方便以及部署容易的ORM框架。
1305 0
|
SQL 安全 数据库
【快速入门ORM框架之Dapper】大牛勿进系列
原文:【快速入门ORM框架之Dapper】大牛勿进系列 前言:dapper是什么?Dapper是.NET下一个micro的ORM,它和Entity Framework或Nhibnate不同,属于轻量级的,并且是半自动的。
1543 0
|
数据库 数据安全/隐私保护 存储
|
存储 关系型数据库 数据库
|
SQL 数据库连接 API
|
SQL 关系型数据库 MySQL