VisualFoxPro6.0与大型数据库的无"数据源"连接 foxpro数据库

VisualFoxPro6.0与大型数据库的无"数据源"连接
  Fox系列数据库产品作为一种开发信息管理系统的微机常用工具,而深受开发人员以及广大用户的喜爱,但由于微电子技术的飞速发展,CPU处理速度的快速提升,硬盘的容量、速度及其它性能的显著提高,使得原来运行于小、中型机等高档次计算机上的SQLServer、Oracle、Sybase等大型数据库得以在微机上推广应用,使得较为流行的Fox系列微机数据库暗然失色,但随着VisualFoxPro3.0以及5.0、6.0版本的推出,引入了许多新的特性,因其融入可视化编程,面向对象程序设计以及ODBC技术,它们的发布给其带来新的生机。

  一.VisualFoxPro6.0作为客户端开发工具的技术特点:

  VisualFoxPro6.0提供了支持客户机/服务器所需要的各种特征,包括SQL传递技术、事务处理、远程视图、数据字典、NULL类型、数据库升迁、及对ODBC资源的仪程;通过ODBC,可以访问几乎任何类型的数据库,如Oracle、SQLServer、Sybase等主流数据库,不失为客户机/服务器结构应用系统的客户端优秀开发工具,具有如下的特点:
  1.开发应用系统快捷、方便,可以减轻开发人员的劳动强度,节省大量的开发时间:面向对象特性,如对象、类及其继承性、封闭性、多态性属性等,作为XBASE语言的扩展集而实现,提供了对面向对象程序设计的全面支持,使开发者更多把精力放在系统前期分析和程序设计上,而不是编码上。遵循所见即所得的原则,提供了向导、代码范围分析器、项目管理器、设计器和生成器等图形化风格的交互开发工具,使设计工作在富有情趣的环境中进行。多姿多彩的工具栏,给用户带来诸多的便利。
  2.方便实现数据共享、转换:VisualFoxpro与其他Windows应用程序紧密结合,支持所有Windows的数据共享机制,包括动态连接库(DLL,DynamicLinkLibrary)、动态数据交换(DDE,DynamicDataExchange)及对象连接和嵌入(OLE,ObjectLinkingandEmbedding)等,可以与Microsoft其他应用软件,如Word、Excel等,共享数据资源,快转换成各种格式文档资料;可以利用OLE自动化命令调用其他软件中的数据。
  3.丰富多媒体数据处理功能:VisualFoxpro6.0不但能进行文本格式文件、数据库文件的处理,还提供对GIF(GraphicsInterchangeFormat)和JPEG(JointPhotographicElectronicGroup)图形文件的支持,它提供了一个多媒体控制接口。通过多媒体控制接口(MCI,MultimediaControlInterface),无须介入实际设备的复杂编程就可以操纵所有的多媒体设备,例如,对MMControl控件的简单编程就可以实现视频文件、音频文件的播放等操作。
  4.方便的应用编程接口(API,ApplicationProgrammingInterface)调用:VisualFoxpro6.0提供了应用编程接口(API),把其与VisualStudio套件中的其他开发工具融为一体,紧密结合,可以满足较复杂的应用系统编程需求。
  5.开发应用系统体积小、运行速度快:VisualFoxpro大量应用动态连接库(DLL,DynamicLinkLibrary)机制,DLL具有一次调入内存可被多各程序、线程调用,大大减小了内存空间占用,缩小所编译程序的长度。

  二.数据库连接及操作函数:

  VisualFoxPrp6.0数据库与其它数据库的连接有两种方法:一种使用控件连接;另一种使用函数连接。

  1.用控件连接数据库方法:在表单中加入ADO控件,具体实现过程如下:
  ①.建表单VisualFoxPro→“新建”→“表单”→“新建文件”;
  ②.选择控件“工具”→“选择”→“控件”→选中“控件”→选择“MicrosoftADODataControl,Version6.0(OLEDB)”控件→“确定”;
  ③.添加控件“查看类”→选择“ActiveX控件”→在显示控件中选择“MicrosoftADODataControl,Version6.0(OLEDB)”控件→在表单中加入“ADO”控件;
  ④.设置ADO对象属性,如ConnectionString、UserName、PassWord、CommandType、RecordSource等。
  2.用函数连接数据库方法:这是本文重介绍的方法。下面让我们来认识下列一组函数,它们是SQLCONNECT()、SQLSTRINGCONNECT()、SQLDISCONNECT()、SQLGETPROP()、SQLSETPROP()、SQLPREPARE()、SQLEXEC()、SQLCANCEL()、SQLMORERESULTS()、SQLCOLUMNS()、SQLTABLES()、SQLCOMMIT()和SQLROLLBACK(),它们可以全面完成数据库的连接、处理与提交处理,见下表。

类别函数名称运行方式函数功能
连接处理SQLCONNECT([DataSourceName,cUserID,cPassword|cConnectionName])异步建立与数据源的连接。
SQLSTRINGCONNECT([cConnectString])异步通过连接字符串建立与数据源的连接。
SQLDISCONNECT(nConnectHandle)异步断开数据源连接。
连接设置处理SQLGETPROP(nConnectionHandle,cSetting)异步返回活动连接的当前设置或缺省设置参数值。
SQLSETPROP(nConnectionHandle,cSetting[,eExpression])异步设置活动连接的属性参数值。
SQL语句执行处理SQLPREPARE(nConnectionHandle,cSQLCommand[,CursorName])异步准备SQLEXEC()远程执行的SQL语句。
SQLEXEC(nConnectionHandle[,cSQLCommand[,CursorName]])同步,异步将SQL语句发送到数据源进行处理。
SQLCANCEL(nConnectionHandle)异步请求取消正在执行的SQL语句。
数据处理SQLMORERESULTS(nConnectHandle)同步,异步如果有多个结果集,将另一个结果集复制到游标中。
SQLCOLUMNS(nConnectionHandl,Tablename[,"FOXPRO"|"NATIVE"][,CursorName])同步,异步将数据源指定表的列信息存放到VisualFoxPro游标中。
SQLTABLES(nConnectionHandle[,cTableTypes][,cCursorName])同步,异步将数据源中表的信息存放到VisualFoxPro游标中。
事务处理SQLCOMMIT(nConnectionHandle)异步提交一项事务。
SQLROLLBACK(nConnectionHandle)异步取消当前事务处理过程中所做全部处理。

函数名称参数注释数值类型函数功能
SQLCONNECT([DataSourceName,cUserID,cPassword|cConnectionName])DataSourceName指定ODBC.ini文件中定义的数据源的名称;cUserID注册到数据源的用户名称;cPassword数据源用户口令;cConnectionName由CREATECONNECTION创建的命名连接.数值型正整数执行成功;-1出现连接层错误;-2出现环境层错误.
SQLSTRINGCONNECT([cConnectString])cConnectStringODBC驱动器所要求的数据源连接串,VisualFoxPro将连接串传递给ODBC驱动器.数值型正整数执行成功;-1出现连接层错误;-2出现环境层错误.
SQLDISCONNECT(nConnectHandle)nConnectionHandle连接句柄.数值型1执行成功;-1出现连接层错误;-2出现环境层错误.
SQLGETPROP(nConnectionHandle,cSetting)nConnectionHandle连接句柄;cSetting连接属性名称.数值型1执行成功;-1出现连接层错误;-2出现环境层错误.
SQLSETPROP(nConnectionHandle,cSetting[,eExpression])nConnectionHandle连接句柄;cSetting连接属性名称;eExpression连接属性参数值.数值型1执行成功;-1出现连接层错误;-2出现环境层错误.
SQLPREPARE(nConnectionHandle,cSQLCommand[,CursorName])nConnectionHandle连接句柄;cSQLCommand传递到数据源的SQL语句;CursorName存放结果集的游标名称,缺省游标名SQLRESULT.数值型1执行成功;-1出现连接层错误;-2出现环境层错误.
SQLEXEC(nConnectionHandle[,cSQLCommand[,CursorName]])nConnectionHandle连接句柄;cSQLCommand传递到数据源的SQL语句;CursorName存放结果集的游标名称,缺省游标名SQLRESULT.数值型1执行成功;-1出现连接层错误;-2出现环境层错误.
SQLCANCEL(nConnectionHandle)nConnectionHandle连接句柄.数值型1执行成功;-1出现连接层错误;-2出现环境层错误.
SQLMORERESULTS(nConnectionHandle)nConnectionHandle连接句柄.数值型2已经没有数据;1执行成功;-1出现连接层错误;-2出现环境层错误.
SQLCOLUMNS(nConnectionHandl,Tablename[,"FOXPRO"|"NATIVE"][,CursorName])nConnectionHandle连接句柄;TableName返回其列名的表的名称;FOXPRO|NATIVE列信息的格式;CursorName存放结果集的游标名称,缺省游标名SQLRESULT.数值型1执行成功;-1出现连接层错误;-2出现环境层错误.
SQLTABLES(nConnectionHandle[,cTableTypes][,cCursorName])nConnectionHandle连接句柄;cTableTypes指定一个或几个表类型,类型有'TABLE','VIEW','SYSTEMTABLE'或者数据源特定的合法的表类型标识符,必须大写,若多个类型,各类型间以逗号分隔;CursorName存放结果集的游标名称,缺省游标名SQLRESULT.数值型1执行成功;-1出现连接层错误;-2出现环境层错误.
SQLCOMMIT(nConnectionHandle)nConnectionHandle连接句柄.数值型1执行成功;-1出现连接层错误;-2出现环境层错误.
SQLROLLBACK(nConnectionHandle)nConnectionHandle连接句柄.数值型1执行成功;-1出现连接层错误;-2出现环境层错误.
下面让我们来认识一下连接属性及连接属性参数值:

属性名称数值类型缺省值注释
Asynchronous逻辑型可读写.F..F.同步返回结果集;.T.同步返回结果集.
BatchMode逻辑型可读写.T..F.由SQLMORERESULTS()逐个返回结果集;.T.由SQLEXEC()一次返回所有结果集.
ConnectBusy逻辑型只读不定.F.共享连接不忙;.T.共享连接繁忙.
ConnectString字符型只读不定注册连接串.
ConnectTimeOut数值型可读写15设置返回连接超时错误之前等待的时间(秒);0无限期等待,并且不返回连接超时错误;可以是0~600.
DataSource字符型可读写不定ODBC.INI文件中定义的数据源名称.
DispLogin数值型可读写11或DB_PROMPTCOMPLETE(源于FOXPRO.H),仅当缺少必要信息时才显示ODBC注册对话框;2或DB_PROMPTALWAYS(源于FOXPRO.H),总显示ODBC注册对话框,允许在连接前更改设置;3或DB_PROMPTNEVER(源于FOXPRO.H),从不显示ODBC注册对话框,如果缺少必要信息,会产生错误.
DispWarnings逻辑型可读写.F..F.不显示错误信息;.T.显示错误信息.
IdleTimeOut数值型可读写0空闲超时间隔(秒),时间问隔过后,废止活动连接;0无限期等待.
ODBChdbc数值型只读不定外部库文件(FLL文件)调用ODBC可使用的内部ODBC连接句柄.
ODBChstmt数值型只读不定外部库文件(FLL文件)调用ODBC可使用的内部ODBC语句句柄.
PacketSize数值型可读写4096连接所使用的网络包大小,调整该值可以改善性能.
PassWord字符型只读不定连接口令.
QueryTimeOut数值型可读写0返回一般超时错误之前的等待时间(秒);0无限期等待,不返回超时错误;可以是0~600.
Transactions数值型可读写11或DB_TRANSAUTO(源于FOXPRO.H),自动进行远程表事务处理;2或者DB_TRANSMANUAL(源于FOXPRO.H),事务处理通过SQLCOMMIT()和SQLROLLBACK()函数人工进行.
UserId数值型只读不定用户标识.
WaitTime数值型可读写100检查SQL命令执行情况之前经过的时间(毫秒).
下面让我们来认识一下连接属性及连接属性参数值:

属性名称数值类型缺省值注释
Asynchronous逻辑型可读写.F..F.同步返回结果集;.T.同步返回结果集.
BatchMode逻辑型可读写.T..F.由SQLMORERESULTS()逐个返回结果集;.T.由SQLEXEC()一次返回所有结果集.
ConnectBusy逻辑型只读不定.F.共享连接不忙;.T.共享连接繁忙.
ConnectString字符型只读不定注册连接串.
ConnectTimeOut数值型可读写15设置返回连接超时错误之前等待的时间(秒);0无限期等待,并且不返回连接超时错误;可以是0~600.
DataSource字符型可读写不定ODBC.INI文件中定义的数据源名称.
DispLogin数值型可读写11或DB_PROMPTCOMPLETE(源于FOXPRO.H),仅当缺少必要信息时才显示ODBC注册对话框;2或DB_PROMPTALWAYS(源于FOXPRO.H),总显示ODBC注册对话框,允许在连接前更改设置;3或DB_PROMPTNEVER(源于FOXPRO.H),从不显示ODBC注册对话框,如果缺少必要信息,会产生错误.
DispWarnings逻辑型可读写.F..F.不显示错误信息;.T.显示错误信息.
IdleTimeOut数值型可读写0空闲超时间隔(秒),时间问隔过后,废止活动连接;0无限期等待.
ODBChdbc数值型只读不定外部库文件(FLL文件)调用ODBC可使用的内部ODBC连接句柄.
ODBChstmt数值型只读不定外部库文件(FLL文件)调用ODBC可使用的内部ODBC语句句柄.
PacketSize数值型可读写4096连接所使用的网络包大小,调整该值可以改善性能.
PassWord字符型只读不定连接口令.
QueryTimeOut数值型可读写0返回一般超时错误之前的等待时间(秒);0无限期等待,不返回超时错误;可以是0~600.
Transactions数值型可读写11或DB_TRANSAUTO(源于FOXPRO.H),自动进行远程表事务处理;2或者DB_TRANSMANUAL(源于FOXPRO.H),事务处理通过SQLCOMMIT()和SQLROLLBACK()函数人工进行.
UserId数值型只读不定用户标识.
WaitTime数值型可读写100检查SQL命令执行情况之前经过的时间(毫秒).

  四.非DSN连接字符串的组成:

  除了ADO所定义的参数外,提供者不支持任何特定连接参数。但是,提供者将把任何非ADO连接参数传递给ODBC驱动程序管理器。

  由于可以省略Provider参数,因此使用与撰写ODBC连接字符串时用的相同参数名(DRIVER=、DATABASE=、DSN=等等)、值和语法,可以撰写与同一数据源的ODBC连接字符串相同的ADO连接字符串。

  1.对于SQLServer数据库:
[Provider=MSDASQL;]DRIVER={DriverName};SERVER=server;DATABASE=database;UID=user;PWD=password"例如:cnna.ConnectionString="Provider=MSDASQL;"_+"driver={SQLServer};"_+"server=servera;"_+"database=pubs;"_+"uid=sa;"_+"pwd=yyuui"

  2.对于Sybase数据库:
[PROVIDER=MSDASQL;]DRIVER={DriverName};SRVR=server;注:必须是SRVR,而不能是SERVER。DB=database;注:可以是DB,也可以DATABASE。DSN=;注:该项可以省略。UID=user;PWD=passwod例如:cnnb.ConnectionString="Provider=MSDASQL;"_+"DRIVER={SybaseSystem11};"_+"SRVR=serveru;"_+"DSN=;"_+"DB=dataa;"_+"UID=sa;"_+"PWD=dqwe"_
3.对于Oracle数据库:

[PROVIDER=MSDASQL;]DRIVER={DriverName};SERVER=server;databasename=database;databasefile=path;DSN=;UID=user;PWD=password;例如:cnnc.ConnectionString="Provider=MSDASQL;"_+"DRIVER={MicrosoftODBCforOracle};"_+"SERVER=Webserver;"_+"DSN=;"_+"databasename=dataall;"_+"databasefile=d:data;"_+"UID=dba;"_+"PWD=zxcv"

  4.对于Informix数据库:
[Provider=MSDASQL;]Driver={DriverName};Host=IPAdress;Database=database;UID=user;PWD=password;FetchBufferSize=integer;NoLoginBox=Yes;Options=;Protocol=TCP/IP;ReadOnly=No;ServerOptions=;ServerType=InformixVersion例如:cnnd.ConnectionString="Provider=MSDASQL;"_+"Driver={OpenLinkGeneric32BitDriver};"_+"Host=11.66.17.151;"_+"Database=pubs;"_+"UID=sa;"_+"PWD=asdf;"_+"FetchBufferSize=30;"_+"NoLoginBox=Yes;"_+"Options=;"_+"Protocol=TCP/IP;"_+"ReadOnly=No;"_+"ServerOptions=;"_+"ServerType=Informix7.2"

  注:[]中的内容可以省略。


  五.实例一瞥:

  服务器安装windows2000Server操作系统,以Sybase11.9.2数据库作为服务器端数据库管理数据;客户端安装Windows98,Sybase客户端程序OpenClient,以VisualFoxPro6.0数据库作为客户端开发工具。扬长避短,相得益彰,充分发挥Sybase数据库安全性、可靠性高,管理数据量大;VisualFoxPrp6.0数据库开发人员熟悉,开发速度快,程序体积小,运行速度快,占用资源少的特点。

  以Sybase11.9.2为例,编制一个实用的学籍管理程序,以期达到抛砖引玉的效果;数据库名称为Studentdb,只包括一个表(Student),其结构如下:
字段名称宽度注释
codenchar(22)代号
namechar(8)姓名
birthdaynchar(8)生日
gradeint年级
classint班
tuitionnumeric(7,2)学费
mathsnumeric(5,2)数学
chinesenumeric(5,2)语文
physicsnumeric(5,2)物理
chemistrynumeric(5,2)化学
historynumeric(5,2)历史
geobiologynumeric(5,2)地理
biologynumeric(5,2)生物
gymnumeric(5,2)体育
           
  调试程序时需要注意以下问题:
  ①.服务器端Sybase数据库服务必须处于启动状态;
  ②.客户端安装必须选中“√”ODBCDriver组件;
  ③.客户端通过OpenClient程序组中的Dsedit组件配置连接,具体连接操作过程如下:“Dsedit”→“AddServerObject”→输入服务名称(ServerName)→“OK”→“单击”选择所输入服务名称→“单击”“ServerAddress”→“右键”→“ModifyAttributes”→“Add”→选择“TCP”协议→“NetworkAddress”在此输入IP地址和端口号,例:10.23.12.120,5000→“PingServer”测试是否连通,否则检查机器连接或重复上述过程。
  ④.注意两种数据库数据类型的对应关系如下表:

VisualFoxPro6.0数据库数据类型Sybase数据库数据类型
字符型(C)Char
nchar
nvarchar
varchar
货币型(Y)money
smallmoney
数值型(N)decimal
numeric
浮动型(F)无
日期型(D)无
日期时间型(T)datetime
Smalldatetime
双精度型(B)float
Real
整型(I)Int
smallint
tinyint
逻辑型(L)Bit
备注型(M)Text
通用型(G)image
字符型(二进制)(C)无
备注型(二进制)(M)binary
varbinary
关键程序段:

  *连接远程数据源
PROCEDUREActivatewaitwindowat12,20nowait"请稍后!正在连接远程数据源......"VarDriver=THISFORM.Text1.ValueVarServer=THISFORM.Text2.ValueVarDatabase=THISFORM.Text3.ValueVarUser=THISFORM.Text4.ValueVarPassword=THISFORM.Text5.ValueStoresqlstringconnect("Provider=MSDASQL;DRIVER={"+alltrim(VarDriver)+"};DSN=;SRVR="+alltrim(VarServer)+";DB="+alltrim(VarDatabase)+";UID="+alltrim(VarUser)+";PWD="+alltrim(VarPassword))toConnHandle&&ConnHandle为连接句柄ifConnHandle<0=messagebox(space(4)+"连接远程数据源失败!原因如下:"+chr(10);+"1.“SYBASE信息”参数配置不正确;"+chr(10);+"2.SYBASE服务("+alltrim(upper(VarServer))+")未启动。",16,"错误提示:")waitclearcloseallreturnelsewaitclear……=sqldisconnect(ConnHandle)endifENDPROC……PROCEDURERelease=sqldisconnect(ConnHandle)closeallENDPROC

  *查询
&&结果存入自定义游标MathsCursor=sqlsetprop(ConnHandle,'batchmode',.T.)&&设置一次返回所有结果集=sqlprepare(ConnHandle,"selectcode,name,grade,class,mathsfromstudentwheregrade='"+Vargrade+"'andclass='"+Varclass+"'","mathscursor")=sqlexec(ConnHandle)……*表单中加入页框控件,表格控件THISFORM.Pageframe1.Page1.Grid1.RecordSource="mathscursor"THISFORM.Pageframe1.Page1.Grid1.RecordSourceType=1&&别名THISFORM.Pageframe1.Page1.Grid1.Column1.ControlSource="mathscursor.code"THISFORM.Pageframe1.Page1.Grid1.Column2.ControlSource="mathscursor.name"THISFORM.Pageframe1.Page1.Grid1.Column3.ControlSource="mathscursor.grade"THISFORM.Pageframe1.Page1.Grid1.Column4.ControlSource="mathscursor.class"THISFORM.Pageframe1.Page1.Grid1.Column5.ControlSource="mathscursor.maths"……

  *修改
=sqlsetprop(ConnHandle,'transactions',2)&&设置人工事务处理=sqlprepare(ConnHandle,"updatestudentsetgrade=grade+1")&&新年升级处理=sqlexec(ConnHandle)ifmessagebox("确定修改所输入数据信息吗?",4+32,"运行提示:")=6=sqlcommit(ConnHandle)else=sqlrollback(ConnHandle)THISFORM.text1.setfocusendif……

  *删除


Vargrade=THISFORM.Text1.Value=sqlsetprop(ConnHandle,'transactions',2)&&设置人工事务处理=sqlprepare(ConnHandle,"deletefromstudentwheregrade='"+Vargrade+"'")=sqlexec(ConnHandle)ifmessagebox("确定删除所输入数据信息吗?",4+32,"运行提示:")=6=sqlcommit(ConnHandle)else=sqlrollback(ConnHandle)THISFORM.text1.setfocusendif……

  *增加
Varcode=THISFORM.Text1.ValueVarname=THISFORM.Text1.Value……=sqlsetprop(ConnHandle,'transactions',2)&&设置人工事务处理=sqlprepare(ConnHandle,"INSERTINTOstudent(code,name,birthday,grade,class,tuition,maths,chinese,physics,chemistry,history,geobiology,biology,gym);VALUES('"+Varcode+"','"+Varname+"','"+Varbirthday+"',"+Vargrade+","+Varclass+","+Vartuition+","+Varmaths+","+Varchinese+","+Varphysics+","+Varchemistry+","+Varhistory+","+Vargeobiology+","+Varbiology+","+Vargym+")")=sqlexec(ConnHandle)ifmessagebox("确定增加所输入数据信息吗?",4+32,"运行提示:")=6=sqlcommit(ConnHandle)else=sqlrollback(ConnHandle)THISFORM.text1.setfocusendif……

  

爱华网本文地址 » http://www.413yy.cn/a/25101011/59483.html

更多阅读

浅析维普数据库的特色与应用 维普中文期刊数据库

本文分析了维普数据库在标引、检索与利用上的特点,并提出了相应对策。随着电子信息产业的迅猛发展,以及信息的数字化、网络化的发展方向,期刊全文数据库得到了迅猛发展,先后产生了五大期刊数据库。它们对现代信息技术和现代信息服务

PostgreSQL数据库完美备份恢复 数据库的备份和恢复

最后执行备份指令:view plainprint?pg_dump-h164.82.233.54-Upostgresdatabasename>C:databasename.bak指令解释:如上命令,pg_dump 是备份数据库指令,164.82.233.54是数据库的ip地址(必须保证数据库允许外部访问的权限哦~),当然本地的数据

ADO对象 关系数据库的一对多

ADO 对象模型对象或集合 说明内容Connection 对象 代表与数据源的唯一会话。在使用客户端/服务器数据库系统的情况下,该对象可以等价于与服务器的实际网络连接。Connection 对象的某些集合、方法或属性可能不可用,这取决于提供者支持

气旋与反气旋的形成,科氏力在其中产生的效应 反气旋

气旋与反气旋的方向不同,主要是因为地球存在科氏力(科里奥利力)的作用。它是对于地球上运动着的物体产生的力。北半球往右偏,南半球往左偏。而气旋是北(南)半球,大气中水平气流呈逆(顺)时针旋转的大型涡旋。所以科氏力的存在导致气旋与反气

声明:《VisualFoxPro6.0与大型数据库的无"数据源"连接 foxpro数据库》为网友草戒指分享!如侵犯到您的合法权益请联系我们删除