一 致 的 数 据 访 问 技 术 ADO/OLE DB (二)
潘 爱 民
---- (3)Recordset 对 象 Recordset 对 象 代 表 一 个 表 的 记 录 集 或 者 命 令 执 行 的 结 果, 在 记 录 集 中, 总 是 有 一 个 当 前 的 记 录。 记 录 集 是ADO 管 理 数 据 的 基 本 对 象, 所 有 的Recordset 对 象 都 按 照 行 列 方 式 的 表 状 结 构 进 行 管 理, 每 一 行 对 应 一 个 记 录(Record), 每 一 列 对 应 一 个 域(Field)。Recordset 对 象 也 通 过 游 标 对 记 录 进 行 访 问, 在ADO 中, 游 标 分 为 以 下4 种:
---- 静 态 游 标 提 供 对 数 据 集 的 一 个 静 态 拷 贝, 允 许 各 种 移 动 操 作, 包 括 前 移、 后 移 等 等, 但 其 他 用 户 所 做 的 操 作 反 映 不 出 来。 动 态 游 标 允 许 各 种 移 动 操 作, 包 括 前 移、 后 移 等 等, 并 且 其 他 用 户 所 做 的 操 作 也 可 以 直 接 反 映 出 来。
---- 前 向 游 标 允 许 各 种 前 向 移 动 操 作, 不 能 向 后 移 动, 并 且 其 他 用 户 所 做 的 操 作 也 可 以 直 接 反 映 出 来。
---- 键 集(keyset) 游 标 类 似 于 动 态 游 标, 也 能 够 看 到 其 他 用 户 所 做 的 数 据 修 改, 但 不 能 看 到 其 他 用 户 新 加 的 记 录, 也 不 能 访 问 其 他 用 户 删 除 的 记 录。
---- Recordset 对 象 的 用 法 如 下:
---- a. 利 用CursorType 属 性 设 置 游 标 类 型。
---- b. 通 过Open 方 法 打 开 记 录 集 数 据, 既 可 以 在Open 之 前 对ActiveConnection 属 性 赋 值, 指 定Recordset 对 象 使 用 连 接 对 象, 也 可 以 直 接 在Open 方 法 中 指 定 连 接 串 参 数,ADO 将 创 建 一 个 内 部 连 接, 即 使 连 接 串 与 外 部 的 连 接 对 象 相 同, 它 也 使 用 新 的 连 接 对 象。
---- c. Recordset 对 象 刚 打 开 时, 当 前 记 录 被 定 位 在 首 条 记 录, 并 且BOF 和EOF 标 志 属 性 为False, 如 果 当 前 记 录 集 为 空 记 录 集, 则BOF 和EOF 标 志 属 性 为True。
---- d. 通 过MoveFirst、MoveLast、MoveNext 和MovePrevious 方 法 可 以 对 记 录 集 的 游 标 进 行 移 动 操 作。 如 果OLE DB 提 供 者 支 持 相 关 功 能 的 话, 可 以 使 用AbsolutePosition、AbsolutePage 和Filter 属 性 对 当 前 记 录 重 新 定 位。
---- e. ADO 提 供 了 两 种 记 录 修 改 方 式: 立 即 修 改 和 批 修 改。 在 立 即 修 改 方 式 下, 一 旦 调 用Update 方 法, 则 所 有 对 数 据 的 修 改 立 即 被 写 到 底 层 的 数 据 源。 在 批 修 改 方 式 下, 可 以 对 多 条 记 录 进 行 修 改, 然 后 调 用UpdateBatch 方 法 把 所 有 的 修 改 递 交 到 底 层 数 据 源。 递 交 之 后, 可 以 用Status 属 性 检 查 数 据 冲 突。
---- Recordset 对 象 是ADO 数 据 操 作 的 核 心, 它 既 可 以 作 为Connection 对 象 或Command 对 象 执 行 特 定 方 法 的 结 果 数 据 集, 也 可 以 独 立 于 这 两 个 对 象 而 使 用, 由 此 可 以 看 出ADO 对 象 在 使 用 上 的 灵 活 性。
---- 上 面3 个 对 象 都 包 含 一 个Property 对 象 集 合 的 属 性, 通 过Property 对 象 可 使ADO 动 态 暴 露 出 底 层OLE DB 提 供 者 的 性 能。 由 于 并 不 是 所 有 的 底 层 提 供 者 都 有 同 样 的 性 能, 所 以ADO 允 许 用 户 动 态 访 问 底 层 提 供 者 的 能 力。 这 样 既 使 得ADO 很 灵 活, 又 提 供 了 很 好 的 扩 展 性。 ADO 的 其 他 集 合 对 象 及 其 元 素 对 象, 都 用 在 特 定 的 上 下 文 环 境 中, 比 如Parameter 对 象 一 定 要 与 某 个Command 对 象 相 联 系 后, 才 能 真 正 起 作 用。 而 另 外 三 个 对 象Field、Error 和Property 对 象 只 能 依 附 于 其 父 对 象, 不 能 单 独 创 建 这 些 对 象。
三、 在 多 种 语 言 中 使 用ADO
---- 以 上 介 绍 了ADO 的 对 象 模 型, 现 在 我 们 来 讨 论 如 何 在 不 同 的 语 言 环 境 中 使 用ADO 对 象。 因 为ADO 是 作 为 自 动 化 组 件 程 序 实 现 的, 所 以 我 们 可 以 在 任 何 支 持COM 和 自 动 化 特 性 的 语 言 环 境 中 使 用ADO, 比 如Visual Basic、Visual C++、ASP 和Java 等 等, 下 面 分 别 加 以 介 绍。---- 1 . 在Visual Basic 应 用 中 使 用ADO
---- Visual Basic 应 用 在 设 计 模 式 和 运 行 模 式 下 都 可 以 创 建 和 使 用 自 动 化 对 象, 在 设 计 模 式 下, 像ADO 这 样 的 对 象 库 可 以 作 为 内 部 对 象 来 使 用, 我 们 只 需 在"Project" 菜 单 下 的"References" 命 令 弹 出 的 对 话 框 中 选 中ADO 对 象 库"Microsoft ActiveX Data Objects Library", 于 是 我 们 就 可 以 在 程 序 中 直 接 声 明 或 新 建ADO 对 象, 举 例 如 下:
Dim cn as New ADODB.Connection Dim cmd as New ADODB.Command Dim rs as New ADODB.Recordset---- 可 以 看 出, 在 设 计 时 使 用ADO 对 象 非 常 方 便, 而 且Visual Basic 设 计 环 境 中 提 供 的 对 象 浏 览 器(Object Browser) 功 能 允 许 用 户 很 方 便 地 查 看ADO 对 象 的 属 性 和 方 法。
---- 我 们 也 可 以 在 运 行 时 创 建 自 动 化 对 象, 使 用Visual Basic 的CreateObject 函 数 可 以 创 建 任 意 的 自 动 化 对 象, 由 于ADO 中 只 有Connection 对 象、Command 对 象 和Recordset 对 象 可 以 被 独 立 创 建, 所 以 我 们 也 只 能 创 建 这3 种 对 象, 举 例 如 下:
Dim cn Set rs=CreateObject("ADODB.Connection ") Dim cmd Set rs=CreateObject("ADODB.Command") Dim rs Set rs=CreateObject("ADODB.Recordset")---- 不 管 是 设 计 模 式 还 是 运 行 模 式, 调 用ADO 对 象 的 属 性 和 方 法 都 非 常 简 单, 直 接 调 用 即 可。
---- 2 . 在ASP 的VBScript 中 使 用ADO
---- ADO 对 象 也 可 以 用 于HTML 和Active Server Page 的VBScript 脚 本 代 码,VBScript 脚 本 代 码 与Visual Basic 的 代 码 很 类 似, 它 们 内 嵌 在HTML 或ASP 文 件 的 特 定 标 记 对 内 部。 但VBScript 引 擎 比Visual Basic 的 设 计 环 境 或 运 行 库 在 功 能 上 还 是 要 弱 一 些, 首 先, 在VBScript 代 码 中, 没 有 与 设 计 环 境 类 似 的 用 法,VBScript 引 擎 不 能 装 入ADO 类 型 库, 所 以 不 能 使 用New 操 作 符 创 建ADO 对 象, 但 可 以 使 用CreateObject 函 数 创 建 对 象; 其 次,ADO 对 象 库 中 用 到 的 常 量 只 能 通 过 包 含 文 件 引 入, 随ADO 一 起 提 供 的Adovbs.inc 文 件 包 含 所 有ADO 常 量 的 定 义, 我 们 可 在 脚 本 代 码 中 直 接 包 含 此 文 件。
---- 因 此, 为 了 在VBScript 代 码 中 使 用ADO, 首 先 要 包 含Adovbs.inc 文 件, 然 后 使 用CreateObject 函 数 创 建ADO 对 象, 以 后 就 可 以 调 用 这 些 对 象 的 属 性 或 方 法 了。 下 面 的 例 子 显 示 了 在ASP 文 件 中 用ADO 列 出 数 据 表 中 所 有 作 者 的 姓 名 和 职 称, 代 码 如 下:
< %@ LANGUAGE = VBScript % > < HTML > < TITLE >Using ADO in a Visual Basic Script Web Page < /TITLE >< /HEAD > < LANGUAGE="VBS" > < !--#include file="adovbs.inc"-- > < CENTER > < H1 >< font size=4 >Using ADO in a Visual Basic Script Web Page< /H1 >< /font >< br >< br > < %set myConnection = CreateObject("ADODB.Connection") myConnection.Open "DSN=MySamples;UID=sa" SQLQuery = "select AuthorName, Title from AuthorDB" set rs = myConnection.Execute(SQLQuery)% > < TABLE align=center COLSPAN=8 CELLPADDING=5 BORDER=0 WIDTH=200 > < !-- BEGIN column header row -- > < TR > < TD VALIGN=TOP BGCOLOR="#800000" > < FONT STYLE="ARIAL NARROW" COLOR="#ffffff" SIZE=1 > Title ID< /FONT > < /TD > < TD ALIGN=CENTER BGCOLOR="#800000" > < FONT STYLE="ARIAL NARROW" COLOR="#ffffff" SIZE=1 > Title< /FONT > < /TD > < /TR > < !-- Get Data -- >< % do while not rs.EOF % > < TR > < TD BGcolor ="f7efde" align=center >< font style = "arial narrow" size=1 > < %=rs("AuthorName")% >< /font > < /TD > < TD BGcolor ="f7efde" align=center >< font style = "arial narrow" size=1 > < %=rs("Title") % > < /font > < /TD > < /TR > < % rs.MoveNext% > < %loop % > < !-- Next Row -- > < /TABLE > < /center > < /BODY > < /HTML >3 . 在Visual C++ 中 使 用ADO
---- 在Visual C++ 中 使 用ADO 有 多 种 方 法, 第 一 种 方 法 是 我 们 使 用CoCreateInstance 函 数 创 建ADO 对 象, 并 得 到 对 象 的IDispatch 接 口 指 针, 然 后 调 用 其Invoke 函 数, 用 这 种 方 法 需 要 我 们 自 己 处 理 参 数 和 返 回 值,ADO 提 供 了Adoid.h 和Adoint.h 头 文 件 分 别 定 义 了ADO 对 象 的CLSID 和 接 口ID; 第 二 种 方 法 是 利 用#import 编 译 指 示 符( 在Visual C++ 5.0 及 以 后 的 版 本 中 可 以 使 用), 可 以 方 便 地 使 用ADO 对 象; 第 三 种 方 法 是 利 用MFC(Microsoft Foundation Class) 库 提 供 的IDispatch 接 口 封 装 类COleDispatchDriver 创 建 和 调 用ADO 对 象。
---- 下 面 的 代 码 显 示 了 在Visual C++ 创 建 数 据 源 连 接 的 过 程:
GUID connectionCLSID; HRESULT hResult = ::CLSIDFromProgID(L"ADODB.Connection", &connectionCLSID); if (FAILED(hResult)) { ...... } IDispatch *pDispatch = NULL; hResult = CoCreateInstance(connectionCLSID, NULL, CLSCTX_SERVER, IID_IDispatch, (void **)&pDispatch); if (FAILED(hResult)) { ...... } COleDispatchDriver driver; driver.AttachDispatch(pDispatch, FALSE); TRY { BYTE parms[] =VTS_BSTR; driver.InvokeHelper(0xa, DISPATCH_METHOD, VT_EMPTY, &hResult, parms,L"Provider=SQLOLEDB; User ID=sa;Password=;" L"Initial Catalog=LEAVES; Data Source=NetTestServer"); } END_TRY driver.DetachDispatch(); ......4 . 在Java 中 使 用ADO
---- 在Java 程 序 中 可 以 引 入ADODB 类, 然 后 声 明ADO 变 量, 也 可 以 使 用new 操 作 符 创 建ADO 变 量。 下 面 的 代 码 说 明 了 如 何 在Java 中 打 开 与 数 据 源 连 接:
import msado10.*; _Connection m_conn = null; _Recordset m_rs = null; _Command m_cmd = null; void OpenConnection() { String s; Properties properties; try { properties = m_conn.getProperties(); m_conn.Open("dsn=MySamples", "sa", ""); properties = null; } catch (Exception e) { System.out.println("\nUnable to make a connection \n"); } }( 作 者 地 址: 北 京 大 学 计 算 机 科 学 技 术 研 究 所,100871, 收 稿 日 期:1999.02)
---- 责 任 编 辑: 许 菊 芳 xu_jufang@ccw.com.cn
-