VB中数据连接方法

自 从Microsoft 公 司 推 出Visual Basic 4.0 Enterprise For Win95 后, 它 以 其 面 向对 象 和 事 件 驱 动 编 程、 强 大 的 数 据 库 引 擎 和 支 持Client/Server 体 系 软 件的 开 发 等 优 点, 越 来 越 受 到 广 大 软 件 设 计 者 的 欢 迎。 本 文 就 如 何 使用VB4 开 发Client/Server 体 系 结 构 的 应 用 程 序 作 一 些 探 讨。

一、VB4.0 数 据 库 访 问 机 制

  利 用VB4 开 发Client/Server 应 用, 首 先 应 选 定 数 据 库 访 问 模 式,VB4 提供 了4 种 访 问 数 据 库 的 方 式, 它 们 各 有 自 己 的 长 处 和 不 足。
  1. 通 过Microsoft Jet 数 据 库 引 擎 来 访 问 数 据 库

  这 种 方 式 可 用 来 访 问 任 何 具 有 开 放 式 数 据 库 接 口(ODBC) 类 型 的数 据 库、ISAM 数 据 库, 而 不 需 要 调 用API 函 数, 它 支 持 面 向 对 象 编 程,并 能 发 挥SQL Server 大 部 分 功 能。Jet 数 据 引 擎 可 访 问Jet 数 据 库、ISAM 数据 库 和 与 开 放 式 数 据 库 相 兼 容 的 数 据 库。 其 中,Jet 数 据 库 直 接 由Jet 引擎 创 建 并 操 作,Microsoft Access 和Visual Basic 使 用 同 样 的Jet 数 据 库 引擎;ISAM 数 据 库 包 括Btrieve,dBASE,Mirosoft Visual FoxPro 和Paradox 等 数 据库; 与 开 放 式 数 据 库 接 口(ODBC) 相 兼 容 的 数 据 库 包 括 遵 从ODBC 标 准的Client/Server 数 据 库, 如Microsoft SQL Server, 这 类 数 据 库 可 以 通 过Visual Basic 可 以 访 问 大 多 支 持ODBC 的 数 据 库 .

2. RDO 方 式

  RDO 方 式 可 访 问 任 何ODBC 数 据 库, 支 持 异 步 查 询, 可 控 制 访 问 结果 集 的 大 小, 通 过 存 储 过 程 管 理 多 结 果 集, 支 持 所 有SQL Server 和Oracle远 程 数 据 库 引 擎 性 能。

3. ODBC API 方 式

  通 过ODBC API 方 式 可 访 问 多 种 数 据 库 格 式,ODBC API 内 置 一 个SQL Server 数 据 库 引 擎, 但 对SQL Server 的 支 持 范 围 比VBSQL 要 小, 可 处 理 带参 数 的 存 储 过 程, 并 支 持SQL Server 6.0 服 务 器 端 光 标。

4. VBSQL 方 式

  提 供 与Microsoft SQL Server 的 直 接 连 接, 是 一 个 独 立 产 品。VBSQL 只 能访 问SQL Server, 支 持 所 有SQL Server 功 能, 并 支 持SQL Server 6.0 服 务 器 端的 光 标, 有 行 缓 冲。

  综 上 所 述, 使 用SQL Server 作 为 数 据 库 时, 最 好 使 用VBSQL; 考 虑 到应 用 程 序 适 应 性 时 最 好 用Microsoft Jet; 从 开 发 效 率 方 面 考 虑, 应 采用Microsoft Jet 和RDO 方 式; 而 当 需 发 开 发 可 访 问 服 务 端 多 种 数 据 库 的 应用 程 序 时 采 用RDO 方 式 最 好, 而 且RDO 方 式 也 是VB4 中 开 发Client/Server 结构 应 用 程 序 的 首 选 连 接 方 式。

  现 以RDO 方 式 为 例, 讲 述 用VB4 如 何 开 发Client/Server 结 构 的 应 用 程序。

二、 如 何 用RDO 方 式 开 发Client/Server 结 构 的 应 用 程 序

  用RDO 方 式 开 发Client/Server 结 构 的 应 用 程 序, 首 先 要 建 立 同 数 据 库的 物 理 连 接, 然 后 在 此 基 础 上 对 数 据 库 进 行 操 作。

1. 建 立 数 据 库 的 物 理 连 接

  下 例 可 建 立 同Microsoft SQL Server 数 据 库 的MyRemote 数 据 源 的 进 行 物 理连 接: 其 中MyRemote 是 在 控 制 面 板 中 设 立 同Microsoft SQL Server 的 连 接。

Dim En as rdoEnvironment,Cn As rdoConnection, Conn As String
Set En = rdoEnvironments(0)
Conn$ = "DSN=MyRemote ; UID = Holly ; PWD = Huskador ; DATABASE = MyDb;"
Set Cn = En.OpenConnection("",rdoDriveprompt , False ,Conn$)

  RDO 是 通 过rdoEngine 对 象 同 数 据 库 发 生 作 用 的, 而rdoEnvironments 是 应用 程 序 同 数 据 库 打 交 道 的 环 境 变 量, 包 括 用 户 名 和 口 令 等 信 息, 可用RdoCreateEnvironment 方 法 产 生。 rdoEnvironments(0) 是 该 环 境 变 量 的 缺 省值, 用 户 名 和 口 令 全 部 为""。

  rdoConnection 是 同 数 据 库 建 立 的 物 理 连 接, 用OpenConnect 方 法 产 生,其4 个 参 变 量 依 次 为 数 据 源 名 称、ODBC 驱 动 的 对 话 框 提 示、 是 否 只 读和ODBC 驱 动 管 理 器 的 参 数。ODBC 驱 动 管 理 器 的 参 数 包 括 用 户名(UID)、 口 令(PWD)、 缺 省 的 数 据 库(DATABASE) 及 数 据 源 名 称。 一旦rdoConnection 对 象 建 成 后, 即 可

  创 建rdoResultset 或rdoPreparedStatement 通 过rdoTable 和rdoColumn 对 象 对 数 据 库 中 表 和 表 中 的 列 进 行 操 作 用BeginTrans 和CommitTrans 和RollbackTrans 方 法 来 进 数 据 库 的 事 务 处 理 用Close 的 方 法 用 来 关 闭 同 来 数 据 源 的 连 接

2. 数 据 库 操 作

  从 数 据 库 中 查 询 数 据, 可 以 通 过rdoConnection 对 象 的OpenResultset 的 方法 来 实 现, 也 可 以 通 过rdoPreparedStatement 对 象 的OpenResultset 方 法 建 成 带参 数 的rdoResultset 的 方 法 实 现。

  下 例 是 通 过rdoConnection 对 象 的OpenResultset 方 法 进 行 数 据 库 查 询。

Dim MyRs As rdoResultset
Set Myrs =Cn.OpenResultset("select * from
mytable",rdOpenForwardOnly,rdConcurlock,rdasyncenable)

  这 个 例 子 是 通 过rdoPreparedStatement 对 象 的OpenResultset 方 法 建 立 数 据 库查 询

Dim myps As rdoPreparedStatement
Set myps = Cn.CreatePreparedStatement("Mypsl","")
Myps.SQL = MySQL

  设 定rdoPreparedStatement 的MaxRows 属 性 可 以 限 制 返 回 结 果 集 的 行 数,从 而 避 免 大 数 据 量 结 果 集 的 生 成。

  OpenResultset 方 法 的 语 法 如 下。
Set variable = connection.OpenResultset(source[,type[,locktype[,options]]])
Set variable = object.OpenResultset([type[,locktype[,options]]])
OpenResultset 方 法 语 法 参 数 含 义 如 下。
variable: 是 一 个rdoResultset 对 象 变 量;
connection: 是 一 个 已 创 建 的rdoConnection 对 象;
object: 用 来 创 建rdoResultset 的 已 经 存 在 的rdoPreparedStatement 或rdoTable 对象;
source: 是 一 个SQL 语 句、rdoTable 对 象 或 者rdoPreparedStatement 对 象;
type: 光 标 类 型

rdOpenForwardonly: 单 向 向 前 的 光 标( 缺 省 值);
rdOpenStatic: 静 态 光 标, 不 能 随 时 反 应 其 它 用 户 的 修 改;
rdOpenKeyset: 主 键 型 光 标, 可 以 进 行 增、 删、 改;
rdOpenDynamic: 动 态 光 标, 可 以 进 行 增、 删、 改。

locktype: 锁 定 类 型 分 为4 种

rdConcurLock: 页 锁 定 光 标;
rdConcurReadOnly: 只 读 光 标( 缺 省 值);
rdConcurrowver: 行 锁 定 光 标;
rdConcurValues: 优 化 锁 定 光 标。

options:rdAsyncEnable 是 否 支 持 异 步 查 询。

rdAsyncEnable: 如 果 选 择 这 个 选 项, 可 用rdoResultset 的StillExecuting 属 性 来检 查 数 据 查 询 是 否 有 返 回 行, 也 可 用rdoResultset。Cancel 方 法 中 断 查 询。查 询 一 旦 完 成, 就 会 触 发QueryCompleted 事 件。

rdoResultset 建 成 后, 就 可 用rdoResultset 对 象 对 数 据 进 行 修 改。 包 括 修 改特 定 行 的 某 一 列, 增 加 一 行 或 删 除 一 行。

修 改 特 定 行 的 某 一 列

Myrs.Edit
Myrs(0) = "string"
Myrs.Update

    如 果 需 要 取 消 修 改, 在 调 用Update 的 地 方 调 用CancelUpdate, 还 可以 使 用LastModified 特 性 将 光 标 移 到 刚 刚 修 改 的 列:

Myrs.Bookmark = Myrs.LastModified

增 加 一 列
Myrs.AddNew
Myrs(0) = "string"
Myrs.Update

还 可 以 使 用LastModified 特 性 将 光 标 移 刚 刚 修 改 的 列。

Myrs.Bookmark = Myrs.LastModified

删 除 指 定 行
Myrs.Delete

  在 调 用 此 方 法 前, 应 先 用Move 方 法 或AbsolutePosition 或PercentPosition 属性 将 光 标 移 到 指 定 位 置, 再 执 行 删 除。 执 行 删 除 后, 当 前 行 不 再 存在, 应 将 光 标 定 位 到 正 确 的 行 后 再 执 行 其 他 操 作。

  数 据 操 作 完 成 后 应 关 闭 相 应 的 结 果 集 及 相 应 连 接。 即:

Myrs.close
Myps.close
Cn.close
En.close

  因 篇 幅 所 限, 不 能 详 细 说 明rdoResultSet 各 方 面 的 内 容, 现将rdoResultSet 的 属 性 和 方 法 列 举 如 下, 并 配 以 简 要 说 明。

  rdoResultset 对 象 具 有 以 下 方 法。

Addnew( 增 加 新 记 录)
Cancel( 中 断 异 步 查 询)
CancelUpdate( 中 断 更 新)
Close( 关 闭)
Delete( 删 除)
Edit( 修 改 记 录)
GetRows( 获 取 指 定 行)
Item( 获 取 字 段 值)
MoreResults( 符 合 条 件 的 记 录 数 是 否 大 于 记 录 集)
MoveFirst( 记 录 移 到 第 一 条)
MoveLast( 记 录 移 到 最 后 一 条)
MoveNext( 记 录 移 到 下 一 条)
MovePrevious( 记 录 移 到 上 一 条)
ReQuery( 更 新 结 果 集)
Update( 更 新 记 录)

rdoResultset 的 属 性 如 下 所 列。

AbsolutePosition( 记 录 绝 对 位 置)
BOF( 是 否 在 结 果 集 开 头)
Bookmark( 书 签)
Bookmarkable( 是 否 支 持 书 签 功 能)
EOF( 是 否 在 结 果 集 最 后)
hStmt(rdoResultSet 的 句 柄)
LastModified( 最 后 修 改 的 记 录)
LockEdits( 锁 定 方 式)
Name( 名 字)
PercentPosition( 百 分 比 位 置)
Restartable( 是 否 支 持ReQuery 方 法)
RowCount(rdoResultSet 中 的 记 录 数)
StillExecuting( 异 步 查 询 是 否 有 结 果)
Transactions( 是 否 支 持 事 务 处 理)
Type( 类 型)
Updatable( 是 否 可 修 改)

  RDO 方 式 还 支 持 带 参 数 的 查 询: 如 果 查 询 时 需 带 多 个 参 数, 需 首先 用rdoPreparedStatement 方 法 运 行 查 询。SQL 语 法 必 须 符 合ODBC SQL 语 法结 构。

  下 例 是 调 用 带 参 数 存 储 过 程 的 例 子。

Dim CPw As rdoPreparedStatement, QSQL As String
QSQL$ = "{ ? = call sp_password (?,?) }"
Set CPw = Cn.CreatePreparedStatement("SetPassword",QSQL$)
CPw.rdoParameter(0).Direction = rdParamReturnValue
CPw.rdoParameter(1).Direction = rdParamInput
CPw.rdoParameters(2).Direction = rdParamInput
CPw.rdoParameters(1) = "clyde"
CPw.rdoParameters(2)= "framis"
CPw.Execute()
IfCPw.rdoParameters(0) <> 0 Then
Msgbox "Could not change password"
End if

  其 中sp_password 是SQL Server 上 的 一 个 存 储 过 程, 调 用 存 储 过 程 要 用{}括 起 来, 问 号 表 示 所 带 参 数, 此 程 序 是 将 用 户clyde 的 口 令 修 改成framis, 如 果CPw.rdoParameters(0) 返 回 零, 表 示 口 令 没 有 被 修 改 成 功。 第一 个 问 号 表 示 返 回 值, 其 后 为 输 入 值。

  其 他 重 要 的RDO 对 象 包 括rdoTable 和rdoColumn。rdoTable 用 于 检 查 数 据库 中 的 表 及 其 属 性, 而rdoColumn 用 于 检 查 结 果 集 中 的 列 及 其 属 性。

三、 应 用 程 序 性 能

  在VB4 上 开 发Client/Server 结 构 的 应 用 程 序, 为 提 高 应 用 程 序 的 运 行 速度, 应 注 意 以 下 几 个 方 面 的 问 题。

1. 了 解 查 询 的 内 容

  一 些SQL 查 询 比 其 他 查 询 更 有 效 . 如 在 包 含 索 引 的 字 段 上 排 序 比在 不 包 含 索 引 的 字 段 上 排 序 要 快, 应 尽 量 使 用 更 有 效 的SQL 语 句。

2. 只 请 求 需 要 的 数 据

  避 免 在 整 个 表 上 创 建 结 果 集。 应 用 程 序 应 使 用 户 能 够 输 入 条 件 并返 回 有 限 的 结 果 集, 只 选 择 需 要 的 列, 而 不 是 选 择 记 录 中 的 所 有 的列。

3. 只 使 用 需 要 的 功 能

  若 不 需 要 更 新 数 据 库, 就 以 只 读 方 式 打 开 该 数 据 库。 这 样 做 能 改善 性 能, 因 为 数 据 库 驱 动 程 序 无 需 对 锁 进 行 跟 踪。

4. 使 用 事 务

  使 用 事 务 大 约 可 以 把 磁 盘 访 问 减 少 到 每 个 事 务 一 次, 而 不 是 每 个记 录 一 次。 这 会 使 性 能 得 到 大 幅 度 改 善。 用 户 可 能 要 对 事 务 分 组, 如果 事 务 过 大, 它 就 会 使 用 其 他 操 作 需 要 的 内 存。

四、Client/Server 环 境 开 发 应 注 意 问 题

  首 先,Client/Server 结 构 的 开 放 结 构 给 系 统 带 来 极 大 好 处, 它 可 使 不同 厂 家、 不 同 品 牌 的 高 新 技 术 产 品 能 够 集 成 在 同 一 系 统 之 内, 从 而 改变 了 以 往 单 一 种 封 闭 的 技 术 格 局 . 但 同 时 也 带 来 一 些 问 题: 在 同 一个 系 统 中, 可 能 汇 集 多 种 操 作 平 台 和 不 同 厂 家 的 设 备, 所 以 产 生 故 障的 原 因 也 随 之 增 多。 在 发 生 故 障 的 情 况 下, 对 故 障 进 行 快 速、 准 确 的判 断, 也 成 为 很 棘 手 的 问 题, 往 往 需 要 花 费 一 定 的 时 间 及 精 力 去 诊 断问 题 的 所 在。 如 果 处 理 不 当, 由 此 可 带 来 的 影 响 不 可 低 估。

  其 次,Client/Server 结 构 的 高 度 开 放 性, 使 系 统 配 置 选 择 余 地 大 大 增强。 但 同 时 也 带 来 的 问 题 是 确 定 最 佳 系 统 组 合 及 最 佳 系 统 性 能 指 标,成 为 一 大 难 题。 在 识 别、 评 价 和 选 择 适 当 服 务 器 平 台 时, 必 须 考 虑 到由 该 平 台 提 供 的 服 务。 如 有 些 数 据 库 服 务 器 可 能 需 要 快 速 处 理 能 力、快 速 磁 盘 存 取 和 可 能 的 容 错 能 力, 以 确 保 良 好 的 网 络 性 能。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值