摘要:本文提供了在FOXBASE环境上开发管理信息系统,并与
ORACLE7进行
数据 交换的一种通用
程序设计方法。仅供同行参考。
一 引言
随着改革开放的不断深入,计算机管理信息系统(MIS)的建设方兴末艾,并日益
发挥着越来越重要的作用。我们在MIS开发过程中,必须注意尽量利用原有软硬件资
源,解决好新旧平台之间的接口,保证共享
数据库与子系统之间、子系统与子系统
之间的
数据自动交换,从而达到节省投资、避免重复开发、缩短开发周期、提高工
作效率之目的。
在实际工作中,我们发现不少单位在规划、建设MIS网络之初,引进、移植或自
行开发了不少应用软件,其中还包括上级部门下达的、强制推广的行业性软件,而
这些应用软件大都是用DBASE、XBASE开发的。但是,随着工作的深入和计算机技术
的发展,以及行业标准的统一制定与实施,
ORACLE关系
数据库管理系统(RDBMS)作为
一个高性能的
数据库管理系统,可以通用于八十多种大、中、小及微型计算机,它
采用了标准的SQL语言,具有丰富的第四代语言工具,因而正在我国迅猛推广运用。
那么如何实现
ORACLE与DBASE的联合操作,进行
数据转换呢?我们利用了
ORACLE公
司的产品
ORACLE DBXL转换工具。
DBXL是
ORACLE V5.1和DBASE的接口产品。使用它可以将DBASE 编写的
程序编译
成操作系统可执行的二进制文件,该执行文件可以访问存贮于
ORACLE数据库的
数据。
DBXL不仅可以作为DBASE的编译器,给DBASE增加开窗口、图形等功能,同时也可构
成分布式
数据库环境中的
网络结点。访问
网络中
数据库服务器中的
数据。这样,我
们不仅实现了
ORACLE与DBASE的双向转换,而且能在DBASE环境下执行标准SQL语言所
有DDL、DML和部分DCL语句。使用该方法,原有的DBASE程序和
数据库资源能继续使
用,对于需共享的
数据,也可以经转换后部分或全部放到
服务器上,对于所增加的
功能模块,亦只需在原
程序中进行更新即可满足整个系统的使用,因此缩短了开发
周期,节省了硬件投资。
然而,
ORACLE版本7已放弃了对DBXL的支持,那么如何实现DBASE或XBASE &127;对
ORACLE7的访问呢?我们通过重写DBXL和
ORACLE7数据库的接口,可方便地实现DBASE
FOXBASE或FOXPRO数据库对
ORACLE7的访问,从而保护了原有应用。
二 实现方法
DBXL支持DBASE语法集和SQL语言。将DBASE应用转换为
ORACLE DBXL应用就是将
DBASE格式的
数据转换到
ORACLE库中。大多数用DBASE编写的应用不用修改即可在
ORACLE DBXL下运行。
将DBASE、XBASE应用连接到
ORACLE数据库,在DBASE用
程序开始处加入如下行:
CONNECT <用户名/口令>
为了编制
ORACLE7与FOXBASE进行
数据交换的通用接口
程序,我们首先建立工作
数据库WORK.DBF,其结构如下:
FIELD FIELD NAME TYPE WIDTH DEC
1 KEY N 1
2 NODNAME C 10
3 NFNAME C 10
4 LFNAME C 10
5 COND C 80
6 SUCC L 1
其中:KEY表示操作码,KEY=1表示工作站从
服务器上取
数据;KEY=2 表示工作站
送
数据至
服务器;KEY=3表示从
服务器删除所有满足条件的记录。NODNAME表示用户
名,NFNAME表示
服务器上
ORACLE7的表名,LFNAME表示工作站上对应的FOXBASE数
据库名,COND&127;表示条件(=.T.),&127;SUCC=.F.。
下面我们提供了
ORACLE7与FOXBASE进行
数据交换的
程序清单,希望能够起到抛
砖引玉的作用.在实际运行.DO MENU的过程中,只需修改工作站/口令名
(NETWORK)和
网络工作站上FOXBASE数据库(GOOD.DBF)名称,以及对应的
服务器上
ORACLE7表名
(GOOD)即可。
值得注意的是:和
ORACLE7进行
数据交换的FOXBASE数据库只允许有N、D、C
三种
数据类型,如果其中有L、M型的字段,须改为字符型。
MENU.PRG(主控
程序):
sele a
ok=.f.
keyword=3
network="cw" &&表示
网络工作站用户名
tablnam ="good" &&表示
网络工作站上
ORACLE7表名
dbfnam ="good" &&表示工作站上对应的FOXBASE数据库名(GOOD.DBF)
condit=.t. &&表示FOXBASE的
数据库GOOD.DBF全部上网
do exchdbf with keyword,network,tablnam,dbfnam,condit,ok
if ok
set color to w/n
clear
do case
case keyword=1
set color to gr+/r
@8,10 clear to 16,60
@8,10 to 16 , 60 double
@12,16 say "从 网 络 服 务 器 上 取 数 据 成 功 !!! "
del=inkey(3)
case keyword=2
set color to w+/b
@8,10 clear to 16,60
@8,10 to 16,60 double
@12,16 say " 数 据 上 网 成 功 !!! "
del=inkey(3)
case keyword=3
set color to bg+/r
@8,10 clear to 16,60
@8,10 to 16, 60 double
@12,16 say " 从 网 络 服 务 器 上 删 除 数 据 成 功 !!!"
del=inkey(3)
endcase
else
return
endif
? sys(2002,1)
return
EXCHDBF.PRG(
数据交换
程序):
para keyword,network,tablnam,dbfnam, condit, ok
use work
goto top
replace key with keyword nodname with network nfname with ;
tablnam lfname with dbfnam cond with condit succ with ok
use
save screen
!foxswap dbxl nettran
restore screen
use work
ok=succ
use
return
NETTRAN.PRG(
数据交换
程序):
set talk off
set echo off
set menu off
set stat off
set safe off
set autolock on
on error do errhand
user="aj" &&用户名
pass="aj" &&口令
login=user+"/"+pass
connect &login
set
oracle off
set color to gr+/r
@10,10 clear to 14,62
@10,10 to 14,62 double
@12,13 say "本站与
网络服务器正在交换
数据 , 请用户稍侯 !!!"
sleep (1)
select 1
use work automem
store automem
use
tabname=trim(nfname)
if key<>2
tabname=trim(nodname)+tabname)
endif
set
oracle on
ok=file("&tabname"+".dbf")
if .not.ok.and.(key=1.or.key=3)
@12,13 say "
网络服务器上无 "+"&tabname"+".dbf
数据库"
sleep(3)
quit
endif
cond