[转贴]用VFP访问INFORMIX ONLINE数据库
[文章原作者:唐军]在论坛上,不记得在哪个朋友问过这个问题,今天找到了,就帖出来。
用VFP访问INFORMIX ONLINE数据库
我们知道,Microsoft公司推出的基于WINDOWS平台的Visual FoxPro数据库是目前国内十分流行的数据库软件之一,它不仅具有强大的数据库管理能力,而且具有极其友好的图形界面和多媒体处理能力。它使用WINDOWS的DDE和OLE技术,可以对用户感兴趣的声音图片等多媒体信息字段进行存储和处理。声图并茂的图文界面,使操作人员不再对经常重复的操作感到枯燥和乏味。不仅如此,它还提供了大量可视化编程工具。使用真正的面向对象的编程技术,大大缩短了应用系统的开发周期和维护工序,深受开发人员的欢迎。但是,Visual FoxPro也有它的局限性。在多用户访问、大量的数据存储、内置安全性、可靠的事务处理等方面,Visual FoxPro无法与INFORMIX那样的世界著名数据库相比。
INFORMIX是典型的关系数据库。它使用RDSQL标准结构查询语言,不仅支持多用户操作。而且具有非常强大的大型数据处理能力和安全容错机制,目前,国内绝大多数金融机构都采用了多用户环境下的INFORMIX进行大量的业务数据处理。
然而,与Visual FoxPro相比,多用户环境下INFORMIX的用户界面又显得不是那么美观。我们在开发大型的数据库应用系统的时候,用户往往要求既要有丰富多彩的人机对话界面,又要实现多用户同时对数据库进行操作,而且数据处理必须具有高度的可靠性和安全性。这时候,我们自然要想到将Visual FoxPro的多媒体功能与INFORMIX的多用户和大型数据库处理能力结合起来。本文正是基于这种思想,介绍在客户/服务器模式下利用Visual FoxPro5?0的ODBC(开放式数据库互连)功能访问INFORMIX ONLINE5?0数据库的方法。
客户/服务器模式(Client/Server,简称C/S)是目前世界上广泛采用的一种存取信息和共享资源的方式。在降低成本提高效率方面,它是一种十分优秀的体系。这种C/S模式以网络技术为基础,将应用系统分布在两个实体——客户机和服务器上。客户机提供用户界面,并直接以SQL语言向数据库服务器发出数据请求,数据库服务器响应客户机的请求,执行这些SQL语句,并将处理结果返回给客户机,ODBC(Open DataBase Connectivity)是异种数据库互相访问的一种协议,通过创建ODBC连接,Visual FoxPro可以方便地访问本地主机或远程服务器上的其他非FoxPro数据库。Visual FoxPro支持很多ODBC驱动程序,如FoxPro2.0数据库、SQL SERVER数据库、Microsoft Access数据库、Microsoft EXCEL电子表格、ORACLE数据库等。虽然Visual FoxPro没有直接提供INFORMIX数据库的ODBC驱动程序,但INFORMIX数据库厂商提供了其服务器与客户端的中间件,客户端的中间件就是其ODBC的驱动程序。INFORMIX ONLINE5?0数据库服务器端的中间件叫INFORMIX STAR(7?0以上版本的中间件包裹在ONLINE产品中,不再单独提供),客户端的中间件叫INFORMIXNET,将其加入ODBC数据源中,客户端就可以访问服务器上的INFORMIX数据库了。为了清楚地说明Visual FoxPro访问INFORMIX ONLINE数据库的方法,举如下图例。
图例中,服务器端安装SCO UNIX操作系统,在用户informix的主目录/home/informix下安装了INFORMIX ONLINE 5.0和INFORMIX STAR产品,并由informix用户创建了数据库mydatabase和表Mytable。服务器主机名为MYSERVER,IP地址为8?8?8?1。客户机1上安装WINDOWS95操作系统,并安装Visual FoxPro5.0(包括ODBC)及INFORMIX_NET CLI2?5,主机名为CLIHOST1,IP地址为8?8?8?2。客户机2除主机名(CLIHOST2)和IP地址(8?8?8?3)与客户机1不同外,其余配置均与客户机1相同。
下面具体介绍前面图例中,客户端的Visual FoxPro访问服务器端INFORMIX数据库的实现过程和步骤:
一、配置网络,使服务器与各客户机在同一网段。
(本例中使用TCP/IP协议,具体配置,请查阅相关资料)
二、配置INFORMIX服务器端。
1?修改文件/etc/hosts内容如下:
8.8.8.1 MYSERVER
8.8.8.2 CLIHOST1
8.8.8.3 CLIHOST2
2?在/etc/services中增加INFORMIX STAR服务名及该服务所占用的端口号和使用的协议,其中端口名可自己确定,端口号必须在该文件中是唯一的,协议采用tcp,如:
sqlexec 8888/tcp
3?在/home/informix/etc目录下创建sqlhosts文件,其格式如下:
dbservername nettype hostname servicename
其中:
dbservername:数据库服务器名(在安装ONLINE时,由tbmonitor配置共享内存指定,如果配置时采用默认设置,则为ONLINE)。
nettype:网络类型,定议格式如下:
ddiippp
dd:数据库服务器类型,如on表示数据库服务器采用Online
iii:网络接口,tli/soc表示网络通讯接口为sockets(套接字),
如果选用INFORMIX ONLINE5?0则为′tli′
ppp:网络协议,如tcp
hostname:服务器主机名
servicesname:服务名,前一步在/etc/services文件中已定义
本文图例中,服务器的$INFORMIXDIR/etc/sqihosts中应加入如下内容:
ONLINE ontlitcp MYSERVER sqlexec
4?在服务器上以informix用户注册,执行tbinit,启动ONLINE数据库。
5?启动服务进程INFORMIX STAR以超级用户注册,执行如下程序:
#/home/infromix/lib/sqlexecd
如果执行成功,则作下一步,否则根据错误提示,检查前面服务器端的设置是否正确。
(以后每次重启服务器,都必须启动一次ONLINE数据库和STAR服务进程,客户机才能访问服务器上的数据库)。
三、配置客户端(各客户机配置均相同)
1?安装客户端中间件(INFORMIX_NET CLI2.5)到informix目录
2?在文件\windows\ hosts中增加服务器定义:
8.8.8.1 MYSERVER
3?在文件\windows\services中增加INFORMIX STAR的服务端口及协议信息,与服务器 /etc/services文件中添加的内容一致:
sqlexec 8888/tcp
4?在\informix\etc目录下创建sqlhosts文件,内容如下:
ONLINE onsoctcp MYSERVER sqlexec
5?设置INFORMIX_CLI环境参数。
进入WINDOWS‘程序’菜单,运行Informix_CLI32菜单中的Informix SetNet32作如下设置:
(1)设置Enviromnent:
INFORMIXDIR=c:\informix (INFORMIX_NET所在目录)
INFORMIXSERVER=ONLINE (数据库服务器名,与服务器上设置一致)
INFORMIXSQLHOSTS=c:\informix\etc\sqlhosts(指定sqlhosts文件路径)
(2)设置Server Information:
Informix Server:ONLINE (数据库服务器名,与服务器上设置一致)
HostName:MYSERVER (服务器主机名)
Protocolname:onsoctcp (网络协议)
Service Name:sqlexec (\windows\services中定义的服务端口)
(3)设置Host Information
Current Host MYSERVER (服务器主机名)
User Name:informix (访问服务器上的用户名)
Password Option: (有无口令)
Password****** (informix用户口令,输入时屏幕以*号回显)
6?测试数据库客户/服务器模式是否连通,具体步骤如下:
执行’开始’’程序’’Informix-CLI32'菜单中的’Ilogin 32 Dermo',选择FILE菜单下的RUN,根据屏幕输入如下内容进行客户/服务器连接测试;
Server:ONLINE (数据库服务器名,与服务器上设置一致)
Hostname:MYSERVER (服务器主机名)
Servicesname:sqlexec (INFORMIX STAR服务端口名)
Protocolname:onsoctcp (协议类型)
Username:informix (用户名)
Password****** (口令)
Stores Database:mydatabase (要连接的数据库)
输入正确后,选中‘OK’,INFORMIX_CLI根据你的设置开始进行连接测试,如果测试成功,屏幕会显示一个‘OK’信息框,你就可以做下面的步骤,否则,屏幕提示出错,并给出错误号,你可以执行‘开始’’程序’’Informix-CLI32'菜单的 'Informix Find Error',查找错误号对应的错误信息和解决办法,根据这些信息作出相应的处理,直到测试成功为止。
7?配置客户端ODBC数据源,将INFORMIX的ODBC驱动程序添加到系统中:
连接测试成功后,打开控制面板中的32bit ODBC,添加系统DSN,选择INFORMIXICLII2?5,并根据屏幕进行如下设置:
DATA SOURSE NAME:VFP_mydata
(自定义一个数据源名字,以便FoxPro建立远程连接时引用)
DESCRIPION: (描述,可不填内容)
DATABASE NAME:mydatabase (要连接的远程服务器上的数据库名)
四、远程ODBC数据源配置好后,客户端就可以在Visual FoxPro中对远程服务器数据库进行访问了,Visual FoxPro访问远程数据库有两种方法,一种是通过创建远程视图的方式访问远程数据库,另一种是使用SQL Path_throuth函数直接对远程数据进行操作。
(一)通过创建远程视图的方式访问远程数据库。其步骤如下:
1?建立ODBC连接,指定数据源
格式:OPEN DATABASE〈本地数据库〉
CREATE CONNECTION〈连接名〉DATASOURCE
〈ODBC数据源〉USERID;
〈远程用户名〉PASSWORD〈口令〉
例如:OPEN DATABASE MYDATABASE
CREATE CONNECTION Myconnect1 DATASOU
RCE VFP_mydata;
USERID informix PASSWORD kkkkkk
该语句执行后,将在FoxPro 目录下建立一个名为‘Myconnect1'的连接文件,并长期保存,供远程视图时引用。
2?创建远程视图:
格式: CREATE SQL VIEW〈视图名〉CONNECTION〈已建的连接名〉AS;
SELECT*FROM〈远程表〉
例如:要建远程数据库mydatabase中的MyTable表上建立远程视图Myview。
CREATE SQL VIEW Myview CONNECTION Myconnectl AS SELECT;
*FROM MyTable
该语句执行后,将在FoxPro目录下建立一个名为‘Myview'的视图文件,并长期保存,以后用户只在需要时用USE命令象访问本地表一样打开该视图,然后对视图进行添加、删除、修改、浏览等操作。如果要把在该视图上的修改提交给远程表,需要改变该视图的相关属性(具体请查阅Visual FoxPro相关资料),并在修改后加入TABLEUPDATE()命令,如:
USE Myview
APPEND
TABLEUPDATE()
前面讲到的连接和远程视图都是一次性创建,永久性保存。一旦创建,它们就象.DBF文件一样保存在硬盘上,使用时,只需用”USE〈视图〉”命令打开视图,FoxPro将根据视图中存放的连接信息打开连接文件,然后由连接控制访问ODBC数据源。连接和远程视图的创建还可以通过它们各自的设计器来完成,具体方法,请查阅相关资料。
(二)利用SQL pass_throuth函数访问远程服务器上数据库中的表。
使用SQL pass-through函数提供了更直接的服务器访问方式,可以直接执行服务器的SQL语句或程序,但它所创建的临时表只存在于当前的工作期中,缺乏象视图定义的永久性。每次使用SQL pass_throuth连接到一个远程ODBC数据源时,都必须首先调用FoxPro的SQLCONNECT()创建连接,以获得活动连接的句柄。应用程序可以对同一数据源请求多个连接,也可以通过对每一个数据源都请求一个连接,同时处理多个ODBC数据源,如果活动连接不再使用,可使用SQLDISCONNECT()切断与数据源的联系。调用SQL pass-through函数的步骤如下:
1?调用SQLCONNECT()或SQLSTRINGCONNECT()创建一个与数据源的连接。
例如:连接到INFORMIX数据源mydatabase上,以informix用户注册。口令为kkkkkk nConnectionHandle=SQLCONNECT('mydatabase','informix','kkkkkk')
2?用SQL pass-through函数将数据检索到Visual Foxpro临时表中,然后用标准的FOXPRO语句和函数处理这些检索到的数据。
例如:
?SQLEXEC(nConnectionHandle,"select*from MyTable"
,"mycurs")
USE mycurs
BROW
3?使用SQLDISCONNECT()切断与数据源的连接
在实际的应用过程中,无论采用哪一种方式访问服务器上的数据库,都需要考虑通讯状态测试、多用户冲突处理、远程访问速度、远程事务容错处理、资源分配等技术性问题,这些都需要进行大量的摸索和积累。由于篇幅有限,本文只提供基本的思路和方法,有兴趣的读者不妨一试。 看了你的贴,我觉得有几个方面可能不易实现
一是foxpro 2.6本身不支持访问异构数据库
二是在foxpro 是如要实现此功能,只能通过C模块或调用外部命令(sybase bcp,informix unload或dbexport)才能实现,而此种方式下实现其的控制部分较为复杂
三是foxpro for unix 对中文支持较差,实现中界面部分较难设计
页:
[1]