• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
人生之路,职业之路
读书使人充实,交谈使人机敏,写记使人精确;
“动因+兴趣”——决心-持之以恒-见效
博客园    首页    新随笔    联系   管理    订阅  订阅
(转载)一致的数据访问技术 ADO/OLE DB (二)
键集(keyset) 游标类似于动态游标, 也能够看到其他用户所做的数据修改, 但不能看到其他用户新加的记录, 也不能访问其他用户删除的记录。 ...


一 致 的 数 据 访 问 技 术 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

-

posted on 2008-02-15 12:54  FreeBird  阅读(237)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3