1、 TABLES:为确保自动更新后台数据能正确完成,必须按严格的格式为TABLES中的表名提供一个表名列表,这个顺序与表在SQL的INSERT,UPDATE和DELETE中出现的顺序应一致。
2、 UPDATENAMELIST:必须提供一个本地和远程的字段名列表对,它们有逗号分隔,每一对名字中包含一个本地字段名,紧跟一个远程字段名,远程字段名前TABLES中的表名。
3、 如果ALLOWINSERT,ALLOWUPDATE,ALLDELETE的属性为真(.T.),还必须设置正确主键值列表(KEY LIST)
批量更新
在表缓存的模式下,如果CA的BATCHUPDATECOUNT值大于1,CA对象使用批量更新模式对远程数据进行数据更新,在这种模式下,根据不同的数据源,必须符合如下条件:
1、 ODBC数据源:所有的INSERT,UPDATE,DELETE使用相同的ODBC句柄。
2、 ADO数据源:所有更新操作使用相同的ADODB的COMMAND对象来执行远程数据的更新。
3、 XML数据源:对所有允许的更新操作,CA对象都要使用XML作为数据源为类型。
注意:如果使用批量更新模式,以下事件不会被触发。即使在批量更新中有一个更新失败,VFP尝试为每一行发送一条单独的更新命令,然而,这些事件仍然不会被触发。它们是:
BeforInsert
AfterInsert
BeroreUpdate
AfterUpdate
BeforeDelete
AfterDelete
总的来讲,使用CA对数据进行存取时,可以按如下的原则来进行设置:
更新命令:
1、 让CA自动生成更新语句的命令
2、 直接对相关的更新命令写入自己的更新语句
更新方法:
1、 由VFP自动执行更新
2、 在程序中使用TABLEUPDATE()来执行更新
不管使用哪种方法,你都必须为更新设置冲突检测。
CA类中提供了很多的事件,这些事件可以方便的对数据进行灵活的操作,对CA事件的深入了解将有助于完全自由的控制CA的使用。当然,对初学者而言,你可以不用关心大部分的CA事件也可以完成程序的开发工作。本文将对CA的事件进行分类说明。
CA中的事件基本上可以分为如下几类,每一类都对应几个事件,这些事件又与相关的方法有紧密的联系:
一、与CA对象关联的临时表(CURSOR)相关的事件:
BeforeCursorfill AfterCursorfill; BeforeCorsorAttach AfterCursorAttach; BeforeCursorDetach AfterCursorDetach ; BeforeCursorClose AfterCursorClose
1、BeforeCursorfill:CA对象尝试附加在一个新的 临时表时发生。该事件有三个参数:lUseCursorSchema, lNoDataOnLoad, cSelectCmd。参数说明:lUseCursorSchema和lNoDataOnLoad是CursorFil()方法中的相关参数的值:cSelectCmd对应是CA对象中的SelectCmd属性的值。
值得关注的是,我们可以在这个事件中改变参数cSelectCmd的值来对CursorFill生成的临时表的结果集进行灵活控制,改变这个参数的值不会 修改CA对象中SelectCmd的属性值。在使用CursorFill的时候将保存这个修改的参数的值,CursorRefresh方法在调用时将使用 这个参数的值进行临时表的刷新,而不是使用SelectCmd属性的值。比如,我们可以为SelectCmd属性设置一个基本的SQL语句,在这个事件中 为cSelectCmd参数增加一个Where语句而不需要SelectCmd属性的本身的值。SelectCmd参数的值以后将被传送给 AfterCursorfill事件。
如果这个事件返回.F.,CursorFill将不会执行,附加的临时表也不会关闭。
2、 AfterCursorfill:在CA尝试创建一个新的临时表后发生。该事件有四个参数:lUseCursorSchema, lnoDataOnLoad, cSelectCmd, lResult。lUseCursorSchema, lnoDataOnLoad是CursorFill方法中的值,cSelectCmd是BeforeCursorfill事件中的值,lResult是 CursorFill的返回值。例如:可以在这个事件中为临时表的结果进行排序:
PROCEDURE AfterCursorFillL
PARAMETERS lUseCursorSchema, noDataOnLoad, cSelectCmd, lResult
SELECT (this.Alias)
SET ORDER TO (this.Order)
ENDPROC
3、BeforeCursorAttach: 在CA尝试附加一个临时表之前发生。参数:cAlias,指定所附加的临时表和表别名。以下例子演示了怎样在BeforeCursorAttach中打开一个表,然后调用CursorAttach方法来进行附加。
PROCEDURE BeforeCursorAttach
OPEN DATABASE HOME(2)+"tastrade\data\tastrade.dbc"
USE 'product listing'
ENDPROC
然后调用如下语句来附加到临时表
CursorAttach('product listing', .T.)
4、 AfterCursorAttach:CA尝试附加到临时表后发生。该事件有两个参数:cAlias和lResult。cAlias是附加的临时表的别 名,lResult的值表明附加是否成功。可以利用本事件对附加的临时表进行用户定制处理、执行校验规则等等,从而使用临时表的数据能够附合我们的使用要 求。
5、BeforeCursorDetach:CA在尝试解除附着的临时表之前发生。参数cAlias:解除附着的临时表和表的别名。在解除附着之前进行需要的操作。如果该事件返回.F.,临时表不再解除附着,任何返回值都被怱略。
6、AfterCursorDetach:在CA对象解除附着的临时表后立即发生。两个参数cAlias和lResult。参数说明同4。可以在这个事件中对没有附着临时表的CA的属性进行重新设置以及对自由表进行数据操作。
7、 BeforeCursorClose:在临时表关闭之前立即发生。参数:cAlias:临时表的别名。在临时表关闭之前可以利用此事件对临时表进行任何需要的操作。
8、 AfterCursorClose:执行临时表关闭命令之后发生。有两个参数:cAlias和lResult表示临时表的别名和是否关闭成功。例如,如果临时表中有尚未保存的数据,没有发送到源表进行更新,这时临时表将不能关闭,lResult为.F.
二、 与表和记录刷新时相关的事件:BeforeCursorRefresh AfterCursorRefresh; BeforeRcorderRefresh AfterRcorderRefresh
三、 与记录更新相关的事件:BeforeUpdate AfterUpdate BeforeCursorUpdate AfterCursorUpdate BeforeInsert AfterInsert BeforeDelete AfterDelete
四、 其它事件:Init Destroy Error
写在最后面的话
加菲猫的VFP公众号接受投稿,一经采用,即有稿费,稿费暂定50元一篇。
加菲猫的vfp倡导用VFP极简混合开发,少写代码、快速出活,用VFP,但不局限于VFP,各种语言混合开发。
已经带领一百多名会员成功掌到VFP的黑科技,进入了移动互联网时代,接下来我们要进入物联网领域。