关于vfp锁住和解锁数据表程序代码

关于vfp锁住和解锁数据表程序代码,第1张

Form1(控件) Init(事件)下同

et safety off &&设置覆盖文件时d出对话框

set exclusive off &&设置数据表打开方式为共享

thisform.list1.clear &&清空列表框控件中内容

mydatabase=sys(5)+sys(2003)+"\database\database.dbc"

set exact off &&设置字符非精确比较

open database "&mydatabase" &&打开数据库

display tables to file temp.txt noconsole &&显示当前数据库中的所有表名和表的路径信息

mystr=''

handle=fopen("temp.txt",2)

do while feof(handle)=.f.

mystr=fgets(handle)

if alltrim(mystr)="表位于" or alltrim(mystr)="名称"

cname=""

else

cname=alltrim(left(mystr,at(":",mystr)-2))

endif

if !empty(cname)

thisform.list1.additem(cname) &&添加数据项

*分别在不同工作区中打开数据表

if !used(sys(5)+sys(2003)+"\database\"+cname)

select 0

tabname=sys(5)+sys(2003)+"\database\"+cname

use "&tabname"

endif

endif

enddo

fclose(handle)

Command1 Click

if !empty(thisform.list1.value)

myalias=alltrim(thisform.list1.value)

select &myalias.

if flock("&myalias")

thisform.label1.caption="数据表被锁定!"

else

thisform.label1.caption="数据表锁定不成功!"

endif

endif

Command2 Click

if !empty(thisform.list1.value)

myalias=alltrim(thisform.list1.value)

unlock in &myalias. &&解锁数据表

thisform.label1.caption="数据表已解除锁定!"

endif

List1 InteractiveChange

if !empty(thisform.list1.value)

myalias=alltrim(thisform.list1.value)

select &myalias.

endif

do case

case sys(2011)="Record Unlocked"

thisform.label1.caption=myalias+" 没有被锁定!"

case sys(2011)="File Locked"

thisform.label1.caption=myalias+" 被锁定!"

case sys(2011)="Exclusive"

thisform.label1.caption=myalias+" 以独占方式打开!"

endcase

如果要共享访问文件,也必须要通过锁定表和记录来管理对数据的访问。锁定不同于访问权限,提供了对数据的长期和短期控制。Visual FoxPro

提供自动和手动两种锁定。

选择记录或表锁定

记录锁定,无论是自动还是手动,都是防止一个以上的用户同时写一个记录。表锁定防止了其他用户的写入,而不是读取整个表。由于表锁定阻止了其他用户更新表中记录,而应当避免使用。

选择自动或手动锁定

除记录或表锁定以外,还可以选择自动或者手动锁定。很多 Visual FoxPro

命令在执行之前都会尝试自动锁定一个记录或一个表。如果成功锁定了记录或表,则执行该命令,然后再释放该锁定。

自动锁定记录和表的命令

命令

锁定范围

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

整个表

记录锁定的特点

试图锁定记录命令的限制少于锁定表的命令。当锁定记录时,其他用户仍然可以添加或删除其他记录。如果记录或表已经被其他用户锁定,锁定记录或表的尝试失败。如果该记录不能被锁定,试图锁定当前记录的命令返回该错误“记录正在被其他用户使用”。

BROWSE,CHANGE,EDIT 和 MODIFY MEMO

命令只在编辑记录时才锁定记录。如果正在编辑相关表记录中的字段,则相关记录可能被锁定。如果当前记录或任何相关记录也被其他用户锁定,则锁定尝试失败。如果锁定尝试成功,则可以编辑该记录;当移到其他记录或激活其他窗口时,该锁定被释放。

表头和表锁定的特点

某些 Visual FoxPro 命令锁定整个表,虽然其他命令只锁定表头。锁定整个表命令比锁定表头命令的限制更严厉。锁定表头时,其他用户不能添加记录,但仍然可以修改字段中的数据。

当发出 APPEND BLANK

命令时,用户可以共享该表而不会引起冲突,但当其他用户也在将空白(BLANK)记录追加到该表时会出现错误。可以捕获两个或多个用户同时执行 APPEND BLANK

时返回的“文件正在被其他用户使用”错误。如果不能锁定表,锁定整个表的命令返回“文件正在被其他用户使用”的错误。要取消锁定的尝试,按

ESC。

自动锁定

在下面示例中,用户通过追加其他表中的记录自动锁定表头,即使 customer 是作为共享文件被打开的:

复制代码

SET EXCLUSIVE OFF

USE customer

APPEND FROM oldcust FOR status = "OPEN"

手动锁定

可以使用下列锁定函数之一手动锁定一个记录或表:

RLOCK( ) 函数

LOCK( ) 函数

FLOCK( )

函数

LOCK( ) 和 RLOCK( ) 函数可用于锁定表头。如果提供 0

作为 LOCK( ) 或

RLOCK( ) 的记录并测试表明未锁定表头,该函数锁定表头并返回真(.T.)。

一旦锁定了记录或表,要确定通过使用 UNLOCK

命令释放该锁定,以尽快提供给其他用户访问。

这些手动锁定函数完成下列动作:

测试记录或表的锁定状态。

如果测试表明该记录未被锁定,则锁定该记录或表并返回真(.T.)。

如果不能锁定该记录或表,则根据 SET REPROCESS

的当前设置再次尝试锁定记录或表。

返回真(.T.)或假(.F.),表明锁定尝试是否成功。

提示:

如果要测试工作期中记录的锁定状态而不锁定该记录,使用

ISRLOCKED( ) 或 ISFLOCKED( )

函数。

 

如果锁定记录或表的尝试失败,SET REPROCESS 命令和当前错误例程将确定是否再次尝试锁定。SET REPROCESS

会影响不成功的锁定尝试结果。可以使用 SET

REPROCESS 控制锁定尝试的次数或时间。

下面示例以共享访问方式打开了 customer 表并使用 FLOCK( ) 尝试锁定该表。如果成功锁定该表,则

REPLACE ALL 更新表中的所有记录。UNLOCK

释放该文件锁定。如果由于其他用户已经锁定该文件或文件中的记录而不能锁定该文件时,将显示一条信息。

复制代码

SET EXCLUSIVE OFF

SET REPROCESS TO 0

USE customer&&共享打开表

IF FLOCK()

REPLACE ALL contact&&替换并解锁

WITH UPPER(contact)

UNLOCK

ELSE &&输出信息

WAIT "File in use by another." WINDOW NOWAIT

ENDIF

解锁数据

在共享环境下建立记录或文件锁定并完成了数据 *** 作之后,应尽快释放该锁定。有几种释放锁定的办法。有时,只是移到下一条记录就足以解锁数据。其他情况则需要明确的命令。

要解锁被自动锁定的记录,只需移动记录指针,即使设置了 MULTILOCKS ON。必须明确地移去手动锁定记录上的锁定,仅仅移动记录指针是不够的。

下表描述了手动和自动的记录和表锁定上命令的影响。

命令

作用

UNLOCK

释放当前工作区中记录和文件锁定。

UNLOCK ALL

释放当前数据工作期所有工作区中的所有锁定。

SET MULTILOCKS

OFF

允许建立新锁定的同时自动释放当前锁定。

FLOCK( )

在锁定文件之前释放受影响文件中的所有记录锁定。

CLEAR ALL,CLOSE ALL,USE,QUIT

释放所有记录和文件锁定。

END

TRANSACTION

释放自动锁定。

TABLEUPDATE(

)

更新该表后释放所有锁定。

警告:

如果记录在自定义函数中被自动锁定并且移开记录指针然后又移回该记录时,锁定将被解除。使用表缓冲避免该问题。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/9690174.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-01
下一篇2023-05-01

发表评论

登录后才能评论

评论列表(0条)

    保存