在VFP9中利用CA对远程数据的存取进行管理(二)
![作者头像](https://ask.qcloudimg.com/http-save/yehe-2493243/6bb10f85e8ead077fa19c28f3711e154.jpeg)
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