📄 visual c++ 中 的odbc 编 程 .htm
字号:
<html><body background="di2001.jpg"><head><meta http-equiv="Content-Type" content="text/html; charset=gb_2312-80"><meta name="GENERATOR" content="Microsoft FrontPage 3.0"><title>VisualC++中的ODBC编程 </title><style type="text/css"><!--.10V {font-size: 9pt; font-family: 宋体;text-decoration:none;color="0000ff";}.12V {font-size: 12pt; font-family: 宋体;}--></style></head><body bgcolor="#FFFFFF"><p> </p><h2 align="center"><font color="#0000FF">Visual C++ 中 的ODBC 编 程 </font></h2><div align="center"><center><table border="0" cellpadding="0" cellspacing="0" width="80%"> <tr> <td valign="top"><h3 align="center">华 中 理 工 大 学 电 力 工 程 系<font color="#FFFFFF">--</font>董 毅 </h3> <p><font color="#FFFFFF"><br> ----</font> <b>摘 要:</b>ODBC(Open Database Connectivity, 开 放 式 数 据 库 连 接), 是 一 种 用 来 在 相 关 或 不 相 关 的 数 据 库 管 理 系 统(DBMS) 中 存 取 数 据 的 标 准 应 用 程 序 接 口(API)。 本 文 给 出Windows 95 环 境 下 用Visual C++ 进 行ODBC 编 程 的 具 体 方 法 及 技 巧。 <br> <font color="#FFFFFF">----</font> <b>关 键 字:</b>ODBC,Visual C++,Windows 编 程。 </p> <h3><font color="#0000C0">一 . 概 述</font></h3> <h3><font color="#FFFFFF">----</font> ODBC 是 一 种 使 用SQL 的 程 序 设 计 接 口。 使 用ODBC 让 应 用 程 序 的 编 写 者 避 免 了 与 数 据 源 相 联 的 复 杂 性。 这 项 技 术 目 前 已 经 得 到 了 大 多 数DBMS 厂 商 们 的 广 泛 支 持。 </h3> <p><font color="#FFFFFF">----</font> Microsoft Developer Studio 为 大 多 数 标 准 的 数 据 库 格 式 提 供 了32 位ODBC 驱 动 器。 这 些 标 准 数 据 格 式 包 括 有:SQL Server、Access、Paradox、dBase、FoxPro、Excel、Oracle 以 及Microsoft Text。 如 果 用 户 希 望 使 用 其 他 数 据 格 式, 用 户 需 要 相 应 的ODBC 驱 动 器 及DBMS。 </p> <p><font color="#FFFFFF">----</font> 用 户 使 用 自 己 的DBMS 数 据 库 管 理 功 能 生 成 新 的 数 据 库 模 式 后, 就 可 以 使 用ODBC 来 登 录 数 据 源。 对 用 户 的 应 用 程 序 来 说, 只 要 安 装 有 驱 动 程 序, 就 能 注 册 很 多 不 同 的 数 据 库。 登 录 数 据 库 的 具 体 操 作 参 见 有 关ODBC 的 联 机 帮 助。 </p> <h3><font color="#0000C0">二 .MFC 提 供 的ODBC 数 据 库 类</font></h3> <h3><font color="#FFFFFF">----</font> Visual C++ 的MFC 基 类 库 定 义 了 几 个 数 据 库 类。 在 利 用ODBC 编 程 时, 经 常 要 使 用 到 CDatabase( 数 据 库 类),CRecordSet( 记 录 集 类) 和CRecordView( 可 视 记 录 集 类)。 其 中: </h3> <p><font color="#FFFFFF">----</font> CDatabase 类 对 象 提 供 了 对 数 据 源 的 连 接, 通 过 它 你 可 以 对 数 据 源 进 行 操 作。 </p> <p><font color="#FFFFFF">----</font> CRecordSet 类 对 象 提 供 了 从 数 据 源 中 提 取 出 的 记 录 集。CRecordSet 对 象 通 常 用 于 两 种 形 式: 动 态 行 集(dynasets) 和 快 照 集(snapshots)。 动 态 行 集 能 保 持 与 其 他 用 户 所 做 的 更 改 保 持 同 步。 快 照 集 则 是 数 据 的 一 个 静 态 视 图。 每 一 种 形 式 在 记 录 集 被 打 开 时 都 提 供 一 组 记 录, 所 不 同 的 是, 当 你 在 一 个 动 态 行 集 里 滚 动 到 一 条 记 录 时, 由 其 他 用 户 或 是 你 应 用 程 序 中 的 其 他 记 录 集 对 该 记 录 所 做 的 更 改 会 相 应 地 显 示 出 来。 </p> <p><font color="#FFFFFF">----</font> CRecordView 类 对 象 能 以 控 制 的 形 式 显 示 数 据 库 记 录。 这 个 视 图 是 直 接 连 到 一 个CRecordSet 对 象 的 表 视 图。 </p> <h3><font color="#0000C0">三 . 应 用ODBC 编 程</font></h3> <h3><font color="#FFFFFF">----</font> 应 用Visual C++ 的AppWizard 可 以 自 动 生 成 一 个ODBC 应 用 程 序 框 架。 方 法 是: 打 开File 菜 单 的New 选 项, 选 取Projects, 填 入 工 程 名, 选 择MFC AppWizard (exe), 然 后 按AppWizard 的 提 示 进 行 操 作。 当AppWizard 询 问 是 否 包 含 数 据 库 支 持 时, 如 果 你 想 读 写 数 据 库, 那 么 选 定Database view with file support; 而 如 果 你 想 访 问 数 据 库 的 信 息 而 不 想 回 写 所 做 的 改 变, 那 么 选 定Database view without file support 选 项 就 比 较 合 适 了。 选 择 了 数 据 库 支 持 之 后Database Source 按 钮 会 激 活, 选 中 它 去 调 用Data Options 对 话 框。 在Database Options 对 话 框 中 会 显 示 已 向ODBC 注 册 的 数 据 库 资 源, 选 定 你 所 要 操 作 的 数 据 库, 如:Super_ES, 单 击OK 后 会 出 现Select Database Tables 对 话 框, 其 中 列 举 了 你 所 选 中 的 数 据 库 中 包 含 的 全 部 表, 选 择 你 希 望 操 作 的 表 后, 单 击OK。 在 选 定 了 数 据 库 和 数 据 表 之 后, 你 可 以 按 照 惯 例 继 续 进 行AppWizard 操 作。 </h3> <p><font color="#FFFFFF">----</font> 特 别 需 要 指 出 的 是: 在 生 成 的 应 用 程 序 框 架View 类( 如:CSuper_ESView) 中 包 含 一 个 指 向CSuper_ESSet 对 象 的 指 针m_pSet, 该 指 针 由AppWizard 建 立, 目 的 是 在 视 表 单 和 记 录 集 之 间 建 立 联 系, 使 得 记 录 集 中 的 查 询 结 果 能 够 很 容 易 地 在 视 表 单 上 显 示 出 来。 有 关m_pSet 的 详 细 用 法 可 以 参 见Visual C++ Online Book。 </p> <p><font color="#FFFFFF">----</font> 程 序 与 数 据 语 言 建 立 联 系, 使 用CDatebase::OpenEx() 或CDatabase::Open() 函 数 来 进 行 初 始 化。 数 据 库 对 象 必 须 在 你 使 用 它 构 造 一 个 记 录 集 对 象 之 前 被 初 始 化。 </p> <p><font color="#FFFFFF">----</font> 下 面 举 例 说 明 在Visual C++ 环 境 中ODBC 的 编 程 技 巧: </p> <p><font color="#FFFFFF">----</font> <b>1 . 查 询 记 录</b> <br> <font color="#FFFFFF">----</font> 查 询 记 录 使 用CRecordSet::Open() 和CRecordSet::Requery() 成 员 函 数。 在 使 用CRecordSet 类 对 象 之 前, 必 须 使 用CRecordSet::Open() 函 数 来 获 得 有 效 的 记 录 集。 一 旦 已 经 使 用 过CRecordSet::Open() 函 数, 再 次 查 询 时 就 可 以 应 用CRecordSet::Requery() 函 数。 在 调 用CRecordSet::Open() 函 数 时, 如 果 已 经 将 一 个 已 经 打 开 的CDatabase 对 象 指 针 传 给CRecordSet 类 对 象 的m_pDatabase 成 员 变 量, 则 使 用 该 数 据 库 对 象 建 立ODBC 连 接; 否 则 如 果m_pDatabase 为 空 指 针, 就 新 建 一 个CDatabase 类 对 象 并 使 其 与 缺 省 的 数 据 源 相 连, 然 后 进 行CRecordSet 类 对 象 的 初 始 化。 缺 省 数 据 源 由GetDefaultConnect() 函 数 获 得。 你 也 可 以 提 供 你 所 需 要 的SQL 语 句, 并 以 它 来 调 用CRecordSet::Open() 函 数, 例 如: </p> <p><font color="#FFFFFF">----</font> Super_ESSet.Open(AFX_DATABASE_USE_DEFAULT,strSQL); </p> <p><font color="#FFFFFF">----</font> 如 果 没 有 指 定 参 数, 程 序 则 使 用 缺 省 的SQL 语 句, 即 对 在GetDefaultSQL() 函 数 中 指 定 的SQL 语 句 进 行 操 作: </p> <pre> CString CSuper_ESSet::GetDefaultSQL(){return _T("[BasicData],[MainSize]");}</pre> <p><font color="#FFFFFF">----</font> 对 于GetDefaultSQL() 函 数 返 回 的 表 名, 对 应 的 缺 省 操 作 是SELECT 语 句, 即: </p> <p><font color="#FFFFFF">----</font> SELECT * FROM BasicData,MainSize </p> <p><font color="#FFFFFF">----</font> 查 询 过 程 中 也 可 以 利 用CRecordSet 的 成 员 变 量m_strFilter 和m_strSort 来 执 行 条 件 查 询 和 结 果 排 序。m_strFilter 为 过 滤 字 符 串, 存 放 着SQL 语 句 中WHERE 后 的 条 件 串;m_strSort 为 排 序 字 符 串, 存 放 着SQL 语 句 中ORDER BY 后 的 字 符 串。 如: </p> <pre> Super_ESSet.m_strFilter="TYPE=' 电 动 机'"; Super_ESSet.m_strSort="VOLTAGE"; Super_ESSet.Requery(); 对 应 的SQL 语 句 为: SELECT * FROM BasicData,MainSize WHERE TYPE=' 电 动 机' ORDER BY VOLTAGE</pre> <p><font color="#FFFFFF">----</font> 除 了 直 接 赋 值 给m_strFilter 以 外, 还 可 以 使 用 参 数 化。 利 用 参 数 化 可 以 更 直 观, 更 方 便 地 完 成 条 件 查 询 任 务。 使 用 参 数 化 的 步 骤 如 下: </p> <p><font color="#FFFFFF">----</font> (1) . 声 明 参 变 量: </p> <pre> CString p1; float p2;</pre> <p><font color="#FFFFFF">----</font> (2) . 在 构 造 函 数 中 初 始 化 参 变 量 </p> <pre> p1=_T(""); p2=0.0f; m_nParams=2;</pre> <p><font color="#FFFFFF">----</font> (3) . 将 参 变 量 与 对 应 列 绑 定 </p> <pre> pFX->SetFieldType(CFieldExchange::param) RFX_Text(pFX,_T("P1"),p1); RFX_Single(pFX,_T("P2"),p2);</pre> <p><font color="#FFFFFF">----</font> 完 成 以 上 步 骤 之 后 就 可 以 利 用 参 变 量 进 行 条 件 查 询 了: </p> <pre> m_pSet->m_strFilter="TYPE=? AND VOLTAGE=?"; m_pSet->p1=" 电 动 机"; m_pSet->p2=60.0; m_pSet->Requery();</pre> <p><font color="#FFFFFF">----</font> 参 变 量 的 值 按 绑 定 的 顺 序 替 换 查 询 字 串 中 的“?” 适 配 符。 </p> <p><font color="#FFFFFF">----</font> 如 果 查 询 的 结 果 是 多 条 记 录 的 话, 可 以 用CRecordSet 类 的 函 数Move(),MoveNext(), MovePrev(),MoveFirst() 和MoveLast() 来 移 动 光 标。 </p> <p><font color="#FFFFFF">----</font> <b>2 . 增 加 记 录</b> <br> <font color="#FFFFFF">----</font> 增 加 记 录 使 用AddNew() 函 数, 要 求 数 据 库 必 须 是 以 允 许 增 加 的 方 式 打 开: </p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -