一 致的 数 据 访 问 技 术 ADO/OLE DB ( 四)
潘 爱 民
五、 使 用ADO 访 问 数 据
---- 前 面 我 们 已 经 介 绍 了ADO 的 结 构 和 特 性, 也 简 单 介 绍 了 在 不 同 语 言 中 调 用ADO 对 象 的 方 法, 现 在 我 们 从 开 发 应 用 的 角 度 来 进 一 步 讲 述 如 何 利 用ADO 进 行 数 据 访 问。---- (1) 如 何 建 立 数 据 源 连 接
---- 建 立 连 接 的 核 心 是 使 用 连 接 串。 连 接 串 包 含 所 有 用 来 建 立 数 据 源 连 接 的 信 息, 它 使 用 一 系 列 格 式 为“ 参 数= 值” 的 语 句, 并 用“;” 连 接 起 来。ADO 根 据 连 接 串 建 立 连 接, 首 先 它 找 到“Provider” 参 数 信 息, 以 便 调 用 适 当 的OLE DB 提 供 者。ADO 可 以 理 解 以 下4 个 参 数 信 息:
Provider = File Name = Remote Provider= Remote Server=ADO 把 其 他 的 参 数 信 息 传 给 提 供 者, 由 提 供 者 根 据 这 些 参 数 信 息 建 立 数 据 源 连 接。
---- Connection 对 象 既 可 以 使 用ConnectionString 属 性 建 立 连 接, 也 可 以 在Open 方 法 的 参 数 中 指 定 连 接 串, 甚 至 可 以 把 二 者 结 合 起 来, 如 果 在Open 的 参 数 和ConnectionString 属 性 中 同 时 出 现 同 一 个 参 数 信 息, 则 以Open 参 数 信 息 为 准。 我 们 还 可 以 通 过Connection 对 象 的Provider 属 性 指 定OLE DB 提 供 者, 下 面 是 目 前 可 以 使 用 的 一 些“Provider” 信 息:
---- MSDASQL — — 针 对ODBC 的OLE DB 提 供 者;
---- SQLOLEDB — — 针 对SQL Server 的OLE DB 提 供 者;
---- ADsDSOObject — — 针 对Active Directory Service 的OLE DB 提 供 者;
---- MSIDXS — — 针 对Microsoft Index Server 的OLE DB 提 供 者;
---- Microsoft.Jet.OLEDB.3.51 — — 针 对Microsoft Jet 的OLE DB 提 供 者;
---- MSDAORA — — 针 对Qracle 的OLE DB 提 供 者。
---- 如 果 在Open 方 法 参 数、Connection-String 或Provider 属 性 中 都 没 有 指 定OLE DB 提 供 者, 则ADO 使 用 缺 省 的 针 对ODBC 的OLE DB 提 供 者 即“MSDASQL”。 下 面 给 出3 个 典 型 的 连 接 串 例 子:
---- 方 法1:
Dim Cn As New ADODB.Connection Cn.Open “Provider=SQLOLEDB;User ID=sa;Password=;” & “Initial Catalog=MyDataBase; Data Source=MyServer”方 法2:
Dim Cn As New ADODB.Connection Cn.ConnectionString = “Provider=SQLOLEDB;User ID=sa;Password=;”&“Initial Catalog= MyDataBase;Data Source=MyServer” Cn.Open方 法3:
Dim Cn As New ADODB.Connection Cn.Provider = “SQLOLEDB” Cn.Properties(“User ID”).Value = “sa” Cn.Properties(“Initial Catalog”).Value =“MyDataBase” Cn.Properties(“Data Source”).Value =“MyServer” Cn.Open(2) 如 何 处 理 事 件
---- 前 面 曾 经 说 过, 使 用ADO 2.0, 我 们 可 以 在 程 序 中 处 理Connection 对 象 或 者Recordset 对 象 的 事 件, 那 么 如 何 在 程 序 中 实 现 呢 ? 利 用Visual Basic 语 言 提 供 的WithEvents 关 键 字 可 以 很 方 便 地 建 立 事 件 源 对 象 和 事 件 控 制 函 数 的 连 接 关 系。 下 面 对 此 作 一 简 单 说 明。
---- 首 先, 为 了 处 理 事 件 源 所 引 发 的 事 件, 用 WithEvents 关 键 字 声 明 对 象 类 变 量, 例 如:
---- Option Explicit
---- Dim WithEvents Cn As Connection
---- 然 后 给 出 事 件 控 制 函 数, 按 照Visual Basic 语 言 约 定, 事 件 控 制 函 数 的 函 数 名 为“ 事 件 源 名_ 事 件 名”, 例 如, 我 们 要 响 应Connection 对 象Cn 的ConnectComplete 事 件, 则 事 件 控 制 函 数 名 为Cn_ConnectComplete, 代 码 可 以 这 样 来 写:
Private Sub Cn_ConnectComplete(ByVal pError As ADODB.Error,adStatus As ADODB.EventStatusEnum, ByVal pConnection As ADODB.Connection) ...... End Sub以 后 当 建 立 连 接Cn 完 成 后,ADO 激 发ConnectionComplete 事 件, 它 自 动 调 用Cn_ConnectComplete 函 数。 (3) 执 行 查 询 的 方 法
---- 利 用ADO 执 行 查 询 的 方 法 很 多, 最 基 本 的 方 法 是 使 用Command 对 象, 也 可 以 直 接 调 用Connection 对 象 的Execute 方 法。 下 面 介 绍 使 用Command 对 象 执 行 查 询 的 方 法。
---- 首 先 建 立 数 据 源 连 接Connection 对 象, 然 后 创 建Command 对 象:
Dim cmd as New ADODB.Command cmd.CommandText =“ Select * from AuthorTable” cmd.Name = “MyCommand” cmd.ActiveConnection = Cn然 后 调 用Command 对 象 的Execute 方 法:
---- set rs = cmd.Execute
---- 或 者 通 过Connection 对 象 的 方 法:
---- set rs = cn.MyCommand
---- 我 们 也 可 以 不 用Command 对 象, 而 是 直 接 使 用Recordset 对 象, 举 例 如 下:
Dim rs as New ADODB.Recordset rs.CursorType = adOpenKeyset rs.LockType = adLockOptimistic rs.Open “AuthorTable”, cn, , , adCmdTableset甚 至 连Connection 对 象 都 可 以 不 使 用, 直 接 由Recordset 使 用 内 部 连 接, 只 需 在Open 语 句 中 给 出 必 要 的 连 接 信 息 即 可。
---- (4) 对 记 录 集 数 据 进 行 操 作
---- 对 记 录 集 数 据 进 行 各 种 移 动 或 修 改 操 作 是 应 用 程 序 访 问 数 据 最 重 要 的 任 务, 与 其 他 一 些 数 据 访 问 接 口 一 样, 这 些 操 作 集 中 在 记 录 集 对 象 和 域 对 象 的 属 性 和 方 法 调 用 上, 在ADO 对 象 模 型 中, 主 要 是Recordset 和Field 对 象 的 一 些 方 法 的 用 法。
---- 增 加 记 录 操 作:AddNew 方 法, 再 调 用Update 方 法, 如:
rs.AddNew rs!Author_id = strID rs!AuthorName = strName rs!Title = strTitle rs.Update删 除 记 录 操 作: 调 用Delete 方 法 可 以 删 除 当 前 记 录 或 者 满 足 条 件 的 一 组 记 录。 在 立 即 修 改 模 式 下, 删 除 马 上 生 效; 在 批 修 改 模 式 下,Delete 操 作 只 在 当 前 缓 冲 区 中 的 记 录 上 作 了 标 记, 只 有 当 调 用 了UpdateBatch 之 后, 记 录 才 真 正 被 删 除。 一 个 简 单 的 例 子 如 下:
rs.Filter = “Title =‘Engineer’” rs.Delete adAffectGroup ’Delete the record. rs.UpdateBatch修 改 记 录 操 作: 对 当 前 记 录 的 各 个 域 信 息 进 行 重 新 赋 值 后, 调 用Update 方 法, 如 果 要 取 消 修 改, 则 调 用CancelUpdate 方 法。 举 例 如 下:
rs!Author_id = strID rs!AuthorName = strName rs!Title = strTitle rs.Update移 动 和 遍 历 操 作:Recordset 提 供 了 各 种 方 向 的 移 动 操 作, 利 用 这 些 操 作 可 以 对 记 录 集 进 行 遍 历 处 理。 各 种 移 动 操 作 如 右 表 所 示。
---- 利 用 这 些 属 性 和 方 法, 可 以 很 灵 活 地 访 问 记 录 集, 下 面 举 例 说 明:
rs.MoveFirst Do While True strMessage = “Author:”& rs!AuthorName & vbCr & “(record”& rs.AbsolutePosition & “of”& rs.RecordCount &“)”& vbCr & vbCr & “Please enter command:”& vbCr & “[1 - next / 2 - previous /”& vbCr &“3 - set bookmark / 4 - go to bookmark]” intCommand = Val(InputBox(strMessage)) Select Case intCommand ’Move forward or backward, trapping for BOF or EOF. Case 1 rs.MoveNext If rs.EOF Then MsgBox … … rs.MoveLast End If Case 2 rs.MovePrevious If rs.BOF Then MsgBox … … rstPublishers.MoveFirst End If ’Store the bookmark of the current record. Case 3 varBookmark = rs.Bookmark ’Go to the record indicated by the stored bookmark. Case 4 If IsEmpty(varBookmark) Then MsgBox “No Bookmark set!” Else rs.Bookmark = varBookmark End If Case Else Exit Do End Select Loop( 作 者 地 址: 北 京 大 学 计 算 机 科 学 技 术 研 究 所,100871, 收 稿 日 期:1999.02)
---- 责 任 编 辑: 许 菊 芳 xu_jufang@ccw.com.cn
操 作 | 类 型 | 说 明 |
MoveFirst | 方 法 | 移 动 到 记 录 集 首 |
MoveLast | 方 法 | 移 动 到 记 录 集 尾 |
MoveNext | 方 法 | 移 动 到 下 一 条 记 录 |
MovePrevious | 方 法 | 移 动 到 上 一 条 记 录 |
Move | 方 法 | 往 前 或 往 后 移 动 数 条 记 录 |
Bookmark | 属 性 | 返 回 标 识 当 前 记 录 的 书 签 或 设 置 到 指 定 的 书 签 位 置 |
BOF | 属 性 | 若 当 前 位 置 在 首 条 记 录 之 前, 则 返 回True 否 则 为False |
EOF | 属 性 | 若 当 前 位 置 在 最 后 记 录 之 后, 则 返 回True 否 则 为False |
-