论文部分内容阅读
摘要:本文分析了VFP中游标、数据缓冲、事务处理、数据备份和恢复的功能以及它们在提高数据表安全性中的应用。
关键词:Visual FoxPro 游标 视图 CursorAdapter 数据缓冲 事务处理
VFP即Visual FoxPro,它是由Foxpro发展而来的一种面向对象的数据库程序设计语言,使用VFP不仅能方便地创建和管理数据库,而且能够直接用来编制基于该数据库的信息系统。目前在我国,有相当一部分正在运行的应用程序是用VFP编写的,可以说,从操纵数据的角度来说,VFP的效率是最高的,使用它可以轻而易举的开发出一个实用的信息系统。但VFP也存在一些缺点,比如一些用VFP编写的应用系统在使用时,会因为机器的突然断电死机、用户的非正常退出等原因导致数据表的损坏及表中数据丢失,虽不是经常性的问题,一旦出现可能非要专业人员才能解决,为了防止这种现象发生,除了给应用系统提供一个稳定的平台,配备UPS,更换稳定的机器及网络设备外,还应从软件设计的本身采取一些提高数据表安全性的措施。
断电死机造成数据的损坏丢失是很常见的,只要是写磁盘文件时断电就会发生文件错误,Word程序也会遇到这种问题,但Word在断电时文件未被损坏,是因为它使用了临时文件,在Word打开某文件时,可以看到相应目录下产生的.Tmp文件即是。大多数的坏表是因为直接打开表后长时间的写入或修改,这样遇到断电几率就很大,VFP数据表的格式决定了它不具备自动备份和修复的功能,而设计员在程序中有没有考虑过这种断电情况的发生?采取了哪些避免方法?本文主要介绍了VFP中游标、数据缓冲、事务处理和数据备份恢复的功能以及它们在提高数据表安全性中的应用。
(一)游标(Cursor)
在VFP中,数据处理是围绕着游标(Cursor)进行的,Cursor虽然也是“表”,但它是属于“内存型”的,断电或意外退出,这个“表”就失效,便不存在安全性的问题。VFP数据库中的视图、表单数据环境中的表和SQL Select产生的查询结果都是Cursor。可以说,VFP灵活、强大的数据处理功能无一不归功于Cursor的参与,下面介绍一下游标的两种形式及应用:视图和CursorAdapter。
1、视图
视图是从一个表或多个表或其他视图上导出的“表”,它可以被看成是虚拟表或存储查询,兼具表和查询的特点:与查询相类似的是,视图可以用来从一个或多个相关联的表或视图中提取需要的信息,通过视图访问的数据不作为独特的对象存储在数据库内,数据库内存储的是SELECT语句,SELECT语句的结果集构成视图所返回的虚拟表;与表相类似的是,视图可以用来更新其中的信息,并将更新结果永久保存在磁盘上。在应用程序设计中,可以用视图使数据暂时从数据库中分离成为游离数据,以便在主系统之外收集和修改数据。
当我们用了视图之后,更改视图的同时表没有立即更改,而是在发送TableUpdate()函数后更改,从而提高了操作的安全性。创建和使用视图的方法很简单,由数据表创建一个视图,在更新条件选择“发送SQL更新”,便可以把它添加到数据环境中和表一样使用。
2、CursorAdapter
CursorAdapter基类是VFP8.0推出的一个最重要的、也是最精彩的新功能。它提供了一个统一、易用的数据接口,可以使用 CursorAdapter来访问本地数据和ODBC、ADO和XML这样的远程数据。VFP8.0重新设计了表单的数据环境,用可视化的方式来创建CursorAdapter后,只需要很少的工作就可以设置好那些对于取得和更新数据来说相当重要的属性。比如,DataSourceType属性表示要选用什么方式访问数据源,如果使用VFP表,就选择“Native”;Tables属性设置为所使用VFP表的表名;SelectCmd\属性是一个用来取得数据的 SQL Select 命令,可以设置为:select字段,字段from表名。设置完毕,就会在数据环境设计器中产生一个Cursor,然后像处理本地表一样处理这个Cursor,可以将其拖放到表单上实现与表单控件的绑定,用TableUpdate()函数来更新数据源。
CursorAdapter与视图有很多类似的地方:生成一个SQL select语句,定义哪些字段将被更新,设置关键字段,游标中取到数据后使用TableUpdate()函数发送更新到源表,但视图是数据库的概念,不具备编程语言的特点,它把整个过程作为一个整体看待,SQL Select语句是预先定义好的,无法动态去修改它。而对象化的 Cursor(处理)管理器CursorAdapter与数据库无关,它完全是程序设计上的概念,具备了面向对象程序设计的一切好处,很容易定义、改变和维护,可以很轻松的通过改动SelectCmd属性来改变取得什么数据。
(二)数据缓冲
数据缓冲是用来保护对表记录所作的数据更新及数据维护操作的一种技术。当一个表或视图设置成了缓冲属性后,VFP为启用数据缓冲的表在内存中开辟一个缓冲区,对表的一个或多个记录的修改先保存在缓冲区中,VFP并不直接对硬盘上的数据库进行操作,而是对缓冲区中的数据进行操作,确定记录要正式存入到表或视图中时,才直接通过对应文件连接到表或视图中一次性进行维护操作,这样可以撤消修改,用户可以决定是否将缓冲区中的数据更新表文件。数据缓冲是由CursorSetprop()函数来设定缓冲方式,由TableRevert()来取消对数据的修改,由TableUpdate()来提交对数据的修改。用缓冲的话,只有在用TableUpdate()提交对数据的修改时遇上断电才有可能坏表,大大减少了直接操作数据表的时间,从而达到断电死机等情况下保护数据表的目的。
VFP提供两种缓冲:记录缓冲和表缓冲。若一次只对一个记录进行访问、修改或写操作,选择记录缓冲。在一个多用户环境中,记录缓冲能够提供适当的有效性检查机制,对其他用户所做的数据更新操作影响最小。若要对多个记录的更新使用缓冲,选择表缓冲。
VFP以两种锁定方式提供缓冲:保守式和开放式。这两种方式决定了一个或多个记录何时被锁定,又是何时、怎样被解锁的。保守式缓冲:锁定当前记录,在发出TableUpdate()命令之后更新。在多用户环境中,保守式缓冲能防止其他用户在对某一特定记录或表正进行修改时访问它。保守式缓冲为单个记录的修改提供最安全的工作环境,但是会降低用户的操作速度。开放式缓冲:一直等到发布TableUpdate()命令,然后锁定并更新已编辑的记录。开放式缓冲是更新记录的有效方法,因为锁定只在写记录时生效,这样在多用户环境中使单个用户独占系统的时间最少。
缓冲访问数据的方法:
在表单的数据环境中,将数据表的属性BufferModeOverride设为3开放式行缓冲或5开放式表缓冲;
在"保存"代码中加入:
=tableupdate(.t.) &&实施对原表的更改在"还原"代码中加入:
=tablerevert(.t.) &&放弃所有表的更改
(三)事务处理
即便使用缓冲,有时也会出错,使用事务处理能保护更新操作。事务处理就是对修改的数据进行跟踪,它可以恢复修改过的数据,在机器突然死机断电、程序出错等引起程序中断的情况下会把数据恢复到修改前的状况。在应用程序中添加事务处理所提供的保护机制超过了记录缓冲和表缓冲提供的保护功能,它将整段代码作为一个受保护的、可恢复的单元。如果由于某种原因,系统不能执行对数据库的更新操作,就可以回滚整个事务处理,而不执行任何更新。
VFP提供了三个命令来控制事务处理:BEGIN TRANSACTION命令用来初始化一个事务处理,ROLLBACK命令用来取消最近一条BEGIN TRANSACTION 语句以来所做的全部修改,END TRANSACTION命令用来锁定记录,提交最近一条BEGIN TRANSACTION 语句以来对数据库中表所做的全部修改,然后解锁记录。一个事务处理起始于 BEGIN TRANSACTION命令,以 END TRANSACTION或ROLLBACK命令终止。为了保存所做的修改并终止事务处理,应发出 END TRANSACTION命令。如果事务处理失败(如服务器有故障或工作站有故障,以及没有提交事务处理就退出VFP),或者用户发出ROLLBACK命令,事务处理中的文件就恢复成原状态。
示例:
use 表名
begain tran &&开始事务处理
dele &&删除一条记录
rollback &&把删除的记录恢复回来
dele &&删除一条记录
end tran &&结束事务处理,清除事务处理跟踪日志
VFP使用事务处理的原则:事务以BEGIN TRANSACTION开始,以END TRANSACTION或ROLLBACK结束,必须成对使用;除非应用程序终止,事务一旦开始,直到遇到END TRANSACTION或ROLLBAKC语句期间,将保持有效;缓冲区中的数据比磁盘中的数据优先级高,即事务处理优先使用缓冲区中的数据;如果在事务处理过程中应用程序终止,则取消事务对表的所有操作;事务处理可以嵌套使用, 函数TXTLEVEL()确定当前事务处理的等级,最大值为5,表示事务最多嵌套五层,TXTLEVEL()为0表示当前无事务处理;BEGIN TRANSACTION和END TRANSACTION(ROLLBACK)采用最近优先原则匹配;最内层的更新优先于嵌套事务处理中的其他更新;直接或间接调用事务时,VFP自动加锁,直到END TRANSACTION(ROLLBACK)时自动解锁。
(四)备份与恢复
虽然游标、缓冲和事务处理的结合使用能大大降低由意外情况引起的数据表的不安全性和不稳定性,但计算机故障的原因很多,包括磁盘故障、灾害故障、人为破坏以及计算机病毒这些通过编程无法解决的问题,所以程序中一定要有备份及恢复的功能,当数据库中的表损坏时,可以用备份表恢复数据。
备份数据时我们常用的方法是:Copy to<路径>命令生成备份表文件,如果原数据表有备注字段还会同时生成一个同名的备注文件。
示例:
bf=ALLTRIM(PUTFILE("表文件:","","dbf"))
SELECT 表名
if !empty(bf)
COPY TO "&bf"
nn=MESSAGEBOX("数据导出完毕...",0+64,"信息")
endif
恢复数据时所用的方法是:读取备份文件,将原表的记录全部删除,用Append命令将备份文件的数据加入到数据表中。
示例:
hf=ALLTRIM(GETfile("dbf", this.Caption, "选择"))
if !empty(hf)
SELECT 表名
DELETE ALL
APPEND FROM "&hf"
nn=MESSAGEBOX("数据导入完毕...",0+64,"信息")
ENDIF
利用以上程序,可以实现对VFP数据表的备份与恢复。
总结:综上所述,VFP提供的游标、数据缓冲、事务处理可以有效的保护数据,它们在程序设计中的结合使用能大大降低程序意外中断引起的数据表损坏,同时程序设计中要有完善的数据备份和恢复功能,在程序遭遇磁盘故障及计算机病毒等情况时能及时恢复损坏和丢失的数据。
参考文献:
[1]鲁俊生,胡天云.《VFP程序设计简明教程》.西安电子科技大学出版社,2001。
[2]李军.《Visual FoxPro数据库系统开发应用教程》.清华大学出版社,2007。
[3]常明华.《VFP编程技术及数据库应用教程》.中国电力出版社,2002。
关键词:Visual FoxPro 游标 视图 CursorAdapter 数据缓冲 事务处理
VFP即Visual FoxPro,它是由Foxpro发展而来的一种面向对象的数据库程序设计语言,使用VFP不仅能方便地创建和管理数据库,而且能够直接用来编制基于该数据库的信息系统。目前在我国,有相当一部分正在运行的应用程序是用VFP编写的,可以说,从操纵数据的角度来说,VFP的效率是最高的,使用它可以轻而易举的开发出一个实用的信息系统。但VFP也存在一些缺点,比如一些用VFP编写的应用系统在使用时,会因为机器的突然断电死机、用户的非正常退出等原因导致数据表的损坏及表中数据丢失,虽不是经常性的问题,一旦出现可能非要专业人员才能解决,为了防止这种现象发生,除了给应用系统提供一个稳定的平台,配备UPS,更换稳定的机器及网络设备外,还应从软件设计的本身采取一些提高数据表安全性的措施。
断电死机造成数据的损坏丢失是很常见的,只要是写磁盘文件时断电就会发生文件错误,Word程序也会遇到这种问题,但Word在断电时文件未被损坏,是因为它使用了临时文件,在Word打开某文件时,可以看到相应目录下产生的.Tmp文件即是。大多数的坏表是因为直接打开表后长时间的写入或修改,这样遇到断电几率就很大,VFP数据表的格式决定了它不具备自动备份和修复的功能,而设计员在程序中有没有考虑过这种断电情况的发生?采取了哪些避免方法?本文主要介绍了VFP中游标、数据缓冲、事务处理和数据备份恢复的功能以及它们在提高数据表安全性中的应用。
(一)游标(Cursor)
在VFP中,数据处理是围绕着游标(Cursor)进行的,Cursor虽然也是“表”,但它是属于“内存型”的,断电或意外退出,这个“表”就失效,便不存在安全性的问题。VFP数据库中的视图、表单数据环境中的表和SQL Select产生的查询结果都是Cursor。可以说,VFP灵活、强大的数据处理功能无一不归功于Cursor的参与,下面介绍一下游标的两种形式及应用:视图和CursorAdapter。
1、视图
视图是从一个表或多个表或其他视图上导出的“表”,它可以被看成是虚拟表或存储查询,兼具表和查询的特点:与查询相类似的是,视图可以用来从一个或多个相关联的表或视图中提取需要的信息,通过视图访问的数据不作为独特的对象存储在数据库内,数据库内存储的是SELECT语句,SELECT语句的结果集构成视图所返回的虚拟表;与表相类似的是,视图可以用来更新其中的信息,并将更新结果永久保存在磁盘上。在应用程序设计中,可以用视图使数据暂时从数据库中分离成为游离数据,以便在主系统之外收集和修改数据。
当我们用了视图之后,更改视图的同时表没有立即更改,而是在发送TableUpdate()函数后更改,从而提高了操作的安全性。创建和使用视图的方法很简单,由数据表创建一个视图,在更新条件选择“发送SQL更新”,便可以把它添加到数据环境中和表一样使用。
2、CursorAdapter
CursorAdapter基类是VFP8.0推出的一个最重要的、也是最精彩的新功能。它提供了一个统一、易用的数据接口,可以使用 CursorAdapter来访问本地数据和ODBC、ADO和XML这样的远程数据。VFP8.0重新设计了表单的数据环境,用可视化的方式来创建CursorAdapter后,只需要很少的工作就可以设置好那些对于取得和更新数据来说相当重要的属性。比如,DataSourceType属性表示要选用什么方式访问数据源,如果使用VFP表,就选择“Native”;Tables属性设置为所使用VFP表的表名;SelectCmd\属性是一个用来取得数据的 SQL Select 命令,可以设置为:select字段,字段from表名。设置完毕,就会在数据环境设计器中产生一个Cursor,然后像处理本地表一样处理这个Cursor,可以将其拖放到表单上实现与表单控件的绑定,用TableUpdate()函数来更新数据源。
CursorAdapter与视图有很多类似的地方:生成一个SQL select语句,定义哪些字段将被更新,设置关键字段,游标中取到数据后使用TableUpdate()函数发送更新到源表,但视图是数据库的概念,不具备编程语言的特点,它把整个过程作为一个整体看待,SQL Select语句是预先定义好的,无法动态去修改它。而对象化的 Cursor(处理)管理器CursorAdapter与数据库无关,它完全是程序设计上的概念,具备了面向对象程序设计的一切好处,很容易定义、改变和维护,可以很轻松的通过改动SelectCmd属性来改变取得什么数据。
(二)数据缓冲
数据缓冲是用来保护对表记录所作的数据更新及数据维护操作的一种技术。当一个表或视图设置成了缓冲属性后,VFP为启用数据缓冲的表在内存中开辟一个缓冲区,对表的一个或多个记录的修改先保存在缓冲区中,VFP并不直接对硬盘上的数据库进行操作,而是对缓冲区中的数据进行操作,确定记录要正式存入到表或视图中时,才直接通过对应文件连接到表或视图中一次性进行维护操作,这样可以撤消修改,用户可以决定是否将缓冲区中的数据更新表文件。数据缓冲是由CursorSetprop()函数来设定缓冲方式,由TableRevert()来取消对数据的修改,由TableUpdate()来提交对数据的修改。用缓冲的话,只有在用TableUpdate()提交对数据的修改时遇上断电才有可能坏表,大大减少了直接操作数据表的时间,从而达到断电死机等情况下保护数据表的目的。
VFP提供两种缓冲:记录缓冲和表缓冲。若一次只对一个记录进行访问、修改或写操作,选择记录缓冲。在一个多用户环境中,记录缓冲能够提供适当的有效性检查机制,对其他用户所做的数据更新操作影响最小。若要对多个记录的更新使用缓冲,选择表缓冲。
VFP以两种锁定方式提供缓冲:保守式和开放式。这两种方式决定了一个或多个记录何时被锁定,又是何时、怎样被解锁的。保守式缓冲:锁定当前记录,在发出TableUpdate()命令之后更新。在多用户环境中,保守式缓冲能防止其他用户在对某一特定记录或表正进行修改时访问它。保守式缓冲为单个记录的修改提供最安全的工作环境,但是会降低用户的操作速度。开放式缓冲:一直等到发布TableUpdate()命令,然后锁定并更新已编辑的记录。开放式缓冲是更新记录的有效方法,因为锁定只在写记录时生效,这样在多用户环境中使单个用户独占系统的时间最少。
缓冲访问数据的方法:
在表单的数据环境中,将数据表的属性BufferModeOverride设为3开放式行缓冲或5开放式表缓冲;
在"保存"代码中加入:
=tableupdate(.t.) &&实施对原表的更改在"还原"代码中加入:
=tablerevert(.t.) &&放弃所有表的更改
(三)事务处理
即便使用缓冲,有时也会出错,使用事务处理能保护更新操作。事务处理就是对修改的数据进行跟踪,它可以恢复修改过的数据,在机器突然死机断电、程序出错等引起程序中断的情况下会把数据恢复到修改前的状况。在应用程序中添加事务处理所提供的保护机制超过了记录缓冲和表缓冲提供的保护功能,它将整段代码作为一个受保护的、可恢复的单元。如果由于某种原因,系统不能执行对数据库的更新操作,就可以回滚整个事务处理,而不执行任何更新。
VFP提供了三个命令来控制事务处理:BEGIN TRANSACTION命令用来初始化一个事务处理,ROLLBACK命令用来取消最近一条BEGIN TRANSACTION 语句以来所做的全部修改,END TRANSACTION命令用来锁定记录,提交最近一条BEGIN TRANSACTION 语句以来对数据库中表所做的全部修改,然后解锁记录。一个事务处理起始于 BEGIN TRANSACTION命令,以 END TRANSACTION或ROLLBACK命令终止。为了保存所做的修改并终止事务处理,应发出 END TRANSACTION命令。如果事务处理失败(如服务器有故障或工作站有故障,以及没有提交事务处理就退出VFP),或者用户发出ROLLBACK命令,事务处理中的文件就恢复成原状态。
示例:
use 表名
begain tran &&开始事务处理
dele &&删除一条记录
rollback &&把删除的记录恢复回来
dele &&删除一条记录
end tran &&结束事务处理,清除事务处理跟踪日志
VFP使用事务处理的原则:事务以BEGIN TRANSACTION开始,以END TRANSACTION或ROLLBACK结束,必须成对使用;除非应用程序终止,事务一旦开始,直到遇到END TRANSACTION或ROLLBAKC语句期间,将保持有效;缓冲区中的数据比磁盘中的数据优先级高,即事务处理优先使用缓冲区中的数据;如果在事务处理过程中应用程序终止,则取消事务对表的所有操作;事务处理可以嵌套使用, 函数TXTLEVEL()确定当前事务处理的等级,最大值为5,表示事务最多嵌套五层,TXTLEVEL()为0表示当前无事务处理;BEGIN TRANSACTION和END TRANSACTION(ROLLBACK)采用最近优先原则匹配;最内层的更新优先于嵌套事务处理中的其他更新;直接或间接调用事务时,VFP自动加锁,直到END TRANSACTION(ROLLBACK)时自动解锁。
(四)备份与恢复
虽然游标、缓冲和事务处理的结合使用能大大降低由意外情况引起的数据表的不安全性和不稳定性,但计算机故障的原因很多,包括磁盘故障、灾害故障、人为破坏以及计算机病毒这些通过编程无法解决的问题,所以程序中一定要有备份及恢复的功能,当数据库中的表损坏时,可以用备份表恢复数据。
备份数据时我们常用的方法是:Copy to<路径>命令生成备份表文件,如果原数据表有备注字段还会同时生成一个同名的备注文件。
示例:
bf=ALLTRIM(PUTFILE("表文件:","","dbf"))
SELECT 表名
if !empty(bf)
COPY TO "&bf"
nn=MESSAGEBOX("数据导出完毕...",0+64,"信息")
endif
恢复数据时所用的方法是:读取备份文件,将原表的记录全部删除,用Append命令将备份文件的数据加入到数据表中。
示例:
hf=ALLTRIM(GETfile("dbf", this.Caption, "选择"))
if !empty(hf)
SELECT 表名
DELETE ALL
APPEND FROM "&hf"
nn=MESSAGEBOX("数据导入完毕...",0+64,"信息")
ENDIF
利用以上程序,可以实现对VFP数据表的备份与恢复。
总结:综上所述,VFP提供的游标、数据缓冲、事务处理可以有效的保护数据,它们在程序设计中的结合使用能大大降低程序意外中断引起的数据表损坏,同时程序设计中要有完善的数据备份和恢复功能,在程序遭遇磁盘故障及计算机病毒等情况时能及时恢复损坏和丢失的数据。
参考文献:
[1]鲁俊生,胡天云.《VFP程序设计简明教程》.西安电子科技大学出版社,2001。
[2]李军.《Visual FoxPro数据库系统开发应用教程》.清华大学出版社,2007。
[3]常明华.《VFP编程技术及数据库应用教程》.中国电力出版社,2002。