VF技巧:数据共享程序设计
来源:优易学  2011-8-24 18:43:26   【优易学:中国教育考试门户网】   资料下载   IT书店

 

 在启用表缓冲之后,VFP只在TABLEUPDATE()命令之后更新。
  5)在表缓冲区中追加和删除记录
  可以在启用表缓冲之后追加和删除记录。追加的记录将添加到缓冲区的末尾。要访问缓冲区中所有的记录,请使用RECNO()函数,RECNO()函数根据追加到表缓冲区中的记录情况返回序列负值。比如,如果您启用了表缓冲,编辑记录7、8、9,然后追加三个记录,则此时缓冲区将包含RECNO()的值为7、8、9、-1、-2和-3。
  只能使用TABLEREVERT()命令从缓冲区中删除追加记录。对于任何追加的记录,当维护序列时,TABLEUPDATE()和TABLEREVERT()都删除RECNO()为负值的记录。
  在使用表缓冲时,您可以用带负RECNO()值的GO 命令来访问指定的追加记录。比如,对于前面的示例,可以输入:
  GO 7 &&转到第一个缓冲记录
  GO -3 &&转到第六个缓冲记录(第三个追加记录)
  若要追加记录到表缓冲区,可在启用表缓冲后使用APPEND或APPEND BLANK命令。追加的记录具有序列递增的负RECNO()值。
  若要从表缓冲区中移去追加的记录,可以:
  a、使用带负值的GO命令将记录指针定位到要删除的记录。
  b、使用DELETE命令将该记录加上删除标记。
  c、使用TABLEREVERT()函数将该记录从缓冲区中移去。
  注意:TABLEREVERT()函数也影响到被删除和更改的行的状态。
  若要从表缓冲区中移去所有追加的记录,可使用带(.T.)值的TABLEREVERT()函数。TABLEREVERT()函数把追加的记录从表缓冲区中移去,而不将这些记录写入表。TABLEUPDATE()命令将所有当前的记录写入一个表,包括已经打上删除标记的记录。
  二、更新数据
  可以使用缓冲、事务或视图更新数据。
  1、使用缓冲进行更新
  在选择缓冲方法和锁定类型之后,就可以启用记录或表缓冲。若要启动缓冲,请选择下列选项之一:
  * 在“表单设计器”中,设置表单数据环境中的临时表的BufferModeOverride属性。
  * 在代码中设置Buffering属性。
  例如,将下面的代码放进表单的init过程中,可以启用保守式记录缓冲:
  CURSORSETPROR("Buffering",2)
  然后将进行更新操作的代码放在控件的适当方法程序代码中。
  要把编辑结果写入原来的表,可以使用TABLEUPDATE()。由于规则限制,造成对表的更新操作失败之后,要取消编辑结果,可以使用TABLEREVERT()命令。TABLEREVERT()即使在没有明确启用表缓冲的情况也都有效。
  下面的示例说明在启用保守式记录缓冲的情况下,如何更新记录:
  OPEN DATABASE testdata 在表单的init代码中,打开表单启用保守式记录缓冲。
  USE customers
  =CURSORSETPROP("Buffering",2)
  lModified=.F.
  FOR nFieldNum=1 to FCOUNT() 遍历字段,检查是否有字段进行了修改。注意:此段
  IF GETFLDSTATE(nFieldNum)=2 代码可以写在“更新”或“保存”按钮的click事件中。
  lModified=.T.
  EXIT
  ENDIF
  ENDFOR
  IF lModified 定位下一个已修改的记录。
  nResult=MESSAGEBOX;
  ("记录已经被修改,是否保存?"),;
  4+32+256,"数据更新")
  IF nResult=7 提交当前值并为用户提供选择,询问是否还原对当前
  =TABLEREVERT(.F.) 字段所做的修改。
  ENDIF
  ENDIF
  SKIP SKIP确保最后一个修改内容也已写入。
  IF EOF()
  =MESSAGEBOX("已经到最后")
  SKIP -1
  ENDIF
  THISFORM.refresh
  2、事务管理更新
  即便使用缓冲,事情有时也会出错。如果希望保护更新操作,并从一整段代码中还原回来,可以使用事务。
  在应用程序中添加事务所提供的保护机制,超过了记录缓冲和表缓冲提供的保护功能,它将整段代码作为一个受保护的、可恢复的单元。可以嵌套使用事务,并用它保护已操作的缓冲更新。VFP事务只能用于数据库中的表和视图。
  1)包装代码段
  事务类似一层外包装,用来缓冲对内存或磁盘的数据更新操作,而不直接对数据库进行更新。实际的数据库更新在事务结束后进行。如果由于某种原因,系统不能执行对数据库的更新操作,就可以回滚整个事务,而不执行任何更新。
  注意:在同一数据工作期的事务中,忽略事务外面的缓冲更新操作。
  2)控制事务处理的命令
  VFP提供了三个命令和一个函数控制事务处理:
  若要 请使用此命令
  ——————————————————————————
  初始化一个事务 BEGIN TRANSACTION
  确定当前事务的等级 TXNLEVEL()
  取消最近一条BEGIN TRANSACTION语句 ROLLBACK
  以来所做的全部修改
  锁定记录,将最近一条BEGIN TRANSACTION END TRANSACTION
  语句以来对数据库中表所做的全部修改
  写入磁盘,然后解锁记录
  您可以使用事务缓冲对以下文件进行修改:表、结构化的.CDX文件以及数据库表相关的备注文件。涉及内存变量和其他对象的操作不属于事务,因此不能回滚这些操作。
  注意:当使用远程表中存储的数据时,事务命令只更新视图临时表的本地备份中的数据;对远程基表的更新不起作用。要对远程表启用人工事务,请使用SQLSETPROP(),然后用SQLCOMMIT()和SQLROLLBACK()控制事务处理。
  一般来讲,除非采用TABLEUPDATE()包装调用,事务最好和记录缓冲一起使用,而不和表缓冲一起使用。如果您在事务中使用了TABLEUPDATE()命令,那么可以回滚失败的更新操作,找到失败的原因,然后重试TABLEUPDATE()命令而不丢失任何数据,这样,就确保了更新操作一定是所谓的“要么全都做,要么全不做”的原则。
  尽管在正常的情况下,简单的事务处理能够提供安全的数据更新操作,但是它并不能提供对系统失败的完全保护。如果在处理END TRANSACTION命令期间断电或产生系统中断,则数据更新仍然将会失败。
  请使用下列事务处理代码模板:
  BEGIN TRANSACTION
  *更新数据
  IF lSuccess=.F. &&出错
  ROLLBACK
  ELSE &&执行修改
  *确认数据
  IF &&出错
  ROLLBACK
  ELSE
  END TRANSACTION
  ENDIF
  ENDIF
  3)使用事务
  下列规则适用于事务:
  a、一个事务起始于BEGIN TRANSACTION命令,以END TRANSACTION或ROLLBACK命令终止。只有END TRANSACTION语句,而没有BEGIN TRANSACTION与之相匹配将会出错。
  b、ROLLBACK语句前没有BEGIN TRANSACTION将会出错。
  c、除非应用程序中止(这将导致回滚操作),事务一旦开始,到遇到相应的END TRANSACTION语句(或回滚语句)这一期间,将保持有效,在跨程序、跨函数的情况下也是如此。
  d、对于涉及事务数据的查询,VFP在使用磁盘数据前先使用在事务缓冲区内的缓冲数据,确保使用最近的数据。
  e、如果在事务处理过程中应用程序中止,则所有操作回滚。
  f、事务处理只在数据库容器中进行。
  g、如果INDEX命令改写了一个已有的索引文件,或者任一索引文件已打开,则不能使用INDEX命令。
  h、事务只在数据工作期中起作用。

上一页  [1] [2] [3] [4] 下一页

责任编辑:小草

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训