动态网站设计十八般武艺——ASP篇(十六)
作者:未知 来源:chinabyte 添加时间:2006-5-21 10:27:46什 么 是 ADO 存 取 数 据 库 时 的 分 页 显 示? 如 果 你 使 用 过 目 前 众 多 网 站 上 的 电 子 公 告 板 程 序 的 话, 那 你 应 该 会 知 道 电 子 公 告 板 程 序 为 了 提 高 页 面 的 读 取 速 度, 一 般 不 会 将 所 有 的 帖 子 全 部 在 一 页 中 罗 列 出 来, 而 是 将 其 分 成 多 页 显 示, 每 页 显 示 一 定 数 目 的 帖 子 数, 譬 如 20 条。 这 就 是 数 据 库 查 询 的 分 页 显 示, 如 果 你 还 不 明 白, 去 看 看 yahoo 等 搜 索 引 擎 的 查 询 结 果 就 会 明 白 了。
那 么 究 竟 如 何 才 能 做 到 将 数 据 库 的 查 询 结 果 分 页 显 示 呢? 其 实 方 法 有 很 多, 但 主 要 有 两 种:
一、 将 数 据 库 中 所 有 符 合 查 询 条 件 的 记 录 一 次 性 的 都 读 入 recordset 中, 存 放 在 内 存 中, 然 后 通 过 ADO Recordset 对 象 所 提 供 的 几 个 专 门 支 持 分 页 处 理 的 属 性: PageSize( 页 大 小 )、 PageCount( 页 数 目 ) 以 及 AbsolutePage( 绝 对 页 ) 来 管 理 分 页 处 理。
二、 根 据 客 户 的 指 示, 每 次 分 别 从 符 合 查 询 条 件 的 记 录 中 将 规 定 数 目 的 记 录 数 读 取 出 来 并 显 示。
两 者 的 主 要 差 别 在 于 前 者 是 一 次 性 将 所 有 记 录 都 读 入 内 存 然 后 再 根 据 指 示 来 依 次 做 判 断 分 析 从 而 达 到 分 页 显 示 的 效 果, 而 后 者 是 先 根 据 指 示 做 出 判 断 并 将 规 定 数 目 的 符 合 查 询 条 件 的 记 录 读 入 内 存, 从 而 直 接 达 到 分 页 显 示 的 功 能。
我 们 可 以 很 明 显 的 感 觉 到, 当 数 据 库 中 的 记 录 数 达 到 上 万 或 更 多 时, 第 一 种 方 法 的 执 行 效 率 将 明 显 低 于 第 二 种 方 法, 因 为 当 每 一 个 客 户 查 询 页 面 时 都 要 将 所 有 符 合 条 件 的 记 录 存 放 在 服 务 器 内 存 中, 然 后 在 进 行 分 页 等 处 理, 如 果 同 时 有 超 过 100 个 的 客 户 在 线 查 询, 那 么 ASP 应 用 程 序 的 执 行 效 率 将 大 受 影 响。 但 是, 当 服 务 器 上 数 据 库 的 记 录 数 以 及 同 时 在 线 的 人 数 并 不 是 很 多 时, 两 者 在 执 行 效 率 上 是 相 差 无 几 的, 此 时 一 般 就 采 用 第 一 种 方 法, 因 为 第 一 种 方 法 的 ASP 程 序 编 写 相 对 第 二 种 方 法 要 简 单 明 了 得 多。
在 这 里 作 者 就 以 我 们 常 见 的 ASP BBS 程 序 为 例, 来 给 大 家 分 析 一 下 如 何 在 BBS 程 序 里 实 现 分 页 显 示 功 能, 由 于 我 们 一 般 使 用 的 BBS 程 序 的 数 据 库 记 录 数 和 同 时 访 问 的 人 数 都 不 会 太 多, 所 以 以 下 程 序 实 例 是 使 用 的 先 前 所 介 绍 的 第 一 种 分 页 显 示 方 法。
进 行 ADO 存 取 数 据 库 时 的 分 页 显 示, 其 实 就 是 对 Recordset 的 记 录 进 行 操 作。 所 以 我 们 首 先 必 须 了 解 Reordset 对 象 的 属 性 和 方 法:
BOF 属 性: 目 前 指 标 指 到 RecordSet 的 第 一 笔。
EOF 属 性: 目 前 指 标 指 到 RecordSet 的 最 后 一 笔。
Move 方 法: 移 动 指 标 到 RecordSet 中 的 某 一 条 记 录。
AbsolutePage 属 性: 设 定 当 前 记 录 的 位 置 是 位 于 哪 一 页 AbsolutePosition 属 性: 目 前 指 标 在 RecordSet 中 的 位 置。
PageCount 属 性: 显 示 Recordset 对 象 包 括 多 少“页” 的 数 据。
PageSize 属 性: 显 示 Recordset 对 象 每 一 页 显 示 的 记 录 数。
RecordCount 属 性: 显 示 Recordset 对 象 记 录 的 总 数。
下 面 让 我 们 来 详 细 认 识 一 下 这 些 重 要 的 属 性 和 方 法
一、 BOF 与 EOF 属 性
通 常 我 们 在 ASP 程 序 中 编 写 代 码 来 检 验 BOF 与 EOF 属 性, 从 而 得 知 目 前 指 标 所 指 向 的 RecordSet 的 位 置, 使 用 BOF 与 EOF 属 性, 可 以 得 知 一 个 Recordset 对 象 是 否 包 含 有 记 录 或 者 得 知 移 动 记 录 行 是 否 已 经 超 出 该 Recordset 对 象 的 范 围。
如: < % if not rs.eof then ... %>
< % if not (rs.bof and rs.eof) %>
若 当 前 记 录 的 位 置 是 在 一 个 Recordset 对 象 第 一 行 记 录 之 前 时, BOF 属 性 返 回 true, 反 之 则 返 回 false。
若 当 前 记 录 的 位 置 是 在 一 个 Recordset 对 象 最 后 一 行 记 录 之 后 时, EOF 属 性 返 回 true, 反 之 则 返 回 false。
BOF 与 EOF 都 为 False: 表 示 指 标 位 于 RecordSet 的 当 中。
BOF 为 True: 目 前 指 标 指 到 RecordSet 的 第 一 笔 记 录。 EOF 为 True: 目 前 指 标 指 到 RecordSet 的 最 后 一 笔 记 录。
BOF 与 EOF 都 为 True: 在 RecordSet 里 没 有 任 何 记 录。
二、 Move 方 法
您 可 以 用 Move 方 法 移 动 指 标 到 RecordSet 中 的 某 一 笔 记 录, 语 法 如 下:
rs.Move NumRecords,Start
这 里 的“rs” 为 一 个 对 象 变 量, 表 示 一 个 想 要 移 动 当 当 前 记 录 位 置 的 Recordset 对 象;“NumRecords” 是 一 个 正 负 数 运 算 式, 设 定 当 前 记 录 位 置 的 移 动 数 目;“start” 是 一 个 可 选 的 项 目, 用 来 指 定 记 录 起 始 的 标 签。
所 有 的 Recordset 对 象 都 支 持 Move 方 法, 如 果 NumRecords 参 数 大 于 零, 当 前 记 录 位 置 向 末 尾 的 方 向 移 动; 如 果 其 小 于 零, 则 当 前 记 录 位 置 向 开 头 的 方 向 移 动; 如 果 一 个 空 的 Recordset 对 象 调 用 Move 方 法, 将 会 产 生 一 个 错 误。
MoveFirst 方 法: 将 当 前 记 录 位 置 移 至 第 一 笔 记 录。
MoveLast 方 法: 将 当 前 记 录 位 置 移 至 最 后 一 笔 记 录。
MoveNext 方 法: 将 当 前 记 录 位 置 移 至 下 一 笔 记 录。 MovePrevious 方 法: 将 当 前 记 录 位 置 移 至 上 一 笔 记 录。
Move [n] 方 法: 移 动 指 标 到 第 n 笔 记 录, n 由 0 算 起。
三、 AbsolutePage 属 性
AbsolutePage 属 性 设 定 当 前 记 录 的 位 置 是 位 于 哪 一 页 的 页 数 编 号; 使 用 PageSize 属 性 将 Recordset 对 象 分 割 为 逻 辑 上 的 页 数, 每 一 页 的 记 录 数 为 PageSize( 除 了 最 后 一 页 可 能 会 有 少 于 PageSize 的 记 录 数 )。 这 里 必 须 注 意 并 不 是 所 有 的 数 据 提 供 者 都 支 持 此 项 属 性, 因 此 使 用 时 要 小 心。
与 AbsolutePosition 属 性 相 同, AbsolutePage 属 性 是 以 1 为 起 始 的, 若 当 前 记 录 为 Recordset 的 第 一 行 记 录, AbsolutePage 为 1。 可 以 设 定 AbsolutePage 属 性, 以 移 动 到 一 个 指 定 页 的 第 一 行 记 录 位 置。
四、 AbsolutePosition 属 性
若 您 需 要 确 定 目 前 指 标 在 RecordSet 中 的 位 置, 您 可 以 用 AbsolutePosition 属 性。
AbsolutePosition 属 性 的 数 值 为 目 前 指 标 相 对 於 第 一 笔 的 位 置, 由 1 算 起, 即 第 一 笔 的 AbsolutePosition 为 1。
注 意 , 在 存 取 RecordSet 时, 无 法 保 证 RecordSet 每 次 都 以 同 样 的 顺 序 出 现。
若 要 启 用 AbsolutePosition, 必 须 先 设 定 为 使 用 用 户 端 cursor( 指 针 ), asp 码 如 下:
rs2.CursorLocation = 3
五、 PageCount 属 性
使 用 PageCount 属 性, 决 定 Recordset 对 象 包 括 多 少“页” 的 数 据。 这 里 的“页” 是 数 据 记 录 的 集 合, 大 小 等 于 PageSize 属 性 的 设 定, 即 使 最 后 一 页 的 记 录 数 比 PageSize 的 值 少, 最 后 一 页 也 算 是 PageCount 的 一 页。 必 须 注 意 也 并 不 是 所 有 的 数 据 提 供 者 都 支 持 此 项 属 性。
六、 PageSize 属 性
PageSize 属 性 是 决 定 ADO 存 取 数 据 库 时 如 何 分 页 显 示 的 关 键, 使 用 它 就 可 以 决 定 多 少 记 录 组 成 一 个 逻 辑 上 的“一 页”。 设 定 并 建 立 一 个 页 的 大 小, 从 而 允 许 使 用 AbsolutePage 属 性 移 到 其 它 逻 辑 页 的 第 一 条 记 录。 PageSize 属 性 能 随 时 被 设 定。
七、 RecordCount 属 性
这 也 是 一 个 非 常 常 用 和 重 要 的 属 性, 我 们 常 用 RecordCount 属 性 来 找 出 一 个 Recordset 对 象 包 括 多 少 条 记 录。 如: < % totle=RS.RecordCount %>
在 了 解 了 Recordset 对 象 的 以 上 属 性 和 方 法 后, 我 们 来 考 虑 一 下, 如 何 运 用 它 们 来 达 到 我 们 分 页 显 示 的 目 的。 首 先, 我 们 ?p>
站内搜索