论坛登陆 注册 文章专区 投稿文章 旧版浏览
首页 | 页界资讯 | 安全动态 | 网络应用 | 组网技术 | 软件应用 | 工具软件 | 网管知识 | 帮助
文学 | 操作系统 | 注 册 表 | 编程语言 | 数 据 库 | 服 务 器 | 网页设计 | 图形图象 | VIP
论坛 | 网络安全 | 安全防范 | 黑客技术 | 硬件学堂 | 路由技术 | 搜索研究 | 站长经验 | 投稿
专题 | 教育频道 | 特色专题 | 精文荟萃 | 聊天通讯 | 网络文学 | 论坛社区 | 广告服务 | 旧版
设为首页 加入收藏
当前位置:首页>>文章>>数据库>>FoxPro>>正文

Foxpro 网络版软件初步

www.xker.com 作者:不详 来源:网络转载 加入日期:2005-11-18 7:31:15
Foxpro 网络版软件初步:

一、原则

网络软件的最重要原则就是不能两个人同时修改一个数据。否则就会造成冲突,不知以谁的修改为准。

二、普通的解决办法

最普通的办法是在要修改数据时将数据表以独占方式打开,所谓“独占”就是使得数据只能自己使用,而别人不能使用,既不能修改,也不能查看。独占打开表的命令是在 use 命令中加 exclusive 子句,比如:

use rsda exclusive

这样就不会出现两个人同时修改一个数据的情况了。

三、共享数据

如果您只是查看数据,而不进行修改,那么您应该以共享方式打开表,否则别人也就没办法查看数据了,如果大家都是查看,不会有任何的冲突发生,即使查看的是同一个数据。

共享方式打开表的命令是 use ... share ,比如:

use rsda share

对于数据库也是一样的处理:

open database ... share

独占打开则是:

open database ... exclusive

四、友好的提示

如果您以独占方式打开了表,别人无论用独占或共享方式打开表都会出错,错误是“不能存取文件”,错误代码是1705;另外如果有人以共享方式打开了表,其它人试图以独占方式再打开,也会出现同样的错误。

如果在程序中出现这样的错误,可能使操作者莫名其秒,如果能给出比较友好的提示就好了,方法是用 on error 语句捕捉错误,一旦捕捉到错误即给出一个友好的提示,比如在需要共享打开数据时:

on error err=error()
*上面这条就是捕捉错误的陷井,如在下面任何地方出现错误就将错误代码存入err变量,并不显示错误。
use rsda share &&如果这时出现错误,错误代码就会存入err,并且表不会打开,也不会出现错误提示。
if err=1705 &&如果错误代码是1705
*给出自己的提示
messagebox('数据正在被其它人修改,您暂时不能使用,请稍后再试。',16,'注意')
endif
on error &&取消捕捉错误

或者在需要独占打开数据时:

on error err=error()
use rsda exclusive &&以独占方式打开表,如果有人已打开表则会出错,不论是独占还是共享。
if err=1705
messagebox('数据正在被其它人使用,您暂时不能进行修改,请稍后再试。',16,'注意')
*因为操作人员可能并不懂什么叫独占,而此时以独占方式打开表,肯定是要修改,故告诉他不能修改。
endif
on error

五、提高网络效率

学了以上的知识,您就可以编一个简单的网络软件了,但是这种软件的网络效率很低,为什么这么说呢?因为一旦有人独占数据,其它人就都不能看了,假如有几十个人要看这个数据,而该数据又被某人独占,可想而知其工作效率的低下。另外一个缺点就是可能始终都有人在以共享方式打开表,您根本没有机会对数据进行修改。

为了解决效率问题,因此引进“锁”的概念,锁的意思就是将数据锁上后,别人不能修改但可以查看,而且在别人查看时也可以对数据进行加锁修改,这样就解决了上面所说的问题。

给整个表加锁的命令为一个函数:

FLOCK([工作区|别名])

即给指定工作区或别名的表加锁,如果省略工作区或别名,则给当前工作区的表加锁。

该函数的返回值为逻辑值,如果返回“真”,代表加锁成功,如果“假”,则不成功。假如加锁不成功,表明有其它人已经锁住了该文件,目前您不能对其进行加锁,也就是不能修改其中的内容,但您可以查看。

讲到加锁就不能不讲一下这个命令:

SET REPROCESS TO 次数 [SECOND] | TO AUTOMATIC

这个命令的意思是设置尝试加锁的次数或时间。如果 set reporcess to 1,那么当执行 flock() 时,如果不成功立即就返回 .f. ,如果设置为5,那么系统会连续尝试锁5次,如果5次都不成功加锁函数才返回 .f. ,如果跟上 SECOND 子句,则会连续加锁5秒钟。

隐含设置为 set reporcess to 0,系统将会无限次加锁,至到成功为止,并返回 .t. ,期间可按 ESC 键中止尝试,则返回 .f. ,set reporcess to automatic 也是同样的意思。

如果设置 set reporcess to -1 ,那么不但是无限次加锁尝试,而且不能按 ESC 中止,这一般都是不会用到的。

在程序中我们一般只需要试1次就行了,故一般在程序开头设置 set reporcess to 1。

一个典型的加锁程序如下:

select rsda
jscg=flock()
if jscg
*进入数据的修改处理

else
messagebox('其它人正在修改数据,您不能修改,请稍后再试。',16,'注意')
endif

数据修改完后应尽快将锁解除,以便他人能够进行数据修改,解锁的命令为:

UNLOCK

注意

那么是不是说有了锁,独占打开表的方式就没有用了?不是的,有些操作必须要独占整个表,比如这些命令:INSERT, INSERT BLANK, MODIFY STRUCTURE, PACK, REINDEX, and ZAP 。因为它们会使表中的所有记录发生改变或者使表的结构发生改变,那么此时其它人是不能查看数据的。当您的表不是以独占方式打开,系统将会拒绝执行这些命令。

六、 进一步提高效率

如果为了改一条记录,而去锁住整个表,这样的效率也不怎么样。为此有了记录锁 rlock() ,该函数的格式为:

RLOCK([工作区|别名]
| [记录号列表, 工作区|别名])

比如:

rlock('1,3,5','rsda')

可将记录号为1、3、5的记录锁住。如果省略记录号则锁住指定工作区(或别名)的当前记录,如省略工作区(或别名),则锁定当前工作区的当前记录。如使用了记录号列表,必须有工作区(或别名),如只指定一个记录(不是列表),可没有工作区(或别名),且用数值指定,比如:

rlock(5)

注意

如果要锁住多条记录,必须设置 set multilock on,如果是 set multilock off,则只有最后一条加锁的记录被锁住。

有了这个函数就可以锁住一条或多条记录,这样就不至于为了改一条记录,而使得其它所有记录都不能被别人修改。在许多网络软件中,都有多人同时向一个表里输入数据的情况,这就要求软件一定不能经常出现由一个人将整个表锁住的情况。

另外有一个函数 lock() ,它与 rlock() 的功能是完全一样的。

上一篇:Foxpro RUSHMORE 技术
下一篇:Foxpro 类

关闭窗口】【浏览次数:】【发送给好友】【收藏此页
相关文章 最新文章 热门文章

·个人SMTP服务器的配置
·通过E-mail 共享Java 对象
·你的email服务器准备好应对账号搜集攻
·Server 2003中为SNMP服务配置网络安全
·Server 2003为SMTP邮件中继服务器配置
·不花一分钱, 轻松打造自己的电子邮局
·用CMailServer打造邮件服务器
·G容量邮件服务器DIY
·Exchange 2000 Server的常见问题
·用Windows Server 2003架设小型邮件服
·系统优化 专题
·QQ密码丢失后能做的事情:快速找回密码
·最经典的黑客入门教材
·怎样查找对方的IP地址
·找回QQ密码的注意事项 
·实战系统虚拟利器——MS VPC 2004
·DMA让你的硬盘速度飞起来
·电脑初学者必备之Windows进程大全
·Dreamweaver视频教程
·让你的网速快到不可思议
评论 本站声明
【注】 发表评论必需遵守以下条例:
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款
  • 本站大部分为网络转载,如有版权问题,请通知我们,我们立即更正!

设为首页 - 版权声明 - 广告服务 - 关于我们 - 联系我们 - 友情连接
Copyright © 2003-2005 xker.com All rights reserved. 网站合作、广告联系QQ:12231446
小新技术网 冀ICP备05002857号