当前位置: 代码迷 >> VFP >> 局域网多用户共用表解决思路
  详细解决方案

局域网多用户共用表解决思路

热度:8509   发布时间:2013-02-26 00:00:00.0
局域网多用户共用表
在程式运行时用哪种方式打开DBF文件 可以不影响其他用户也使用这个表呢?
现在情况是某个表 当有人打开之后 其他人要用的话就会提示 文件不能存取!
怎么解决呢?

------解决方案--------------------------------------------------------
 
数据共享程序设计

如果创建的应用程序在网络环境中的多台计算机上运行,或者一个表单的多个实例对相同的数据进行访问,这时就需要进行共享访问程序设计。共享访问不仅能为用户使用数据和数据共享提供更有效的方法,而且可以在必要时对访问进行限制。
VFP支持如下功能:对数据的共享或独占访问;锁定选项;数据工作期;记录缓冲和表缓冲以及事务处理。尽管这些功能主要应用在共享环境里,但在单用户环境下也可以使用。
一、控制对数据的访问
因为访问数据是在文件里进行,所以有效的数据管理首先从控制这些文件开始。您需要选择访问数据的方式,还要选择在什么时间、如何限制对数据的访问。
1、访问数据
在共享环境中,可以用两种方式访问数据:从独占文件中访问或从共享文件中访问。若打开一个共享访问的表,其他用户也可以对该文件进行访问;若打开一个独占访问的表,其他用户就不能对该表进行读写。独占访问不具备在网络环境中共享数据的许多优点,所以应该避免使用。
1)以独占方式使用表
打开一个文件最严格的限制方式就是独占方式。通过界面打开一个表时,默认情况下是独占使用的,也可以利用VFP命令明确地以独占方式打开一个表。
如果要打开一个独占使用的表,可以在命令窗口中输入如下命令:
SET EXCLUSIVE ON
USE cMyTable
或者在命令窗口中输入:
USE cMyTable EXCLUSIVE
下列命令要求以独占方式打开一个表:
·ALTER TABLE
·INDEX:当创建、添加或删除一个复合索引标志时。
·INSERT [BLANK]
·MODIFY STRUCTURE:如果要以此命令更改一个表结构,必须以独占方式打开该表。但是,当以共享方式打开这个表时,只能在只读方式下使用此命令。
·PACK
·REINDEX
·ZAP
在一个共享表中执行上述命令,VFP将返回出错信息:“文件必须以独占方式打开”。
可以使用FLOCK()函数限制对表的访问。如果使用FLOCK()锁定表,则其它用户不能对该表进行写操作,但可以读该表。

2)以共享访问方式使用表
以共享方式打开一个表时,多个工作站可以同时访问该表。通过界面打开表时,可以不理会SET EXCLUSIVE默认的ON设置,而明确地用VFP命令打开一个表供共享使用。
若要打开一个共享使用的表,可以在命令窗口中输入下列命令:
SET EXCLUSIVE OFF
USE cMyTable
或者:
USE cMyTable SHARED
当在一个共享表中添加或更改数据时,必须首先锁定要更改的记录或整个表。对一个以共享方式打开的表或记录,可通过下列方式进行锁定:
·使用命令来自动锁定记录或表。
·用记录和表锁定函数,人工锁定一个或多个记录。
·用CURSORSETPROP()函数设置缓冲。
与共享表相关的备注和索引文件也是以共享方式打开的。如果应用程序所使用的表只用于查找数据,而该应用程序的所有用户都要访问它,那么将该表标记为只读可以提高性能。

2、锁定数据
如果要共享访问文件,必须通过锁定表和记录来对这种访问进行管理。锁定不同于访问允许权限,它既可以对数据进行长期控制,也可以短期控制。VFP提供自动和人工锁定方式。

1)选择记录或表锁定
无论是哪一种锁定方式,目的都是为了防止两个用户同时写一个记录。表锁定用来防止其他用户向表中写入,但允许读整个表。由于表锁定阻止其他用户更新表中的记录,因而很少使用。

2)人工或自动锁定
除了选择记录锁定还是表锁定,还可以选择自动锁定或人工锁定,许多VFP命令在执行之前都会自动锁定一个记录或一个表,如果成功锁定了记录或表,则继续执行该命令,然后再解锁。下面列出了自动锁表和记录的命令:
命令 锁定范围
——————————————————————————
ALTER TABLE 整个表
APPEND 整个表
APPEND BLANK 表头
APPEND FROM 整个表
APPEND FROM ARRAY 表头
APPEND MEMO 当前记录
BLANK 当前记录
BROWSE、CHANGE和EDIT 一旦开始编辑字段,锁定对象为当前记录和相关表中别名字段的所有记录
CURSORSETPROP() 取决于参数
DELETE 当前记录
DELETE NEXT 1 当前记录
DELETE RECORD n 记录n
DELETE 删除多个记录 整个表
DELETE-SQL 当前记录
GATHER 当前记录
INSERT 整个表
INSERT-SQL 表头
MODIFY MEMO 编辑开始时,锁定当前记录
READ 当前记录和别名字段的所有记录
RECALL 当前记录
RECALL NEXT 1 当前记录
RECALL RECORD n 记录n
RECALL 恢复多个记录 整个表
REPLACE 当前记录和别名字段的所有记录
REPLACE NEXT 1 当前记录和别名字段的所有记录
REPLACE RECORD n 记录n
REPLACE 替换多个记录 整个表和别名字段的所有记录
SHOW GETS 当前记录和别名字段引用的所有记录
TABLEUPDATE() 取决于缓冲
UPDATE 整个表
UPDATE-SQL 整个表

3)记录锁定的特点
锁定记录的命令比锁定表的命令破坏性要小。锁定一个记录时,其他用户仍然可以添加或删除其他记录。如果记录或表已经被其他用户锁定,或者表已经被其他用户用独占方式打开,则锁定记录或表的操作失败。如果不能锁定记录,则尝试锁定当前记录的命令将返回出错信息“其他用户正在使用记录”。
BROWSE、CHANGE、EDIT和MODIFY MEMO命令只有在编辑时才锁定记录。如果您正在编辑来自相关表记录中的字段,那么该相关记录可能会被锁定。如果当前记录或相关记录已被其他用户锁定,则锁定失败。如果锁定成功,则可以编辑该记录;在移到另一个记录或激活其他窗口时,记录解锁。

4)表头和表锁定的特点
一些VFP命令锁定整个表,而有些命令则只锁定表头。表锁定命令比表头锁定命令更加严厉。锁定表头时,其他用户不能添加或删除记录,但可以修改字段内的数据。
当发出APPEND BLANK命令时,用户可以共享表而不发生冲突,但是当其他用户也向该表追加一个空白记录时,就会出错。出错信息是:“其他用户正在使用文件”。这个信息表明有两个或两个以上的用户在同时执行APPEND BLANK命令。如果无法锁定一个表,则锁定整个表的命令将返回一个错误信息:“其他用户正在使用文件”。要取消正在进行的锁定操作,可按[ESC]键。

5)自动锁定示例
在下面的示例中,即使customer表是以共享方式打开的,用户为了从其他表追加记录也将自动锁定整个表。
SET EXCLUSIVE OFF
USE customer
APPEND FORM oldcust FOR state="OPEN"

6)人工锁定
您可以用锁定函数人工锁定一个记录或一个表。这些函数有:
RLOCK() LOCK() FLOCK()
RLOCK()函数等同于LOCK()函数,都可以锁定一个或多个记录;FLOCK()锁定一个文件。LOCK()和RLOCK()函数可以用户锁定表头,如果把0作为记录编号提供给LOCK()或RLOCK(),而且测试表明表头没有锁定,则该函数将锁定表头并返回.T.。
如果锁定一个记录或一个表,那么一定要尽快解锁,以便其他用户访问。解锁可使用UNLOCK命令。
这些人工锁定函数可以完成如下操作:
*测试记录或表的锁定状态。
*如果测试表明该记录没有锁定,则将该记录锁定并返回.T.。
*如果该记录或表不能锁定,则根据SET REPROCESS的当前设置,再次进行锁定。
*返回.T.或.F.,表明锁定尝试是否成功。

注意:如果不想锁定记录,而测试该记录的锁定状态,请使用ISRLOCKED()或ISFLOCKED()函数。
  相关解决方案