第 17章 VB / SQL Server应 用程序 开发 17-1 VB前端 开发概 述
17-2 客 户 端 与 SQL Server的 关联
17-3 使用 ADO控件 访问 SQL Server 数 据库
17-4 使用 ADO对 象 访问 SQL Server 数 据库
17-5 本章小 结本章主要介绍如何在 Visual Basic 6中利用 ADO开发 SQL Server 2000的数据库应用系统。要求重点掌握在
Visual Basic 6中用 ADO数据控件和 ADO对象访问、控制
SQL Server 2000数据库对象的方法,如对表、视图、存储过程等的操作和控制等。
第 17章 VB / SQL Server应 用程序 开发
17-1 VB前端 开发概 述
Visual Basic 6 是 Microsoft Visual Studio 98 的成 员 之一,Microsoft为 其提供了 与 SQLSever通信的各 种 API函 数 集及 对 象 库,提供了更好的功能和性能,因此 它越 来 越多地用作大型公司 数 据 库 和客 户 /服 务 器 应 用程序的前端 开发 工具,与 后端
(后台)的 Microsoft SQL Server相 结 合,VB能 够 提供一 种 高性能的客 户 /服 务 器方案。
使用 Visual Basic开发 SQL server数 据 库应 用程序 时,主要有以下常用编程接口可供选择,它们分别是:
l DAO( Data Access Objects,数据访问对象 ) 该对象通过 Jet数据库引擎与 ODBC
的数据源进行通信,可以读取 Access数据库 ( MDB文件 ) 中的数据,也可以从
FoxPro或 dBase等 ISAM数据库和任何 ODBC数据源中读取数据,包括 SQL Server。
l RDO( Remote Data Objects,远程数据对象 ),该对象实质就是 ODBC API的对象化,也就是将标准的 C函数包装成 Visual Basic开发工具易于调用的对象模型,它提供用代码生成和操作远程 ODBC数据库系统组件的框架 。 RDO对象模型比 DAO对象模型简单,功能比 DAO多 。
l ADO( Active Data Objects,活动数据对象 ),它改进了 DAO,RDO和各种其他数据访问接口的缺陷,或者说它是一种更加标准的接口,架起了不同数据库,文件系统和 E-mail服务器之间的公用桥梁 。
l ODBC API 。 ODBC是 OLE DB的前身,首次 对 不同 数 据 库 平台提供了 数 据的 标 准接口 。
通 过 ODBC访问数 据要求特定 数 据源有相 应 的 驱动 器。 ODBC API是 数 据源的低 级 接口,可以通 过 API Declare语 句在 Visual Basic中使用 ODBC API。 ADO是微 软 推出的新一代的 数 据 访问 技 术,它 使用 户 能 够编写应 用程序以通 过 OLEDB 提供者 访问 和操作 数 据 库 服 务 器中的 数 据。 OLEDB是一 组,组 件 对 象模型,(COM) 接口,是新的 数据 库 低 层 接口,它 封装了 ODBC的功能,并 以 统 一的方式 访问 存 储 在不同信 息源中的数据。 OLE DB是 Microsoft UDA( Universal Data Access,见图 17-1)策略的技术基础。 OLE DB 为任何数据源提供了高性能的访问,这些数据源包括关系和非关系数据库、电子邮件和文件系统、文本和图形、自定义业务对象等等。也就是说,OLE
DB 并不局限于 ISAM,Jet 甚至关系数据源,它能够处理任何类型的数据,而不考虑它们的格式和存储方法。在实际应用中,这种多样性意味着可以访问驻留在 Excel 电子数据表、文本文件、电子邮件 /目录服务甚至邮件服务器,诸如 Microsoft
Exchange 中的数据。但是,OLEDB 应用程序编程接口的目的是为各种应用程序提供最佳的功能,它并不符合简单化的要求。用户需要的 API 应该是一座连接应用程序和 OLE DB 的桥梁,这就是 ActiveX Data Objects (ADO)。
ADO的一般特征如下:
l 能够从一个查询返回多个记录集 。
l 易于使用与高级记录集缓存管理 。
l 复杂临时表类型,包括批处理和服务器方与客户机方临时表 。
l 高性能与优秀的错误捕获 。
l 灵活性一适用于现有数据库技术和所有 OLE DB数据提供者 。
l 临时表的编程控制 。
l 可复用,可改变属性的对象 。
l 同步,异步和事件驱动查询执行 。
与其它数据访问对象 ( 如 RDO和 DAO) 相比,ADO对象模型的对象更少,使用更简单 。
客 户 机 应 用程序
ADO
OLEDB
关 系 数 据
SQL Server
Jet
Oracle
DB2
ISAM DataBase
非 关 系 数 据
E-mail
Text
Directory Services
大型数 据 库
ODBC
Universal Data Access结构图 17-1
SQL Server 2000作为 Microsoft,NET企业服务器的重要组成部分,是以后台数据库的身份出现的。对于应用 SQL Server数据库系统的用户,访问和操作数据库通常是通过前端(客户端)来完成的,这就是通常所说的客户机 /服务器模式。
ADO的目的是让应用程序访问不同地点不同格式的各种数据,这是通过
OLEDB数据提供者实现的,其提供数据给数据使用者(这里中是 ADO)。通过
OLE DB访问不同数据源的要求是 OLE DB数据提供者发展的必然结果。就像公司对不同数据源发布 ODBC驱动器一样,他们也发布 OLE DB数据提供者以满足通过
OLE DB访问数据的需求。
17-3 使用 ADO控件 访问 SQL Server 数 据 库
Visual Basic 6.0具有的最新 数 据 组 件是 ADO数 据控件,ADO数 据控件可以使用 户 通 过 OLE DB 访问 本地或 远 程 数 据源 并 且把 它们与 窗体的其他控件相 结合而不需 编写 很多代 码 。其常用的 属 性 为 Recordset( 记录 集),其 实 ADO控件就是返回 数 据源提供的 记录 集。
17-3-1 ADO控件
ADO数据控件使用 O对象来建立数据约束控件和数据提供者之间的连接,并快速创建数据集,然后将数据通过数据约束控件提供给用户。其中数据约束控件可以是任何具有,数据源,属性的控件,而数据提供者可以是任何符合 OLE DB规范的数据源。 ADO数据控件的图标和添加到窗体上的形状如图 17-2所示。
17-2 客 户 端 与 SQL Server的 关联图 17-2 ADO数 据控件
Visual Basic 6.0中,可以使用 ADO数 据控件 实现 下面一些功能:
连 接一 个 本地 数 据 库 或 远 程 数 据 库 。
打 开 一 个 指定的 数 据 库 表,或定 义 — 个 基于 结构 化 查询语 言( SQL)的 查询,存 储过 程或者是 该数 据 库 中表的 视图 的 记录 集合。
将数 据字段的 数值传递给数 据 绑 定控件,可以在 这 些控件中 显 示或更改 这 些 数值 。
添加新 记录,或根据 对显 示在 绑 定的控件中的 数 据的仔何更改 来 更新一 个数 据 库 。
1,ADO数 据控件的主要 属 性
Caption属性,标题 ( 常用来显示当前记录所处的位置 ) 。
UserName属性,用来指定用户的名称,当数据库受密码保护时,需要指定该属性 。 该属性可以在 ConnectionString 中指定 。 如果同时提供了一个
ConnectionString属性以及 — 个 UserName属性,则 ConnectionString中的值将覆盖 UserName属性的值 。
ConnectionString属性,返回或设置用来建立到数据源的连接字符串 。 该属性通过传递含一系列由分号分隔的,参数 =值,语句的详细连接字符串指定 ADO数据控件的数据源,在连接字符串中包含进行一个连接所需的所有设置值,其传递的参数与驱动程序相关,如 ODBC 驱动程序允许该字符串包含驱动程序,提供者,缺省的数据库,服务器,用户名称以及密码等 。 ConnectionString属性参数参见表 17-1。
参 数 描 述
Provider 指定 数 据源的名 称 。
File Name 指定基于 数 据源的文件名 称 。
Remote Provider 指定在打 开 一 个 客 户 端 连 接 时 使用的 数 据源名 称 。
Remote Server 指定打 开数 据 连 接 时 使用的服 务 器的路 径 和名 称 。
表 17-1 ConnectionString属 性的 参数
l
Password属 性,在 访问 一 个 受保 护 的 数 据 库时 需要 设 置 Password属 性。 与 Provider属 性和
UserName属 性 类 似,如果在 ConnectionString属 性中指定了密 码,则将 覆盖在 这个属 性中指定的 值 。
l RecordSource属 性,返回或 设 置 ADO控件的 记录 源,用于 决 定 从数 据 库检 索的信息。其 设置 值 可以是 数 据 库 表名,也可以是有效的 SQL语 句,如 SELECT * FROM 学 生 WHERE (性别 = '男 ')
l Mode属 性,决 定用 记录 集 进 行的操作。
l CommandType属 性,用以确定 Source属 性是 SQL语 句、一 个 表名、一 个 存 储过 程,还 是一个 未知的 类 型。
l CursonLocation属 性,指定光 标 的位置,是位于客 户 机上 还 是位于服 务 器上。
l ConnectionTimeout属 性,设 置等待建立一 个连 接的 时间,以秒 为单 位。如果 连 接超 时,则返回一 个错误 。
l MaxRecord属 性,决 定光 标 的大小。如何 决 定 这个属 性的 值 取 决 于所 检 索的 记录 的大小,
以及 计 算机可用 资 源( 内 存)的多少。 MaxRecords属 性不能太大。
l CashSize属 性,指定 从 光 标 中可以 检 索的 记录数 。若 将 CursorLocation属 性 设为 客 户 端,
则这个属 性只能 设为 一 个较 小的 数 目 (可能 为 1).不 会 有任何不利的影 响 ;若光 标 的位置位于服 务 器,则 可以 对这个数进 行 调 整,将 其 设为 可以 查 看的行 数 。
2,ADO数 据控件的主要方法
Refresh方法,用于更新集合中的 对 象以便反映 来 自指定提供者的 对 象情 况 。在 调 用
Refresh方法之前,应该将 Command对 象的 ActiveConnection属 性 设 置 为 有效
Connection对 象,将 CommandText属 性 设 置 为 有效命令,并 且 将 CommandType属 性置 为 adCmdStoredProc。
Refresh方法的 语 法格式 为,ADODC1,Refresh
UpdateRecord方法,据此可 将约 束控件上的 当 前 内 容 写 入 数 据 库 。
UpdateControls方法,从 控件的 ADO Recordset对 象中 获 取 当 前行,并 在 绑 定到此控件的控件中 显 示相 应 的 数 据。
Close方法,主要用于 关闭 打 开 的 对 象及任何相 关对 象。使用 该 法可以 关闭 Connection
或 Recordset对 象以便 释 放所有 关联 的系 统资 源。 关闭对 象 并 非 将它从内 存中 删 除,要将对 象 从内 存中完全 删 除,可 将对 象 变 量 设 置 为 Nothing。
3,ADO数 据控件的常用事件
WillMove和 MoveComplete事件,WillMove事件在 执 行挂起操作更改 Recordset中的 当前位置前 调 用,而 MoveComplete事件在 执 行挂起操作更改 Recordset中的 当 前位置后调 用。 当执 行 ADO数 据控件自 动创 建的 记录 集的 Open,MoveNext,Move,MoveLast、
MoveFirst MovePrevious,Bookmark,AddNew,Delete,Requery以及 Resync方法 时,这两个 事件 将 被 触发 。
WillChangeField和 FieldChangeComplete事件,WillChangeField事件 发 Recordset对象中的 Field对 象的 值 被修改之前,而 FieldChangeComplete事件 则发 生在被修改之后。
一般 来说,对记录 集 执 行了 Update,Delete,CancelUpdate,UpdateBatch或
CancelBatch方法之前或之 后,这两个 事件 将 分 别 被 触发 。
WillChangeRecordset和 RecordsetChangeComplete事件,WillChangeRecordset和
RecordsetChangeComplete事件分 别发 生在 对 Recordset对 象 进 行挂起或修改操作之前和之后。
一般 来说,如果 对 Recordset对 象 执 行了 Requery,Resync,Close,Open和
Filter方法之前或之后,这两个 事件被 触发 。
InfoMessage事件,一旦 ConnectionEvent操作成功完成,该 事件被 调 用 并 且由提供 者返回附加信息。
1.添加 ADO数 据控件在使用 ADO数 据控件之前,首先需要 将 ADO数 据控件添加到 当 前的工程中,其步 骤,
( 1)打 开 一 个 新的工程,将 工程的 Name属 性 设 置 为 ADODCDemo,并 且 将 工程保存为 ADODCDemo.vbp,将 系 统 默 认 的窗体的 Name属 性 设 置 为 frmADODC,将 窗体的
Caption属 性 设 置 为,使用 ADO数 据控件 实 例,,最后 将 窗体保存 为 frmadodc.frm文件。
( 2)在 Visual Basic中 选择 【 工程 】 |【 部件..,】 命令,打 开 【 部件 】 对话 框 【 部件 】 对话 框中 【 控件 】 标签 中 选 中 【 Microsoft ADO Data Control 6.0( OLE DB) 选项,如 图 17-3所示。然后 单击 【 确定 】 按 钮关闭对话 框; 当 前工程的工具箱中 会 自 动出 现 ADO数 据控件的 图标 。
2,在窗体中放置 ADO数据控件将一个 ADO数据控件添加到当前工程中以后,可以把它从工具箱中拖放到窗体上,然后将它连接到信息管理数据库 。 具体步骤如下:
( 1) 将 ADO数据控件从工具箱中拖放到窗体上,在属性窗口中将它的 Name属性设置为 Adodcxxgl。
( 2) ADO数据控件的 Align属性设置为 2-VbAlignBottom,表示将控件放置在窗体底部 。
17-3-2 ADO控件的添加 与设 置图 17-3 在当前工程中添加 ADO数据控件将 ADO数 据控件添加到窗体上以后,这时 可以 将它连 接到 SQL Server中的信息管理数 据 库 中,具体步 骤 如下:
( 1)右 键单击 ADO数 据控件,然后在 弹 出的上下文菜 单 中 选择 【 ADODC属 性 】 命令,或在 ADO数 据控件的 属 性窗口中 单击 【 自定 义 】 属 性右 边 的省略 号,系 统会 自动弹 出一 个 【 属 性 页 】 对话 框,如 图 17-4所示。
17-3-3 前后端 数 据的 连 接图 17-4 ADODC属 性 设 置 对话 框
( 2)在 【 属 性 页 】 对话 框中 单击 【 通用 】 标签,选择 【 使用 ODBC数 据源名 称 】 选项,此时 在其下面的列表中 将 出 现 一系列已 经 可以在 计 算机中使用的 ODBC数 据源名 称 。如果其中没 有所需要的 数 据源,则 可按照以下步 骤 新建 数 据源:
可 单击 窗口中的 【 新建 】 按 钮,打 开 【 创 建到 SQL Server的新 数 据源 】 对话 框,如 图 17-5
所示(或者在控制面板的管理工具中 选择数 据源( ODBC) 来创 建 )。
图 17-5 设 置新 数 据源的 属 性选 中 【 系 统数 据源 】 这个选项,单击 【 下一步 】,在 选择驱动 的窗口中,选 中 【 SQL
Server】 后,单击 【 下一步 】,然后按照 对话 框的提示,单击 【 完成 】 按 钮,进 入 【 创 建到
SQL Server的新 数 据源 】 对话 框,如 图 17-6所示。
根据窗口的提示分 别输 入 数 据源的名 称,描述及所要 连 接的 SQL Server的名 称 。 单击 【 下一步 】 按 钮,选择 按何 种 方式登 录 SQL Server,如 图 17-7所示。
图 17-6 设 置登 录验证 的方式 图 17-7 更改默 认 的 数 据 库单击 【 下一步 】 按 钮,选 中 【 更改默 认 的 数 据 库为 】 选项,在其下拉列表中 选择 所需 连 接的 数据 库 (如信息管理),单击 【 下一步 】 按 钮,如果 对 窗口中的其 它选项 无特殊 设 置,即可按
【 完成 】 按 钮,这样 便 创 建了一 个连 接到 SQL Server的 数 据源了。如 图 17-8所示。
图 17-8 完成 数 据源的 设 置
( 3)在列出的 ODBC数 据源名 称 中 选择 【 信息管理 】 选项,用鼠 标单击 【 身 份验证 】 标签,
打 开 【 身 份验证 】 页 面,如 图 17-9所示。
( 4)在 【 身 份验证 】 页 面中的用 户 名文本框中 输 入用 户 名 称,这 里 输 入 SQL Server数 据库 管理系 统 的默 认 用 户 名 称 Sa;在密 码 文本框中 输 入相 应 用 户 的密 码 。若 选择 NT集成认证 方式登 录 SQL Server,则 无 须输 入用 户 名和密 码 。
( 5)在 【 属 性 页 】 对话 框中 单击 【 记录 源 】 标签,设 置 记录 源。
( 6)在 【 命令 类 型 】 下拉式列表中,列出了 4种 可以 选择 的 数 据源命令 类,分 别为,
1— adCmdText 文本 类 型命令
2— adCmdTable 表 类 型命令
4— adCmdStoreProc 存 储过 程 类 型命令
8— adCmdUnknown 命令的 类 型未知这 里 选择 2— adCmdTable,表示 将为 ADO数 据控件 选择 一 个数 据 库 中已 经 存在的表或 视图 作 为数 据源。
图 17-9 填写 身 份认证 信息
( 7)在 【 表或存 储过 程名 称 】 下拉列表中 选择 表 【 学 生 】,如 图 17-10所示。然后 单击 【 确定 】
按 钮,关闭对话 框。
( 8)在窗体中 选 中 ADO数 据控件,在其 属 性窗口中 将 ADO数 据控件的 EOFAction属 性 设 置 为 2—
adDoAddNew,表示在 当 前 记录 是最后一 个记录并 且用 户单击 控件上的按 钮时,将 自 动 添加一 个 新的 记录 。
图 17-10 设 置 记录 源 对话 框现 在已 经将 一 个 ADO数 据控件添加到窗体上,并 且 为 ADO数 据控件 创 建了一 个数 据源,下面介 绍如何使用 约 束控件 将数 据 库 中的 数 据 显 示出 来 。
使用 约 束控件 来显 示 数 据 库 中的 数 据是使用 Visual Basic开发数 据 库应 用程序最常用的方式。在
Visual Basic6,0中,任何具有 DataSource属 性的控件都可以 绑 定到一 个 ADO数 据控件上作 为约 束控件。例如 Visual Basic的 内 部控件中,可以 绑 定 ADO数 据控件的主要如表 17-2所示。
控件 中文名 控件 中文名 控件 中文名
CheckBox 复选 框控件 ComboBox 组 合框控件 Listbox 列表框控件
Image 图 像控件 Label 标签 控件 PictureBox 图 片框控件
TextBox 文本框控件另外,在 Visual Basic的所有版本中都提供一些 ActiveX控件,它们也能够绑定到 ADO数据控件中,
这些控件主要如表 17-3所示。
表 17-2 可以 绑 定 ADO数 据控件的主要控件表 17-3 可以 绑 定 ADO数 据控件的主要 ActiveX控件控件 中文名 控件 中文名
DataList 数 据列表控件 DataCombo 数 据 组 合框控件
DataGrid 数 据 网 格控件 RichTextBox RTF文本控件
DateTjmePicker 日期 选择 控件 MonthView 月 份浏览 控件
Microsoft Chart 图 表控件 ImageCombo 图 像 组 合框控件
Microsoft Hierarechical FlexGrid 分 层 式 网 格控件
17-3-4 数 据控件的 绑 定其中,网 格控件和 图 表控件可以 绑 定到整 个记录 集,而其他控件只能 绑 定到 记录 集的某一个 字段。下面分 别 介 绍 如何使用文本框控件,DataGrid控件 来显 示 数 据 库 中 数 据。
1.使用文本框控件 显 示 数 据 库 中的 数 据在上一 节 向窗体添加入 ADO数 据控件,然后 将该 ADO数 据控件 连 接到信息管理 数 据 库并创 建 数 据源的基 础 上,使用文本框控件作 为约 束控件 来显 示 数 据 库 中的 数 据步 骤 如下:
( 1) 在窗体上分 别 添加4 个 文本框控件和4 个 起 标签 作用的 Label控件。 这 些控件的 属 性设 置如表 17-4所示。
控件 属 性 设 置 控件 属 性 设 置
Label Name Label1 TextBox Name Text2
Caption 姓名 DataSource Adodcxxgl
Label Name Labe2 DataField 性 别
Caption 性 别 TextBox Name Text3
Label Name Label3 DataSource Adodcxxgl
Caption 出生日期 DataField 出生日期
Label Name Label4 TextBox Name Text4
Caption 校名 DataSource Adodcxxgl
TextBox Name Text1 DataField 校名
DataSource Adodcxxgl
DataField 姓名图 17-13 使用文本框控件 显 示 数 据
( 2) 将 下面的代 码 添加到 frmadodc窗体的代 码 窗口中,具体代 码 如下:
Private Sub Adodcxxgl_MoveComplete (ByVal adReason As ADODB.EventReasonEnum,_
ByVal pError As ADODB.Error,adStatus As ADODB.EventStatusEnum,_
ByVal pRecordset As ADODB.Recordset)
Adodcxxgl.Caption = "学 生基本情 况," + Str(Adodcxxgl.Recordset,_
AbsolutePosition) + "/" + Str(Adodcxxgl.Recordset.RecordCount)
End Sub
这些代码主要用来显示记录集中有几个记录以及当前记录在记录集中是第几个记录。保存前面所做的工作以后,按 F5键运行应用程序,出现如图 17-13所示的界面。
在 这个 窗体中,可以通 过单击 ADO数 据控件 两 端的箭 头 按 钮来实现对数 据 库 中 数 据的 浏览 。
也可以修改 数 据 库 中的 记录值,还 可以向 数 据 库 中添加 数 据。
2.使用 DataGrid控件 显 示 数 据 库 中的 数 据
DataGrid控件就是 数 据 网 格控件,可以 将它 作 为约 束控件,这样 可以同 时浏览 或修改多 个记录 的数 据。另外,DataGrid控件也可以用于 输 人大批量的 数 据。
假 设现 在已 经 在一 个 窗体上添加了一 个 ADO数 据控件,并 且通 过该 控件 与 SQL Server中的信息管理 数 据 库 相 关联 。 下面使用 DataGrid控件 来显 示,学 生,表中的 数 据。
1)添加 DataGrid控件由于 DataGrid控件是一个 Activex控件,因此在使用该控件之前,首先要将它添加到当前工程中。
添加 DataGrid控件的具体步骤如下:
( 1) 在 Visua Basic中选择 【 工程 】 |【 部件 … 】 命令,打开 【 部件 】 对话框。
( 2) 在 【 部件 】 对话框的列表中选中 Microsoft DataGrid Control 6,0,然后单击 【 确定 】 按钮关闭对话框,DataGrid控件将自动被添加到工具箱中 。 用鼠标在工具箱中双击 DataGrid图标,
DataGrid
控件就会出现在窗体上,用鼠标拖动 DataGrid控件,使它变成所需大小 。
2) 将 DataGrid控件连接到 ADO数据控件将一个 DataGrid控件放置到窗体上以后,如果按 F5键立即运行应用程序,这时 DataGrid控件中什么内容也没有,因此,需要将 DataGrid控件与 ADO数据控件相连接 。 将一个 DataGrid控件绑定到 ADO
数据控件的具体步骤如下:
( 1) 用鼠标单击窗体上的 DataGrid控件,然后将它的 Name属性设置为 DataGridxxgl,表示用它来显示信息管理数据库中的数据 。
( 2) 单击属性窗口中的 DataSource属性,然后从其右边的下拉式列表中选择刚才创建的 ADODC
控件 Adodcxxgl。 一旦指定了 DataGrid控件的 DataSource属性,DataGrid控件将自动根据它的字段和记录数设置自己的属性 。 按 F5键运行应用程序,,学生,表中的数据就会显示在 DataGrid控件中,
如图一般情 况 下,DataGrid控件的默 认设 置 并 不是最合适的,因此可以在 Visual Basic中 对该 控件进 行手工 设 置。
17-14 使用 DataGrid控件 显 示 数 据在 ADO对 象模型中,Connection,Recordset和 Command对 象是三 个 主要的 对 象。
Connection对 象表示 对远 程 数 据源的 连 接,还 可以用 来 控制事 务 范 围,Connection对 象可 与
Recordset对 象或者 Command对 象 关联 。
Recordset对 象表示 从数 据源返回的 结 果集。 Recordset对 象 既 可以使用一 个 打 开 的
Connection对 象,也可以 创 建 它 自己 对 目 标数 据源的 连 接。 Recordset对 象允 许查询 和修改 数据。
Command对 象可用 来执 行命令,参数 化的 SQL语 句和返回 结 果集的 SQL查询 。像 Recordset
对 象一 样,Command对 象 既 可以是一 个 活 动 的 Connection对 象,也可以 创 建 它 自己到目 标数据源的 连 接。 Command对 象包含一 个 Parameters集合,在 这个 集合中的每一 个 Parameter对象表示 Command对 象使用的一 个参数 。在 Command对 象 执 行 参数 化的 SQL语 句的情 况 下,
每一 个 Parameter对 象表示 SQL语 句中的一 个参数 。
在 Connection对 象的下面是 Errors集合,每一 个 Error对 象包含了一 个错误 信息,该错误 是由
ADO对 象框架中的 — 个对 象 碰 到的。另外,Connection,Command,Recordset和 Field对象都有一 个 Properties集合,它 是由一 组 Property对 象 组 成的。每一 个 Property对 象都可以用于得到或者 设 置 与对 象相 关 的各 种属 性。在 图 17-13显 示了 ADO对 象 层 次的 结构 。
Connection
Command Recordset Errors
Parameters Fields Error
Parameter Field
17-4 使用 ADO对 象 访问 SQL Server 数 据 库
17-
13
ADO
对象层次图
DataGrid控件就是 数 据 网 格控件,可以 将它 作 为约 束控件,这样 可以同 时浏览 或修改多 个记录的 数 据。另外,DataGrid控件也可以用于 输 人大批量的 数 据。
假 设现 在已 经 在一 个 窗体上添加了一 个 ADO数 据控件,并 且通 过该 控件 与 SQL Server中的信息管理 数 据 库 相 关联 。下面使用 DataGrid控件 来显 示,学 生,表中的 数 据。
1)添加 DataGrid控件由于 DataGrid控件是一 个 Activex控件,因此在使用 该 控件之前,首先要 将它 添加到 当 前工程中。添加 DataGrid控件的具体步 骤 如下:
( 1) 在 Visua Basic中 选择 【 工程 】 |【 部件 … 】 命令,打 开 【 部件 】 对话 框。
( 2) 在 【 部件 】 对话 框的列表中 选 中 Microsoft DataGrid Control 6,0,然后 单击 【 确定 】
按 钮关闭对话 框,DataGrid控件 将 自 动 被添加到工具箱中。用鼠 标 在工具箱中 双击
DataGrid
图标,DataGrid控件就 会 出 现 在窗体上,用鼠 标 拖 动 DataGrid控件,使 它变 成所需大小。
2) 将 DataGrid控件 连 接到 ADO数 据控件将 一 个 DataGrid控件放置到窗体上以后,如果按 F5键 立即 运 行 应 用程序,这时 DataGrid控件中什 么内 容也 没 有,因此,需要 将 DataGrid控件 与 ADO数 据控件相 连 接。 将 一 个 DataGrid控件 绑 定到 ADO数 据控件的具体步 骤 如下:
( 1) 用鼠 标单击 窗体上的 DataGrid控件,然后 将它 的 Name属 性 设 置 为 DataGridxxgl,表示用 它来显 示信息管理 数 据 库 中的 数 据。
( 2) 单击属 性窗口中的 DataSource属 性,然后 从 其右 边 的下拉式列表中 选择刚 才 创 建的
ADODC控件 Adodcxxgl。一旦指定了 DataGrid控件的 DataSource属 性,DataGrid控件将 自动 根据 它 的字段和 记录数设 置自己的 属 性。按 F5键运 行 应 用程序,“学 生,表中的 数 据就 会显 示
2.使用 DataGrid控件 显 示 数 据 库 中的 数 据图 17-14
在 ADO对 象模型中,Connection,Recordset和 Command对 象是三 个 主要的 对 象。
Connection对 象表示 对远 程 数 据源的 连 接,还 可以用 来 控制事 务 范 围,Connection对 象可 与 Recordset对 象或者 Command对 象 关联 。
Recordset对 象表示 从数 据源返回的 结 果集。 Recordset对 象 既 可以使用一 个 打 开 的
Connection对 象,也可以 创 建 它 自己 对 目 标数 据源的 连 接。 Recordset对 象允 许查询 和修改 数 据。
Command对 象可用 来执 行命令,参数 化的 SQL语 句和返回 结 果集的 SQL查询 。像
Recordset对 象一 样,Command对 象 既 可以是一 个 活 动 的 Connection对 象,也可以 创 建它 自己到目 标数 据源的 连 接。 Command对 象包含一 个 Parameters集合,在 这个 集合中的每一 个 Parameter对 象表示 Command对 象使用的一 个参数 。在 Command对 象 执 行 参数化的 SQL语 句的情 况 下,每一 个 Parameter对 象表示 SQL语 句中的一 个参数 。
在 Connection对 象的下面是 Errors集合,每一 个 Error对 象包含了一 个错误 信息,该错误是由 ADO对 象框架中的 — 个对 象 碰 到的。另外,Connection,Command,Recordset和
Field对 象都有一 个 Properties集合,它 是由一 组 Property对 象 组 成的。每一 个 Property
对 象都可以用于得到或者 设 置 与对 象相 关 的各 种属 性。在 图 17-13显 示了 ADO对 象 层 次的 结构 。 ADO是作 为 一 个 OLE自 动 服 务 器 创 建的,这将 更易于 从 Visual Basic中 访问
ADO函 数 。使用 ODBC或者其他基于 DLL的 API时,必 须 在,bas或者,cls模 块 中手工 声 明函 数 和 参数,而使用 ADO只需要在 项 目中增加 对 ADO的引用,这 些 将 在下一 节 解 释 。 当在 Visual Basic开发环 境中增加 ADO的引用之后,就可以使用所有的 ADO对 象。
在 Visual Basic中使用 ADO所需的步 骤概 括如下:
( 1)在 Visual Basic中,添加 对 Microsoft ADO对 象 库 的引用;
( 2)使用 Connection,Command或者 Recordset对 象打 开 — 个连 接;
( 3)使用 Command或者 Recordset对 象 访问数 据:
( 4) 关闭 到 Connection,Command或者 Recordset对 象的 连 接。
17-4 使用 ADO对 象 访问 SQL Server 数 据 库
Connection
Comman
d
Records
et
Errors
Paramet
ers
Fields Error
Paramet
er
Field
ADO对 象 层 次 图在 Visual Basic中使用 ADO之前,首先必 须设 置 对 ADO类 型 库 的引用。 当 第一次 从
Microsoft Web站点中下 载 ADO支持 时 或者 当 安装了包含 ADO的某 种产 品 时,提供 对
ADO基本支持的文件 将 自 动 安装在系 统 上。具体方法是先 启动 Visual Basic,然后 选择
【 工程 】 |【 引用 … 】,则显 示 【 引用 】 对话 框,如 图 17-14所示。
在引用 对话 框中,滚动 可用的引用列表,直到看到 【 Microsoft ActiveX Data Objects
2.6 Library】 选项 ( 当 然,也可以 选择 ADO的最新版本)。 单击这个复选 框,然后 单击
OK按 钮,则将 ADO Objects Library增加到 Visual Basic的 IDE中。使用 Visual Basic的对 象 浏览 器可以看到 ADO对 象的 属 性和方法,如 图 17-15所示。
图 17-14 设 置 对 ADO Objects
2.6 Library的引用图 17-15 从对 象 浏览器中 查 看 ADO类
17-4-1 ADO对 象的引用 与设 置在 ADO的模型中,Connection对 象主要是提供 与数 据 库 的 连 接,其 它 的 两个对 象都是通 过它与数 据 库 的 连 接 来 完成操作的。 Connection 对 象代表 与数 据源 进 行的唯一 会话,它 保存 诸 如指 针类 型,连 接字符串,查询 超 时,连 接超 时 和缺省 数 据 库这样 的 连 接信息。如果是客 户 端 /
服 务 器 数 据 库 系 统,该对 象可以等价于到服 务 器的 实际网络连 接。
ADO对 象模型的 层 次 简单,因此使用 Command对 象或 Recordset对 象 时 不必生 Connection
对 象,而可以指定 连 接字符串,让它 在 调 用 Open或 Excute方法 时处 理 与数 据源的 连 接。但是,
如果要多次使用 — 个连 接或利用 connect对 象的事 务 性功能,则 最好生成一 个连 接而不是每次打 开 新 连 接。
打 开连 接 实际 上很 简单,只要指定 连 接字符串 并调 用 open方法。
【 例 17-1】 建立一 个 到 数 据 库,信息管理,的 连 接。
Dim cn As New ADODB.Connection
cn.ConnectionString="PROVIDER=SQLOLEDB.1;User ID=userid; PWD=password; "&_
" Initial Catalog=信息管理 ;Data Source={local} "
cn.Open
Connection对 象的 属 性和方法同 ADO数 据控件的 属 性和方法 类 似,下面 简单 介 绍 。
17-4-2 使用 Connection对 象
1.常用 属 性和方法
Connection对 象的主要 属 性或方法如表 17-6所示。
表 17-6中 Execute常用的 语 法格式 为,
RecordSet1=cn.Execute CommandText,RecordsAffected,Option
CommandText可以 为 以下的几 种 形式(主要由 Option的 值来决 定):
SQL语 句(此 时 Option的 值为 adCmdText,表示 将执 行一段 SQL语 句。)
数 据 库 表名(此 时 Option的 值为 adCmdTable,表示 将对该 表 进 行操作。)
存 储过 程名字(此 时 Option取 值为 adCmdStoredProc,表示 将 要 执 行一 个 SQL上定 义 的存 储过程。)
属 性或方法 说 明
ActiveConnection属 性 设 置到 连 接到 数 据源的 连 接 参数 信息 ( 见 表 17-7) 。
Provider属 性 设 置或返回一 个 字符串,指定 Connection对 象的 数 据提供者 。
ConnectionTimeout属 性 设 置等待建立一 个连 接的 时间 。
CursorLocation属 性 指定光 标 的位置 ( adUseServer-服 务 器端:默 认,adUseClient-客 户 端 ) 。
DefaultDatabase属 性 设 置返回一 个 字符串,以指定 连 接的默 认数 据 库 。
Mode 属 性 指示用于更改 Connection对 象中 数 据的可用 权 限 。
Open方法 建立到 数 据源的物理 连 接 。
Cancel方法 取消 Open或 Execute方法的 调 用 。
Close方法 关闭 打 开 的 Connection对 象 。
Execute方法 对连 接 执 行各 种 ( 查询,SQL语 句或存 储过 程等 ) 操作 。
注,BeginTrans/CommitTrans/ RollbackTrans方法 与 Attributes 属 性管理打 开 的 连 接上的事 务 。
表 17-6 Connection对 象的主要 属 性或方法关键 字 描 述
Provider 指定 将 要使用的 OLE DB提供者的名 称 。
Server( 或 Data Source) 一 个 已 经 存在的 SQLServer服 务 器名 称
UID( 或 User ID) SQLServer的登 录帐号 (用 户 名 )
PWD( Password) 与该 登 录帐号 相 关 的口令
Database( Initial Catalog) SQLServer的目 标数 据 库 名 称表 17-7 Connection对 象 ConnectionString属 性的 连 接 参数
Provider参数 指定 连 接 SQL Server的 OLE DB数 据的 两种 提供者:
Microsoft OLE DB Provider for ODBC( MSDASQL)
这种 方式通 过 DSN同 现 有 SQL Server ODBC驱动 器 连 接,是 Connection对 象使用的缺省 数据提供者。使用 这个数 据提供者 时,ConnectionString属 性支持有效 DSN。使用 ODBC数 据提供者的 标 准 连 接字符串如下( 详细 的 参数 如表 17-8所示):
Provider=MSDASQL;DSN=dsn;UID=userid;PWD=password;
关键 字 描 述
Provider Microsoft OLE DB Provider for ODBC( MSDASQL)
DSN ODBC数 据源名 称
UID( User ID) 用于 数 据源的登 录帐号 ID
PWD( Password) 与该 登 录帐号 ID相 关 的口令
Microsoft OLE DB Provider for SQL Server( SQLOLEDB)
这种 方式越 过 ODBC驱动 器,可以直接 访问数 据源。 将连 接字符串的 Provider参数设 置 为
SQLOLEDB,就可以使用 这个数 据提供者。典型 连 接字符串如下( 详细 的 参数 如表 17-9所示):
Provider=SQLOLEDB.1;Data Source= (local);User ID=uid; Initial
Catalog=databasename
表 17-8 OLE DB Provider for ODBC连 接字符串 参数关键 字 描 述
Provider Microsoft OLE DB Provider for SQL Server
( SQLOLEDB)
DRIVER 一 个 已 经 存在的 ODBC驱动 程序的名 称
SERVER ( Data Source ) 一 个 已 经 存在的 SQLServer系 统 的名 称
UID( User ID) 用于 数 据源的登 录帐号 ID
PWD( Password) 与该 登 录帐号 ID相 关 的口令
DATABASE ( Initial
Catalog)
SQL Server的目 标数 据 库 名 称表 17-9 OLE DB Provider for SQL Server 连 接字符串 参数
2,Connection对 象的使用在 Visual Basic开发环 境中增加了 对 ADO类 型 库 的引用之后,就可以使用 ADO对 象。由于 ADO对 象不依 赖 上 层对 象,所以要使用 Connection对 象( Command对 象或者
Recordset对 象也一 样 ),通常必 须 按照如下方式定 义并创 建 Connection对 象的 实 例:
Dim cn As New ADODB.Connection
接下 来 的操作是 设 置 Connection对 象的 ConnectionString属 性,然后 调 用 Open方法打 开连 接。下面介 绍 几 种 不同的打 开连 接的方式。
( 1)使用 ODBC的 OLE DB提供者打 开 一 个连 接
ODBC的 OLE DB提供者 MSDASQL使用一 个 ODBC驱动 程序 访问 SQL Server。 这 意味着 运 行 应 用程序的系 统 要 么 必 须 有一 个 用于 SQL Server的 ODBC驱动 程序和一 个 在
ODBC 数 据源管理器中的 数 据源名字( DSN),要 么应 用程序必 须 使用一 个 无 DSN的 连接字符串。
【 例 17-1】 使用 ADO Connection对 象和 MSDASQL提供者指定一 个 已有的用于 连 接
SQL Server的 DSN。
Dim cn As New ADODB.Connection
cn.ConnectionString = "DSN=xxgldsn;UID=sa;PWD=password;"
cn.Open
( 2)使用 ODBC的 OLE DB提供者打 开 一 个 无 DSN连 接在一些情 况 下,应 用程序需要建立一 个 基于 ODBC的 连 接,并 且 它 不能依靠一 个预 配置的
DSN。 MSDASQL OLE DB提供者也支持使用无 DSN连 接。
【 例 17-2】 建立一 个 到 SQL Server的无 DSN连 接。
Dim cn As New ADODB.Connection
cn.ConnectionString="DRIVER=SQL Server;SERVER=ServerName;UID=userid;" &_
"PWD=password;DATABASE=信息管理 "
cn.Open
代 码 首先 创 建一 个 新 ADO Connection对 象 cn。接下 来为 cn的 ConnectionString属 性 赋 予 连 接字符串。因 为没 有使用 PROVIDER关键 字,所以在默 认 使用 ODBC的 MSDASQL提供者。 DRIVER
关键 字的 值 是,SQL Server”,表示使用 SQL Server ODBC驱动 程序。
除了指定 将 要使用的 ODBC驱动 程序之外,一 个 无 DSN的 ODBC连 接字符串必 须 表示 将 要使用的服 务 器和 数 据 库 。 这 些 值 由 SERVER和 DATABASE关键 字提供。最后,UID和 PWD关键 字提供必要的 SQL Server的登 录 信息。
( 3)使用 SQL Server的 OLE DB提供者打 开 一 个连 接使用 SQL Server的 OLE DB提供者非常 类 似于使用 ODBC的 OLE DB提供者。因 为 SQL Server的
OLE DB不使用 ODBC,所以 没 有必要使用一 个数 据源或者一 个 已 经 存在的 ODBC驱动 程序。然而,
必 须 指定 OLE DB 提供者的名 称 。
【 例 17-3】 使用 SQL Server的 OLE DB提供者建立一 个对 SQL Server的 连 接。
Dim cn As New ADODB.Connection
cn.ConnectionString="PROVIDER=SQLOLEDB; SERVER=ServerName;UID=userid;" &_
"PWD=password;DATABASE=信息管理 "
cn.Open
上面的代 码 首先 创 建了一 个 ADO Connection对 象 cn,然后 为 cn的 ConnectionString属 性 赋 予
OLE DB连 接字符串。 该连 接字符串使用 PROVIDER关键 字指定 SQL OLE DB提供者。 SERVER
关键 字指定 将 要 连 接的 SQL Server系 统 名 称,DATABASE关键 字确 认将 要使用的 数 据 库 。 UID
和 PWD关键 字提供了登 录 到 SQL Server所需的 认证值 。
( 4) 查 看 连 接的 状态通 过 State属 性可以 查 看 连 接的 状态,参见 例 17-6。
【 例 17-4】 建立一 显 示 连 接是否成功的 语 句段。
If cn.state=adStateOpen then
msgbox "连 接 数 据 库 成功! "
Else
msgbox "连 接失 败 ! "
End if
( 5) 终 止一 个连 接在 终 止 应 用程序之前,应该 使用 Connection对 象的的 Close方法 终 止 该数 据 库连 接。
Close方法的 语 法格式 为,cn.Close
ADO允 许 使用 Recordset或者 Command对 象 检 索 数 据。 Recordset 对 象表示的是 来 自基表或命令 执 行 结 果的 记录 集。任何 时 候,Recordset 对 象所指的 当 前 记录 均 为 集合 内 的 单个记录,通 过
Recordset 对 象可 对 几乎所有 数 据 进 行操作。
【 例 17-5】 建立一 个 到 SQL Server的无 DSN连 接。
Dim cn As New ADODB.Connection
cn.ConnectionString="DRIVER=SQL Server;SERVER=ServerName;UID=userid;" &_
"PWD=password;DATABASE=信息管理 "
cn.Open
17-4-3使用 Recordset对 象代 码 首先 创 建一 个 新 ADO Connection对 象 cn。接下 来为 cn的 ConnectionString属 性 赋 予 连 接字符串。因 为没 有使用 PROVIDER关键 字,所以在默 认 使用 ODBC的 MSDASQL提供者。
DRIVER关键 字的 值 是,SQL Server”,表示使用 SQL Server ODBC驱动 程序。
除了指定 将 要使用的 ODBC驱动 程序之外,一 个 无 DSN的 ODBC连 接字符串必 须 表示 将 要使用的 ]
服 务 器和 数 据 库 。 这 些 值 由 SERVER和 DATABASE关键 字提供。最后,UID和 PWD关键 字提供必要的 SQL Server的登 录 信息。
( 3)使用 SQL Server的 OLE DB提供者打 开 一 个连 接使用 SQL Server的 OLE DB提供者非常 类 似于使用 ODBC的 OLE DB提供者。因 为 SQL Server的
OLE DB不使用 ODBC,所以 没 有必要使用一 个数 据源或者一 个 已 经 存在的 ODBC驱动 程序。然而,
必 须 指定 OLE DB 提供者的名 称 。
【 例 17-1】 使用 SQL Server的 OLE DB提供者建立一 个对 SQL Server的 连 接。
Dim cn As New ADODB.Connection
cn.ConnectionString="PROVIDER=SQLOLEDB; SERVER=ServerName;UID=userid;" &_
"PWD=password;DATABASE=信息管理 "
cn.Open
上面的代 码 首先 创 建了一 个 ADO Connection对 象 cn,然后 为 cn的 ConnectionString属 性 赋 予
OLE DB连 接字符串。 该连 接字符串使用 PROVIDER关键 字指定 SQL OLE DB提供者。 SERVER
关键 字指定 将 要 连 接的 SQL Server系 统 名 称,DATABASE关键 字确 认将 要使用的 数 据 库 。 UID
和 PWD关键 字提供了登 录 到 SQL Server所需的 认证值 。
( 4) 查 看 连 接的 状态通 过 State属 性可以 查 看 连 接的 状态,参见 例 17-6。
【 例 17-2】 建立一 显 示 连 接是否成功的 语 句段。
If cn.state=adStateOpen then
msgbox "连 接 数 据 库 成功! "
Else
msgbox "连 接失 败 ! "
End if
( 5) 终 止一 个连 接在 终 止 应 用程序之前,应该 使用 Connection对 象的的 Close方法 终 止 该数 据 库连 接。
Close方法的 语 法格式 为,cn.Close
ADO允 许 使用 Recordset或者 Command对 象 检 索 数 据。 Recordset 对 象表示的是 来 自基表或命令 执 行 结 果的 记录 集。任何 时 候,Recordset 对 象所指的 当 前 记录 均 为 集合 内 的 单个记录,
通 过 Recordset 对 象可 对 几乎所有 数 据 进 行操作。
1.常用 属 性和方法
Recordset 对 象可支持 两类 更新:立即更新和批更新。使用立即更新,一旦 调 用 Update 方法,
对数 据的所有更改 将 被立即 写 入基本 数 据源。如果提供者支持批更新,可以使提供者 将 多 个记录 的更改存入 缓 存,然后使用 UpdateBatch 方法在 单个调 用中 将它们传 送 给数 据 库 。 这种 情 况应 用于使用 AddNew,Update 和 Delete 方法所做的更改。 Recordset对 象的主要 属 性或方法如表 17-10所示。
2.使用 Recordset对 象 检 索 数 据
( 1)打 开记录 集使用 Recordset 对 象前必 须 先定 义并 新建一 个 Recordset 对 象 实 例,如下面的代 码,
Dim rs As New ADODB.Recordset
接下 来,通 过 Open方法打 开记录 集 数 据。但必 须 先 设 置 Activeconnection和 Source属 性。
这 里有 两种 方法:
在 Open之前 对 ActiveConnection属 性 赋值 。
直接在 Open方法中指定 ActiveConnection参数 。
第一 种 方式先指定 Recordset对 象的 ActiveConnection属 性,例如下面 语 句:
rs.ActiveConnection = cn
Connection对 象,也可以打 开 一 个对 目 标数 据源的 连 接。可以用三 种 方式打 开连 接:
l 使用 现 有打 开 的 Connection对 象
l 使用 现 有打 开 的 Command对 象
l 直接 传递连 接字符串
17-4-3使用 Recordset对 象例如下列 语 句直接指定 连 接字符串:
rs,ActiveConnection ="Provider=SQLOLEDB.1;Data Source=(local);" &_
"Initial Catalog=信息管理 ;UID=sa;PWD=;"
第二 种 方式 ADO将创 建一 个内 部 连 接,即使 连 接串 与 外部的 连 接 对 象相同,它 也使用新的 连接 对 象。例如下列 语 句直接指定了 cn作 为连 接 对 象:
rs,Open "Select * From 学 生 ",cn,adOpenKeyset,adLockOptimistic,adCmdText
Recordset对 象的 Open方法常用的 写 法 为,
Recordset.Open Source,ActiveConnection,CursorType,LockType,Options
这 五 个参数 都是可 选 的,如果一些 属 性在 调 用 Open方法之前已 经设 置或者采用缺省 参数,则就可以直接 调 用不 带 任何 参数 的 Open方法,rs,Open
【 例 17-1】 使用 Recordset对 象和 ADO Connection对 象 从学 生表中 浏览数 据。
Private Sub ForwardOnlyRecordset(cn As ADODB.Connection)
Dim rs As New ADODB.Recordset
Dim s As String
rs.ActiveConnection = cn
rs.Open "Select * From 学 生 ",,,,adCmdText
s=rs,Fields("学号 ")
......
rs.Close
End Sub
( 2) 查 找和 过滤数 据
Find方法和 Filter属 性可以 寻 找 记录 集中的 数 据。 Find方法取指定的 条 件和其他可 选参数,找到匹配的第一 个记录并将 行指 针设 置 为该记录 。如果找不到 则 行指 针 放在 EOF上。
属性或方法 说 明CursorType属性 记录集的游标类型 。 Recordset对象与 ODBC类型相对应,见表 17-11。
ActiveConnection属性 设置或返回 Recordset对象所属的 Connection对象 。
Source属性 返回生成记录集的命令字符串,其值可为 SQL查询,表名或存储过程名 。
Bof属性 指示是首记录前否,若当前记录位置在记录集首记录之前,则返回 True。
Eof属性 指示是末记录后否,若当前记录位置在记录集末记录之后,则返回 True。
MaxRecords属性 可以返回的记录集的最大记录数 。 State:记录集的状态 。
EditMode属性 指定当前记录集的编辑模式 。 取值可为 adEditAdd,adEditDelete等 。
ActiveCommand属性 若记录集由 Command对象生成则返回该 Command对象,否则返回 Null。
DataSource属性 指定数据源对象 。
RecordCount属性 记录集中的行数 。
Sort属性 设置若干字段的排序 。
Filter属性 指定记录集的过滤条件 。
LockType属性 记录采用的锁定类型 。
Bookmark属性 设置 Recordset对象记录的书签 。
Open 方法 根据 ActiveConnection和 Sourcee属性打开 — 个记录集 。
Move方法 将行指引移动指定记录行 。
AddNew方法 在记录集末尾增加新记录并使其成为当前行 。
Requery方法 重新执行记录集的基础查询并更新数据 。
Cancel方法 取消异步 OPEN方法调用
Update方法 将记录集改变保存到 SQLServer中 。
CancelUpdate方法 取消任何改变并放弃调用 Update方法之前增加的任何记录 。
Close方法 关闭记录集及其与数据源的连接 。
Delete方法 删除当前记录或记录组 。
Find方法 根据某个条件找到一个记录 。
Seek方法 用索引搜索记录,目前只在 Jet数据提供者中支持 。
GetRows方法 将多个记录读取到数组中 。
GetString方法 将记录集中的数据变为字符串,不包括任何字段和记录集元数据 。
MoveFirst /MoveLast方法 将行指针移动到第一条 /最后一条记录 。
MoveNext/MovePrevious 将行指针移动到下 — 条 /上 — 条记录 。
NextRecordset方法 从返回多个结果的命令中返回下一记录集 。R sync方法用基础数据库刷新记录集数据 。 这不同于 Requery只同步数据的改变 。Save方法用 XML或 ADPG格式将记录集数据和元数据保存到文件中 。UpdateBatch方法将批处理游标中等待的改变保存 。
【 例 17-1】 要找到 学 生表中的第一 个 匹配 记录,
Private Sub KeysetRecordset2(cn As ADODB,Connection)
Dim rs As New ADODB,Recordset
rs,Open "Select * From 学 生 ",cn,adOpenKeyset,adLockReadOnly,adCmdText
rs.Find "姓名 ='黄 向 东 ' "
rs.Close
End Sub
但是,Find方法只用一 个 字段 值 。如果用多 个 字段 值调 用,则会发 生 错误 。如果有多 个 搜索 条 件,
则 要用 Filter属 性。
rs.Filter ="性 别 ='男 ' and 学 分 >300"
( 3) 关闭数 据集在 结 束 应 用程序之前,应 使用 Recordset对 象的 Close方法 关闭 任何打 开 的 Recordset对 象。下面是一 个 Close方法的示例。
rs.Close
另外,通 过设 置 Recordset对 象 为 空,也可以 关闭连 接,如下所示:
Set rs = Nothing
3.使用 Recordset对 象修改 数 据
ADO支持可修改的 Recordset对 象,它 可以使用 AddNew,update和 Delete方法修改包含在 — 个可修改的 Recordset对 象中的 数 据。 ADO还 支持使用 动态 的和 预 准 备 的 SQL语 句修改 数 据。 并 不是全部的 Recordset对 象都是可修改的,修改 Recordset对 象的能力依 赖 于 该 Recordset对 象使用的游 标类 型,以及使用的 锁 定 类 型。
( 1)在 Recordset对 象中 插 入行可使用 Recordset对 象的 AddNew和 Update方法在一 个 可修改的 ADO结 果集中增加行。
【 例 17-2】 在 学 生表中添加一 个 新的 学 生信息。
Private Sub AddDb( Cn As ADODB.Connection)
在 Recordset打 开 之前,必 须设 置在 Recordset对 象中使用的游 标类 型。缺省 为 正向游 标 。
Dim rs As New ADODB.Recordset
rs,Open "Select * From 学 生 ",cn,adOpenKeyset,adLockOptimistic,
adCmdText
rs,Addnew
rs,Fields("学号 ")="30"
rs,Fields("姓名 ")="王强 "
rs,Fields("性 别 ")="男 "
rs,Update
rs,Close
End Sub
( 2)使用 Recordset对 象修改行可以使用 Recordset对 象的 Update方法 来 修改 数 据行。
【 例 17-1】 把 学 生 黄 向 东 的 学 分修改 为 320。
Private Sub UpdateDb( cn As ADODB,Connection)
Dim rs As New ADODB.Recordset
Dim i As Integer
rs.ActiveConnection =cn
rs.CursorLocation= adUserClient
rs.Locktype=adLockBatchOptimistic
rs.CursorType = adOpenStatic
rs.Source= " Select * From 学 生 "
rs.0pen
rs.Find "姓名 =' 黄 向 东 ' "
rs.Fields("学 分 ").value=320
rs.Update
rs.Close
End Sub
这 里首先 调 用 Find方法找到,黄 向 东,的 记录,然后用 Update方法修改行 Recordset对 象。
如果要取消修改,可以 调 用 CancelUpdate方法。
( 3) 从 Recordset对 象中 删 除行
Recordset对 象的 Delete方法 删 除在可修改的 Recordset对 象中的行。
【 例 17-2】 删 除 学 生表中的所有行:
Private Sub DeleteDb(cn As ADODB,Connection)
Dim rs As New ADODB,Recordset
Dim i As Integer
rs,Open "Select * From 学 生 ",cn,adOpenKeyset,adLockOptimistic,
adCmdText
DO Until rs,EOF
rs,Delete
rs,MoveNext
Loop
rs.Close
End Sub
17-4-4使用 Command对 象
Command 对 象定 义 了 将对数 据源 执 行的指定命令,可以 从 Connection或 Record对 象中 调用命令,但 Command对 象方法 与属 性和 Parameters集合提供了更多更新 SQL Server数 据的功能。命令可以是存 储过 程或 SQL语 句,进 行 Insert,Update或 Delete标 准 数 据修改操作,也可以是返回 记录 集 数 据的 Select语 句。 Command对 象在定 义查询参数 或 执 行一 个 有输 出 参数 的存 储过 程 时 非常有用。
1.常用 属 性和方法
Command对 象的主要 属 性或方法如表 17-13所示。
属 性或方法 说 明
ActiveConnection属 性 设 置 Command对 象 连 接到 数 据源的 连 接信息 。
CommandText属 性 设 置或返回包含提供者命令的文本,可以是 SQL语 句,存 储过 程名或表名 。
CommandTimeout属 性 调 用 Execute方法后 Command对 象等待返回 错误 的秒 数 。
CommandType属 性 设 置或返回 CommandText的 类 型 。
Name属 性 表示 Command对 象名 。
Prepared属 性 指定是否保存命令的 编译 版本 。
State属 性 表示命令是打 开,关闭,连 接,执 行或 读 取 记录 。
Parameters属 性 表示一 个 命令 变 元,常用于向存 储过 程 传递数值 。
Cancel方法 取消 执 行挂起的 异 步 Excute方法的 调 用 。
CreateParameter方法用指定 属 性 创 建 与 Command相 关联 的新 Parameter对 象 。 常用的 写 法 为,
Set param=cmd,CreateParameter(name,type,direction,size,value),其中 name为参数 的引用名,type为 指定 参数 的 类 型,direction指定 参数 是 输 入 还 是 输 出,size指定 参数 的最大 长 度或最大的 值 ; value指定 参数 的 值 。
Execute方法执 行 CommandText属 性中指定的 查询,SQL语 句或存 储过 程 。 写 法 为,
command.Execute(RecordsAffected,Parameters,Options),其中,Parameters传递参数值数组,RecordsAffected返回 SQL Server命令操作影 响 的 记录数 。 Options可取若干个 CommandTypeEnum或 ExecuteOptionEnum值 。
CommandTypeEnum值 指定 Command对 象如何解 释 CommandText属 性,可以是
adCmdUnspecified(不指定命令 类 型),adCmdtable(表名),adCmdStobredProc(存储过 程名) adcmdUnknown(未知),adCmdFile(持久 记录 集),adCmdTableDirect
( SQL Sever表)或 adCmdText( 查询语 句)。
2,Command对 象的使用在使用 Command对 象之前,必 须 先定 义并 新建其 实 例,如下面的代 码,
Dim cmd As New ADODB,Command
接下 来,必 须 先 设 置 Activeconnection属 性,例如下面 语 句:
cmd.ActiveConnection = cn
然后,对 Command对 象的 CommandText属 性 赋值,并 通 过 Execute方法 执 行命令。
( 1)取 数 据尽 管可以只用 Recordset对 象取 数 据,但其功能只限于 传递参数 到存 储过 程中,不能 读 取返回值 。 Command对 象可以 将数 据返回客 户 机,对 需要 参数 的命令很有用。要用命令生成 记录 集只需要定 义 命令、指定命令 类 型 并调 用 Execute方法。
【 例 17-1】 取出 学 生表中所有的男生信息。
Private Sub CmdDb()
Dim cmd As New ADODB,Command
Dim rs As New ADODB,Recordset
cmd.ActiveConnection = cn
cmd.CommandText = "Select * From 学 生 Where 性 别 =’男 ’"
cmd.CommandType = adCmdText
Set rs = cmd,Execute
End Sub
在 这个 例子里,Recordset对 象 rs用 来 保存返回的 结 果集。
( 2) 插 入 数 据
【 例 17-2】 用 Insert语 句在 学 生表中 插 入 数 据。
Private Sub AddDb(cn As ADODB,Connection)
Dim cmd As New ADODB,Command
With cmd
,ActiveConnection = cn
,CommandText = "Insert Into 学 生 ('姓名 ','学号 ','性 别 ') " &_
" Values('章 华 ','25','女 ')"
.Execute
End With
End Sub
( 3)修改 数 据
SQL Update语 句修改表中的列。
【 例 17-1】 用 Update语 句和修改 学 生表中的全部行:
Private Sub UpdateDb(cn As ADODB,Connection)
Dim cmd As New ADODB,Command
cmd,ActiveConnection = cn
cmd,CommandText = "Update 学 生 Set 学 分 =320 Where 学号 ='25'"
cmd,Execute
End Sub
( 4) 删 除 数 据就像 Insert和 Update操作一 样,可使用 Delete语 句 从 SQL Server数 据 库 中 删 除 数 据行。
【 例 17-2】 删 除 学 生表中的所有 记录 。
Private Sub DeleteDb(cn As ADODB,Connection)
Dim cmd As New ADODB,Command
cmd,ActiveConnection = cn
cmd,CommandText = "Delete 学 生 "
cmd,Execute
End Sub
在本例中,SQL Delete语 句不使用任何 参数 。因 为该语 句 没 有包含任何 Where子句,当运 行
Execute方法 时,将 在 department表中的全部行上 执 行 Delete操作。
( 5) 执 行存 储过 程使用 ADO可以按照 与调 用 SQL语 句同 样 的方式 调 用存 储过 程。 Command对 象 调 用存 储过 程,
问号标记 表示每一 个 存 储过 程的 输 入和 输 出 参数 。
【 例 17-3】 调 用存 储过 程,sp1”。
Private Sub CallSP1(cn As ADODB,Connection)
Dim Cmd As New ADODB,Command
cmd,ActiveConnection = cn
cmd,CommandType = adCmdStoredProc
cmd,CommandText = "sp1"
cmd,Execute
End Sub
在本章里,我 们对 Visual Basic连 接 SQL Server数 据 库 作了一些 简单 的介 绍,
然后重点就使用 VB中的 ADO数 据控件和使用微 软 ADO对 象 访问 SQL Server数据 库 分 别 作了 详细 的介 绍 。
Visual Basic 6.0具有的最新 数 据 组 件是 ADO数 据控件,ADO数 据控件可以使用户 通 过 OLE DB 访问 本地或 远 程 数 据源 并 且把 它们与 窗体的其他控件相 结 合而不需 编写 很多代 码 。其常用的 属 性 为 Recordset( 记录 集),其 实 ADO控件就是返回 数 据源提供的 记录 集。 ADO控件同 样 可以 对绑 定的 数 据控件 进 行更新。
ADO对 象模型是使用 层 次 对 象框架 实现 的,但 ADO对 象模型比 数 据 访问对 象
( DAO)或者 远 程 数 据 对 象( RDO)框架更 简单 。在 ADO对 象模型中,
Connection,Recordset和 Command对 象是三 个 主要的 对 象。,Recordset对象是 ADO数 据操作的核心,它既 可以作 为 Connection对 象或 Command对 象 执 行特定方法的 结 果 数 据集,也可以 独 立于 这两个对 象而使用,由此可以看出 ADO对象在使用上的 灵 活性。利用 Command对 象直接 调 用 SQL语 句,所 执 行的操作是在 数 据 库 服 务 器中 进 行的,显 然 会 有很高的 执 行效率。特 别 是在服 务 器端 执 行 创建完成的存 储过 程,可以降低 网络 流量,另外,由于事先 进 行了 语 法分析,可以提高整体的 执 行效率。
17-5 本章小 结
1,在 Visual Basic6.0环 境中,连 接 Microsoft SQL Server 2000数 据 库 有 哪 些方法?
2,请对 ADO,RDO,DAO等几 种 常用 编 程接口 进 行比 较 。
3,在 Visual Basic6.0环 境中,如何 将 ADO数 据控件添加到 当 前的工程中?
4,在 Visual Basic6.0环 境中,如何 设 置 对 ADO类 型 库 的引用?
5,SQL Server的 OLE DB数 据提供者有 哪 些?
6,如何在 Visual Basic6.0程序中配置 SQL Server数 据 库 的 ODBC数 据源?
7,请 在 Visual Basic中 开发 一 个简单 的 学 生基本信息的管理程序,能 够维护学 生表中的 数 据。
8,请 分 别 用 RecordSet对 象和 Command对 象 编 程 实现对 成 绩 表信息的 浏览 。
9,请 在 Visual Basic中用 DataGrid控件 设计 一 个 界面,用 来显 示 学 生的所有信息。
10,请 用 Command对 象 编写 代 码执 行一 个带参数 的存 储过 程
11,请 用 ADO对 象的方法在 学 生表中添加一行 数 据后,再 删 除最后一行 数 据。
习题 十七