前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在VFP9中利用CA对远程数据的存取进行管理(二)

在VFP9中利用CA对远程数据的存取进行管理(二)

作者头像
加菲猫的VFP
发布2021-10-08 16:51:50
1.4K0
发布2021-10-08 16:51:50
举报
文章被收录于专栏:加菲猫的VFP
CursorAdpater对于各种数据源,对TABLES和UPDATENAMELIST属性具有如下一般性规则,在进行程序设计时应当注意:

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的返回值。例如:可以在这个事件中为临时表的结果进行排序:

代码语言:javascript
复制
PROCEDURE AfterCursorFillL
PARAMETERS lUseCursorSchema, noDataOnLoad, cSelectCmd, lResult
SELECT (this.Alias)
SET ORDER TO (this.Order)
ENDPROC

3、BeforeCursorAttach: 在CA尝试附加一个临时表之前发生。参数:cAlias,指定所附加的临时表和表别名。以下例子演示了怎样在BeforeCursorAttach中打开一个表,然后调用CursorAttach方法来进行附加。

代码语言:javascript
复制
PROCEDURE BeforeCursorAttach
OPEN DATABASE HOME(2)+"tastrade\data\tastrade.dbc"
USE 'product listing'
ENDPROC

然后调用如下语句来附加到临时表

代码语言:javascript
复制
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的黑科技,进入了移动互联网时代,接下来我们要进入物联网领域。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-09-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 加菲猫的VFP 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档