Visual Foxpro中的多用户及数据缓冲问题

本文详细探讨了Visual Foxpro在多用户环境下处理数据缓冲的问题,包括行缓冲和表缓冲机制,以及如何处理并发编辑冲突。通过缓冲和锁定策略,确保数据的安全性和一致性。文章介绍了缓冲的自动读写、错误处理机制,并提供了处理冲突的代码示例,帮助开发者理解如何在VFP中优雅地管理多用户数据交互。
摘要由CSDN通过智能技术生成

主题:Visual Foxpro中的多用户及数据缓冲问题

绍 

很多狐友(Foxers)都是从Dbase―FoxBase―Foxpro―VFP这样一条路走过来的,如果说从FoxBase Foxpro是一次飞跃,那么从FoxproVFP就是一次升华。漫漫编程路上的两次大变化都伴随着升级的兴奋与适应的痛苦,惯性思维往往使我们容易忽略新版本的新内容。我们先来看看下面这个在表单中编辑记录的例子:

Foxpro 2.X时代,我是这样设计的:

1、   在屏幕上放置与表中字段对应的文本框(TEXT)控件,用来存放相应的内存变量(如M.CUST_IDTM.NAME等);

2、   当用户将表的指针定位到某一特定记录时(比如按了"下一个记录"按钮),就用scatter memvar 语句把该记录的所有字段传给相应的内存变量,再用show get来刷新屏幕上的文本框中显示的值。在这一时刻,用户是不能编辑这些变量的(此时文本框或者被设置为不可用(Disabled),或者其when子句返回的是.F.值),因为用户处在"浏览"状态。

3、   当用户选择了"编辑"按钮时,程序就锁定该记录(如果无法锁定,则显示提示信息),然后检测每个字段值和相应的内存变量值(如果有不同的,说明一定是有其它用户在我们进入编辑状态后修改并保存了记录,在这种情况下,要显示提示信息),之后再用scatter memvarshow get语句刷新,这样用户就看到记录中的当前值了;

4、   如果所有字段和相应的内存变量完全匹配,就把变量所在的文本框控件都设置为可用(Enabled)或都让when子句返回.T.,以便让用户可以来编辑这些变量;

5、   当用户选择了"保存"按钮时,根据一定的规则对输入的数据进行检验,然后用gatter memvar语句将内存变量写回到记录中,并对记录解锁(unlock),再把所有的内存变量所在文本框设置为不可用(Disabled),或者让其when子句返回.F.值,这时,用户又回到了"浏览"状态。

请注意,在这一过程中我们没有直接读写记录,而是先将各字段值赋给同名内存变量,再让用户编辑这些内存变量,如果一切正常再把这些内存变量写回到记录当中。之所以用这种方法主要是为了保护表,如果不符合验证规则,就不允许数据回存到表中。另一点要注意的就是,当用户编辑记录时要对记录加锁(lock),这样就防止了其它用户在同一时间编辑同一条记录。但是,这种方法有一个很大的缺点:假设一个用户开始编辑某一记录,在他按下"保存"按钮前,记录一直处于锁定状态,如果此时该用户有事暂时外出,如午餐,那么其它用户就不能对该记录进行编辑了L

当然,你可以不在进入"编辑"状态时加锁,而只在"保存"记录之前加锁,保存完后马上解锁,这样可以使记录被锁定时间最短,以便其它用户有充分的时间编辑该记录。但是这也有缺点,试想:如果用户编辑了内存变量,这后点击"保存",可如果其它用户在你点"保存"之前也编辑了这条记录,并且还没保存,这时会发生什么现象呢?你的保存要覆盖他人的修改吗?要放弃你的修改吗?这些都是我们要在设计时认真考虑的问题。

我们如此费尽心机地设计,其目的都是为了保护数据。如果你写的程序只是你一人使用,那设计起来可能会简单得多:你可以直接读取记录中的字段,比如你可以直接在屏幕中browse一个表,这样你输入的内容就直接写进记录了。但是,我们不能担保那些最终用户也象您一样都清楚能输入什么不能输入什么,我们不得不在用户与数据表之间建立一个"防火墙"来保护数据。在Foxpro 2.X中创建这样的"防火墙"要写一大堆的代码!

值得我们高兴的是,VFP提供了内建的"防火墙"机制,它有两方面的作用:一是可直接读取记录,二是只允许通过所有检验规则的数据被写回。这一机制就是缓冲。

缓冲

在刚才我们讲到的例子中,是通过内存变量存贮记录内容,这种方法可以被认为是手工建立了一个数据缓冲器,通过使用scatter memvar把数据从记录中传送到"缓冲"中,再用gather memvar从"缓冲"中传回到记录。

VFP不仅能自动进行单条记录的缓冲(称为行缓冲或记录缓冲),而且还支持另一种类型的缓冲,即表缓冲,表缓冲可通过缓冲器存取多条记录。行缓冲一般用于一次存取一个记录时,这种机制普遍应用于数据录入,就象前文提到的那样:用户可以在表单中显示或编辑单条记录。表缓冲则适用于一次更新多条记录,比如一张订货单的明细录入屏幕,通过对物品明细表使用表缓冲,可以允许用户编辑多条明细记录,最后一次性地将所有明细记录保存或放弃。

除了两种缓冲机制,VFP还有两种锁定机制。前文讲述的那种在Foxpro 2.X中的加锁方式被称为保守式锁定法(或悲观锁定法)――当用户选择"编辑"时加锁,直到用户选择了"保存"后再解锁。这种加锁机制确保了当本用户修改记录时其它用户都不能修改该记录,但这样做有利有弊,视具体情况而定。前文所讲的另一种加锁方式叫做开放式加锁法(或乐观锁定法)――只有在写回记录时才锁定该记录,然后马上解锁。这种加锁机制虽然使记录最大时间内可给别的用户使用,但我们必须处理当两个用户同时编辑记录时所造成的冲突。正如我们下面将要看到的,这对于VFP来说真是太简单了,在VFP中大多数的情况下都选用开放式缓冲机制。

因为在VFP中记录可以被自动缓冲,所以就不必再用"人工缓冲"机制了,换句话说,现在我们可以直接读记录中的字段而不必关心为每个字段设内存变量。要保存修改,我们只要简单地告诉VFP将缓冲器中的内容写到表中即可,若是取消修改,告诉VFP不写入即可。过会儿我们将看到这是如何操作的。

当打开一个表时,VFP创建一个"临时表"(cursor)作为缓冲器,这个"临时表"用来定义表的属性。对于本地表来说,"临时表"的唯一属性是用来定义缓冲方式的的,视图和远程表还有一些本文讨论范围之外的其它属性,这些属性的值用CursorSetProp()函数设置,用CursorGetProp()取得。我们过会儿将看到如何使用这些函数。

当追加记录时,表缓冲有一个有趣的特性:随着记录添加到缓部器中,它们被赋予一个负记录号,第一个加入的记录,recno()返回值为-1,第二个返回值为-2,依此类推。你可以用一个带负数的go命令在缓冲中定位到追加的记录上。这在处理记录号时很有用,比如为了确认变量InRecno是否为一个可用的记录号,在缓冲状态下,要检测between(InRecno,1,reccount()) OR InRecno<0 而不能只用between(InRecno,1,reccount())

使用缓冲

缺省情况下缓冲器是关闭的,这种情况下在更新表时VFPFoxpro 2.X是一样的,要使用缓冲你必需将它打开。缓冲适用于自由表及数据库中的表。要用缓冲还要set multilocks on,因为multilocks缺省值是OFF,如果你忘了设置其值为ON,会出现错误信息。你可以把multilocks=ON加入到CONFIG.FPW文件中,或是用"工具"栏下的"选项"功能保存其值为ON

我们通过

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值