作者:袁海兰 [胜利石油管理局第六中学]
1 前 言
开 发 高 水 平 的“ 管 理 信 息 系 统”, 选 择 性 能 优 越 的 数 据 库 是 最 重 要 的 一 环, 我 们 经 过 多 方 面 的 调 研 和 分 析, 选 择 了ORACLE7 数 据 库, 成 功 地 开 发 了 本 系 统。 实 践 证 明, 本 系 统 设 计 科 学、 合 理、 运 行 稳 定, 本 文 将 具 体 阐 述 一 下 系 统 中 应 用ORACLE7 数 据 库 的 方 法 和 技 术。
2 系 统 的 开 发、 运 行 环 境
本 系 统 在CLIENT/SERVER 结 构 上 运 行,SERVER 为CDC 4360 小 型 机, 和 快 速FDDI 环 网 相 接, 内 装 有UNIX 操 作 系 统 和ORACLE7 数 据 库, 系 统 总 体 网 络 协 议 为TCP/IP 。
CLIENT 端 为486 以 上 微 机,16M 以 上 内 存, 硬 盘 足 够 大, 通 过HUB、 路 由 器、MODEM 和SERVER 连 接。 开 发、 运 行 平 台 是WIN95, 安 装 了 网 络 软 件ONNET、ORACLE CDE 产 品 SQL*NET V2。 开 发 工 具 是POWERBULDER5.0( 以 下 简 称PB5)、VB4 等。
3 ORACLE7 在 系 统 中 的 各 种 应 用
3.1 一 般 性 的 数 据 管 理
一 般 性 的 数 据 管 理 用 数 据 窗 口 管 理 最 方 便, 可 以 在 数 据 窗 口 中 进 行 表 的 增、 删、 改、 查 询 等 操 作, 下 边 是 一 些 具 体 例 子(PB5):
3 .1 .1 连 通ORACLE 库, 并 将 数 据 装 入 数 据 窗 口:
dw_1.SetTransObject(sqlca) dw_1.Retrieve() 3 .1 .2 增 加 一 条 记 录
dw_1.InsertRow(dw_1.GetRow( ) + 1) 3 .1 .3 删 除 一 条 记 录( 当 前 记 录)
dw_1.DeleteRow(0) 3 .1 .4 将 数 据 提 交 入 库( 存 盘)
dw_1.Update( ) commit; 3 .1 .5 打 印 数 据 窗 口( 表) 中 的 数 据
dw_1.print() 3 .2 文 字 类 数 据 管 理
3 .2 .1 文 本 入 库 和 查 询
文 本 入 库 和 查 询 可 采 用PB5 的MLE( 多 行 编 辑 器) 作 界 面, 编 辑 完 成 后 存 入ORACLE7 的LONG 字 段 中, 查 询 时 从LONG 字 段 中 取 出, 放 入MLE 中 查 询, 下 边 是 一 个 例 子:
//文本的预处理(以去除文本文件中的回车换行符为例说明) //将文件读入BLOB型变量 text中fn=fileopen(txtname,streammode!) if fn< > -1 then fileread(fn,text) fileclose(fn) // 并 转 换 为 文 本 article=string(text) s=len(article) for v=1 to s t=pos(article,char(13)+char(10),v) if t >0 then article=replace(article,t,2,"") else end if next mle_1.text=article //将处理后的文件c:\bb.txt存盘, 文件中的回车换行符已全部去掉 text1=blob(article) filname="c:\bb.txt" fn=fileopen(filname,streammode!, write!,lockwrite!,replace!) if fn< >-1 then filewrite(fn,text1) fileclose(fn) end if //文本入库 nr1=blob(mle_1.text) updateblob gljwj set nr=:nr1 where bh=:pass_parm and zwrq=:fsj and wjbs=:fl5 using sqlca; commit; // 放 入MLE 中 查 询 selectblob nr into :nr1 from gljwj where bh=:pass_parm and wjbs=:fl5 and zwrq=:fsj using sqlca; mle_1.text=blob(nr1) 3 .2 .2 从 库 中 重 新 生 成 文 本 文 件filename.txt 并 存 盘
select nr into :filen from fwgs where bh=:bh1 and lwrq=:zwrq1 using sqlca; fname="c:\filename.txt" fh=fileopen(fname,streammode!,write!,lockwrite!,replace!) if fh< >-1 then filewrite(fh,filen) fileclose(fh) end if 3 .3 处 理 图 象 文 件( 大 的 二 进 制 文 件)
图 象 文 件( 一 般 为BMP 位 图 文 件) 是 二 进 制 文 件, 将 其 以 数 据 流 方 式 存 入ORACLE7 的LONG 字 段 中, 查 询 时 从LONG 字 段 中 取 出, 放 入 图 象 框( 如p_1) 中 查 询, 下 边 是 一 个 例 子:
// 将 图 象 文 件 读 入BLOB 型 变 量pict 中 fn=fileopen(picname,streammode!) if fn< > -1 then fileread(fn,pict) fileclose(fn) // 将 图 象 放 入 图 象 框p_1 内 查 看 setpicture(p_1,pict) end if // 将 图 象 存 入 表pic 的LONG 字 段bmpt 中 updateblob pic set bmpt=:pict ; commit; 较 大 的 图 象 文 件 一 次 不 能 入 库, 可 采 取 分 割 图 形 的 方 式, 分 块 存 入, 因 为LONG 字 段 所 存 放 的 数 据 大 小 一 般 是 没 限 制 的( 可 存 放2G 的 内 容)。
4 开 发 应 用 经 验
4 .1 建 议CLIENT 端 通 过SQL*NET V2 进 行ORACLE 数 据 通 信( 不 用SQL*NET TCP V1 产 品)
因 为 在ORACLE7 推 出 以 后,SQL*NET V1 就 没 有 做 一 些 改 进 工 作, 继 续 支 持 到ORACLE7.2, ORACLE7.3 以 后 的 产 品 将 不 支 持SQL*NET TCP V1, 所 以,ORACLE7 用 户 应 立 即 改 用SQL*NET V2, 不 然 会 影 响 到 库 的 运 行 稳 定 性。
ORACLE CDE2 和Developer 2000 提 供 了CLIENT 端ORACLE 产 品 的 安 装 程 序ORAINST.EXE, 运 行 该 文 件 来 安 装SQL*NET V2, 选 择 的 产 品 有:
a ORACLE TCP/IP ADPTER 2.1.4.1.3 b sql*net 2.1.4.1.4 在WIN95 下, 网 络 软 件 产 品(Tcp/IP Vendor) 选 择Microsoft windows NT Tcp/IP 3.1 , 按 提 示 说 明 装 入 就 可 以 了, 另 外 还 要 做 以 下 工 作:
将SERVER 上 的tnsnames.ora 文 件 复 制 到CLIENT 端c:\orawin\network\admin 目 录 下:
ora7=(DESCRIPTION= (ADDRESS= (PROTOCOL=TCP) (HOST=111.1.1.1) (PORT=1521) ) (CONNECT_DATA=(SID=ora7)) ) 可 在SQLPLUS 下 键 入 连 接 命 令scott/tiger@ora7 测 试 连 接 情 况。
首 先 要 作 好 这 三 件 工 作:
4 .2 采 取 数 据 加 密 技 术
对 用 户 来 说, 查 询 信 息 是 有 权 限 的, 若 想 查 询 某 项 保 密 数 据, 需 正 确 地 键 入 密 码, 才 能 查 到。 面 对 同 一 台 微 机, 谁 能 正 确 地 键 入 密 码, 谁 就 能 做 查 询, 该 系 统 通 过 自 定 义 一 些 复 杂 的 函 数 运 算 产 生 密 码, 从 表(TABLE) 中 找 不 到 密 码 数 据, 通 过 这 种 精 密 的 设 计 处 理, 达 到 了 数 据 保 密 要 求。 下 边 是 密 码 修 改 和 识 别 的 一 段 程 序(PB5) :
password=sle_1.text a8=pos(sle_1.text,"/") if a8 >=1 then password=left(sle_1.text,a8 - 1) newpassword=mid(sle_1.text,a8+1,len(sle_1.text) - a8) end if select dwbm into :dm from dw where mm=:password; sle_1.text="" if sqlca.sqlcode< >0 then messagebox(" 警 告:"," 口 令 错 !") pw=pw+1 if pw >=3 then close(w_bg_main) end if else mm=dm if a8 >=1 then a7=messagebox("提示信息","确定要修改口令吗(y/n)? ",information!,YesNo!,2) if a7=1 then select dwbm into :a9 from dw where mm=:newpassword; if sqlca.sqlcode< >100 or newpassword="" then messagebox(" 提 示 信 息"," 新 口 令 错 !") goto end1 else update dw set mm=:newpassword where mm=:password; messagebox("请记住新口令",string(newpassword)) commit; end if end if end if 4 .3 用EXCEL 输 出 精 美 表 格
用VC 或PB5 将ORACLE 库 中 的 数 据 生 成 文 本 或EXCEL 文 件, 再 通 过EXCEL 的 数 据 链 接, 将 对 应 数 据 调 入 事 先 定 义 好 的EXCEL 标 准 输 出 表 中, 按 用 户 的 要 求 输 出。
PB5 生 成EXCEL 格 式 文 件 的SCRIPT 语 句 举 例 如 下:
dw_1.SaveAs("c:\glxx.xls",excel!,true) 4 .4 正 确 使 用 日 期 型 数 据
在 库 操 作 过 程 中, 若 日 期 变 量 的 值 定 义 错 了, 将 提 示SQL 语 句 出 错 信 息, 错 误 现 象 非 常 隐 蔽, 不 好 察 觉, 这 是 编 程 过 程 中 的 常 见 错 误, 在 此 特 别 强 调 一 下。 举 一 个 例 子:
若 日 期 数 据 为 常 量, 要 按 下 列 格 式 赋 值( 用 一update 语 句 说 明):
update tab set rq='1-Feb-96'; commit; 5 结 束 语
该 系 统 的 开 发 和 应 用, 使 我 们 更 加 体 会 到 了ORACLE 数 据 库 的 优 越 性, 本 系 统 的 开 发 成 功 与 此 是 分 不 开 的, 我 们 将 做 进 一 步 探 索, 用 先 进 的 开 发 工 具 和 升 级 的ORACLE8 开 发 面 向 网 络 的 和 多 媒 体 的“ 管 理 信 息 系 统”。 |