专栏首页加菲猫的VFP在VFP9中利用CA对远程数据的存取进行管理(二)

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

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

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

本文分享自微信公众号 - 加菲猫的VFP(VFPPLUS),作者:作者:陈阿伟

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-09-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

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

    CursorAdapter既可以对本地数据进行存取,又可以对远程的不同类型的数据源进行存取,不需要关心数据源,只要对 CursorAdapter的属性进行适当的...

    加菲猫的VFP
  • 我们总是梦想着对象化(八)

    先来一波儿回忆杀。经典的 VFP 设计方式:新建表单—数据环境—添加表到数据环境—拖动表或字段到表单……

    加菲猫的VFP
  • 我们总是梦想着对象化(三)

    现在,你会发现,你需要在主程序中使用的 Set 命令是如此之少,而 Config.fpw 文件将会成为你的每一个项目的标准的配置文件。

    加菲猫的VFP
  • VFP动态网页开发,效率绝杀ASP,只看这篇文章就行了

    当初JS只是一种脚本语言,而且没有什么地位,自从AJAX横空出世,JS发展一路绝尘,但也只是在浏览器前端上跑得风生水起,后端必须是PHP,Python,JAVA...

    加菲猫的VFP
  • 【转】 COM 免注册技术

    今天实际应用时,又进行了一些测试,发现与以前看到资料中一些不同的表现,见最后的【补充】部分

    静谧的小码农
  • Cloudera数据加密

    加密是使用数字密钥对各种组件(例如文本,文件,数据库,密码,应用程序或网络数据包)进行编码的过程,因此只有适当的实体(用户,系统进程等)才能进行解码(解密) )...

    大数据杂货铺
  • 写给开发人员的实用密码学 - CA

    在上一篇文章《写给开发人员的实用密码学 - 数字证书》中介绍了数字证书,但要让用户信任颁发的数字证书,这里就需要引入 CA 中心。

    云水木石
  • Fabric CA的部署与使用

    之前使用CA服务一直是在docker容器中运行下载好的CA镜像,在应用程序中通过Node SDK中集成的接口来访问CA服务器,这次尝试手动部署CA服务。

    zhayujie
  • 响铃:360浏览器首创自有根证书,不赚钱为哪般?

    近年来,国内外各大网站频遭攻击。去年5月份,国务院app中的H5网页疑似被劫持,页面上出现挂弹窗广告;今年八月份,浙江绍兴警方侦破了“史上最大规模数据窃取案”,...

    曾响铃
  • Https详细分析

    杨充
  • HTTPS加密协议详解

    简介 HTTPS (Secure Hypertext Transfer Protocol)安全超文本传输协议,是一个安全通信通道,它基于HTTP开发用于在客户计...

    xiangzhihong
  • 浅谈Openssl与私有CA搭建

    随着网络技术的发展、internet的全球化,信息共享程度被进一步提高,各种基于互联网的应用如电子政务、电子商务日益增多并愈加被人们工作和生活依赖。但是,由于...

    小小科
  • 用户权限升级到组权限,看完这篇大呼这也太简单了。

    在上篇基于用户的权限设置中,这次我加入组的概念,把所有组的权限规划好之后,以后添加用户只需要赋于所属组就行了,不需要一个一个权限再去设置。

    加菲猫的VFP
  • 如何在Ubuntu上为MySQL配置SSL/TLS

    MySQL 是最流行的关系型数据库管理系统,MySQL在过去由于性能高、成本低、可靠性好,已经成为最流行的开源数据库,因此被广泛地应用在Internet上的中小...

    你在哪里
  • Nginx(3)-创建 https 站点

    使用对称加密,交易双方都使用同样钥匙,安全性得不到保证;每对用户每次使用对称加密算法时,都需要使用其他人不知道的惟一钥匙,这会使得发收信双方所拥有的钥匙数量呈几...

    懒人的小脑
  • PKI

    1、Public Key Infrastructure(公钥基础设施),是一个包括硬件、软件、人员、策略和规程的集合,用来实现基于公钥密码体制的密钥和证书的产生...

    用户9120000
  • CoreOS配置Docker API TLS认证 顶

    我们经常会利用Portainer来管理docker环境,也经常会用Jenkins来自动构建和部署docker,远程管理都会使用到Docker API,通常我们只...

    bdcn
  • 安全第一步,密钥管理服务

    最近爆出不少公司代码泄露的新闻,像前不久的Bilibili后端代码被上传到Github,大疆因为前员工泄露公司源代码,致黑客入侵造成百万损失。生产环境代码泄露的...

    绿盟科技研究通讯
  • 渗透测试中利用基于时间差反馈的远程代码执行漏洞(Timed Based RCE)进行数据获取

    在最近的渗透测试项目中,为了进一步验证漏洞的可用性和危害性,我们遇到了这样一种情形:构造基于时间差反馈的系统注入命令(OS command injection ...

    FB客服

扫码关注云+社区

领取腾讯云代金券