CA类及其在远程数据访问中的意义
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
CA类及其在远程数据访问中的意义
转自《电脑编程技巧和维护》
Visual FoxPro 8.0 的CursorAdap ter类及其在远程数据访问中的意义
[摘要] 本文从Vis ual FoxPro应用程序的观点深入剖析Visu al FoxPro 8.0中新增的C ursor Adapt er类及其在远程数据访问中的意义。
Cursor Adapt er对各种远程数据源提供了一种统一的面向对象的访问接口,开发人员借此可以轻松实现基于Na tive(本地数据)、ODBC、ADO、XML的数据访问。
[关键词] Cursor Adapt er,远程数据访问,ADO,视图,Cursor,COM
一、引言
就在“Visual FoxPro已过时,并即将被淘汰……”的一片喧嚣声中,Micros oft于去年6月正式发布了Vi sualFoxPro 8.0。
据称,这是自Vis ual FoxPro 3.O发布以来最精彩的一个版本。
新增众多如:结构化异常处理、事件绑定、数据环境子类、XML Web servic es、自动递增字段、控件延迟绑定、Window s XP风格支持等等令人目不暇接的功能,着实让全球F oxer们兴奋不已,然而其中最值得令人称道的当数Cu rsorA dapte r类,笔者以为这是Visua l FoxPro 8.0最抢眼的一个亮点。
长期以来,Visual FoxPro因为其先天的弱点如:表的脆弱性、安全性、数据库的容量以及通用性等等,一直成为人们攻击的目标。
因而越来越多的VFP程序员开始抛弃DBF表,转而采用如S QL Server、Oracle 等一些大型数据库来存储数据,而将VFP作为c/s结构中的前端开发工具或者作为基于COM的三层结构应用程序的中间层开发工具。
然而,传统的方式通常是使用远程视图或S QL Pass Throug h然后经过ODBC来访问远程数据。
随着新的基于组件技术的数据访问规范OLEDB和扩展标记语言XM L的出现,对VFP开发人员来说无疑产生了极大的吸引力。
然而,在以前各版本的V isu al FoxPro中,这些新技术都无法得以很好地利用。
Micros oft当然也看到了这一点,于是在刚刚发布的Vis aul FoxPro8.0中,一个全新的为用户提供统一的数据访问接口、被称为Cur sorAd apter的基类,展现在了全球Foxer们面前。
借助Curs orAda pter,在Visua l FoxPro 8.0中访问远程数据要比过去的任何一个版本都简单得多:
●ODBC、ADO、XML的使用变得非常容易,即使你不熟悉这些技术。
●不管你选择了哪种远程数据源机制,它都提供一种统一的访问接口。
●从一种数据访问机制转换到另一种数据访问机制变得非常轻松。
二、Cursor Adapt er的设计理念
要彻底理解C ursor Adapt er,必须先弄清M icros oft设计Curso rAdap ter的真正意图。
众所周知,基于OLE DB的ADO数据访问技术,正日渐成为W indow s平台主流的数据存取解决方案,VC、VB、Delphi这些当今流行的开发工具,都无一不支持ADO技术。
在需要编写组件的场合,ADO更是一种理想的选择。
然而很久以来,在Visua l FoxPro中,我们似乎看不到ADO的影子。
是不是Vis ual FoxPro 不支持AD O呢?当然不是。
ADO实际上是一组实现数据存取的COM对象,Visual FoxPro支持COM,当然也支持A DO。
然而,在V isual FoxPro 8.0出现之前,几乎很少看到有VFP程序员采用A DO来访问如SQLServer、Oracle 等一些大型数据库,其原因何在?原来,在Visua l FoxPro中,ADO产生的Recor dSet对象,不能像VFP中
的表或视图(本地或远程)那样实现与控件的绑定,也不能作为一个整体的数据对象来处理,必须使用循环语句来逐条处理Rec ordSe t中的记录,因而也就无法发挥Vis ual FoxPro强大的数据处理功能。
现在,Cursor Adapt er的出现彻底改变了这一切。
可以这么说,Cursor Adapt er为我们提供了一种全新的远程数据访问解决方案,无论你是使用本地表(Native)、ODBC、ADO还是X ML,Cursor Adapt er均提供了一个统一的数据访问接口,让你轻松实现远程数据的存取。
在详细剖析C ursor Adapt er的运作机制之前,让我们先来看一下传统的Visua l FoxPro中的数据处理模型。
Visual FoxPro中,一切数据处理其实都是围绕着游标(Cursor)进行的。
如:DBC中的视图就是一个Curso r,表单数据环境中的表也是Curso r,Select-SQL产生的查询结果还是Curs or(只读)。
可以说,Visual FoxPro 灵活、强大的数据处理功能无一不归功于C ursor的参与。
然而,对于ADO所产生的Re cordS et,Visual FoxPro却显得英雄无用武之地。
所以,面对ADO,Visual FoxPro 急于解决的问题是:要么推倒原有的整个VF P数据处理架构,重建一个对象化的Cur sor以实现与对象化的Reco rdSet相容;要么通过某种方式,将ADO的R ecord Set转化为VFP能处理的Cu rsor,而原有的以C ursor 为中心的数据处理架构保持不变。
最终结果是,Micros oft选择了后者,事实上这也是一种最合理的方式。
再来看一下V isual FoxPro 8.0中的Cur sorAd apter类。
Cursor Adapt er就是一个为实现上述思想而设计的对象化的数据处理模型。
无论是本地数据(DBF),还是基于AD O、ODBC、XML的远程数据,都可以通过这个Curs orAda pter产生一个能为VFP处理的Curs or,而对该Cur sor的所有处理结果,又可以根据需要决定是否返回给数据源。
需要注意的是:Cursor Adapt er本身并不是Cur sor,而只是一个用于产生Cu rsor的对象化的数据处理模型。
数据源←→ Cursor Adapt er←→Cursor←→应用程序
↓
ODBC、ADO
XML、Native
VFP中其它非可视化类一样,Cursor Adapt er也不提供可视化界面,即它不是以控件的形式出现在VFP 的表单控件工具箱中,但这并不妨碍我们对它的使用。
Cursor Adapt er提供了许多属性、事件与方法。
如常用的属性有:Alias、DataSo urceT ype、Dataso urce、Select Cmd、Updata bleFi eldLi st、Update NameL ist等;方法有:Cursor Fill、Cursor Refre sh、AutoOp en等;事件有:AflerU pdate、Before Updat e、AfterC ursor Fill、Before Curso rFill、AflerC ursor Refre sh等。
在此不一一列举,读者可以查阅Visua l FoxPro8.0中相关的帮助文件。
通过这些属性、事件、方法,开发人员可以自由方便地操纵Cur sorAd apter对象,实现对远程数据的存取。
三、Cursor Adapt er实例演示
接下来,让我们通过两个示例来看一下CursorAd apter如何实现对远程数据的存取以及它与直接使用ADO组件来处理远程数据有何不同。
[示例一]:直接使用AD O访问SQ L-Server:
connst r = "Persis t Securi ty Info=False; User ID=sa; Initia l Catalo g=cjgl; Data Source=HXM"
oConne ction = Create Objec t("adodb.connec tion") && 建立连接对象
With oConne ction
.Provid er = "SQLOLE DB.1"
.Connec tionS tring = connst r
.Open
EndWit h
oRecor dSet= Create Obiec t("adodb.record set") && 建立记录集对象
oRecor dSet.Open("Select * From xs", oConne ction)
Do While!oRecor dSet.Eof && 通过循环语句列举姓名字段
oRecor dSet.fields("xm").value
oRecor dset.MoveNe xt
EndDo
[示例二]:使用ADO+ Cursor Adapt er访问S QL-Server:
connst r = "Persis t Securi ty Info=False; User ID=sa; Initia l Catalo g=cjgl; Data Source=HXM"
oConne ction = Create Objec t("adodb.connec tion") && 建立连接对象
With oConne ction
.Provid er = "SQLOLE DB.1"
.Connec tionS tring = connst r
.Open
EndWit h
IoCurs or = Create obiec t("Cursor Adapt er") && 建立CursorAda pter对象
With loCurs or
.Alias= "studen t"
.DataSo urceT ype = 'A DO' && 指定数据源类型
.Dataso urce= Create objec t('ADODB.Record Set')
.Select Cmd = "select * FROM xs" && 指定用于产生Curso r的Sel ect-SQL语句
.DataSo urce.Active Conne ction = oConne ction
ENDWIT H
loCurs or.Cursor Fill() && 将后台数据重载到前台并产生出一个Curso r
Browse
【注】:以上代码用到了一个非常简单的SQL-Server数据库XS CJ,其中包含一张XS表。
从上面代码可以看到,Cursor Adapt er本质上是基于AD O的Rec ordSe t,通过Reco rdSet产生出一个可更新的C ursor(游标),使得我们可以用所有VF P传统语句来处理该C ursor,如可以用Br owse来浏览该Cu rsor。
读者可能会说,Cursor Adapt er的作用无非就是将Recor dSet转换为一个适合VFP处理的Cur sor,用户完全可以自己写个类,将此转换代码封装其中,不照样实现u rsorA dapte r的功能吗?
实际上,事情并非完全如此。
Cursor Adapt er除了产生出一个C ursor外,更重要的在于引入了相关的对象事件模型,如:Before Inser t、AfterI nsert、Before Updat e、afterU pdate等。
从而使得编程人员可以利用这些事件,来控制对Cu rsor的各种操作。
而这一点,正是普通意义上的视图所无法实现的。
DBC中的视图虽然也可更新,但它不具有对象事件模型,因而开发人员无法去控制它,一旦执行Ta bleUp adte,数据便立即更新,没有商量的余地。
下面代码演示了Upda te-SQL语句如何触发Cu rsorA dapte r的Aft erUpd ate事件:
Connst r = "Persis t Securi ty Info=False; User ID=sa; Initia l Catalo g=cjgl; Data Source=HXM"
oConne ction = Create objec t('adodb.connec tion')
With oConne ction
.Provid er = "SQLOLE DB.1"
.Connec tionS tring = Connst r
.Open
Endwit h
loCurs or = Create objec t('myCurA dp') && 创建CursorAda pter对象
With loCurs or
.Alias= 'studen t'
.DataSo urceT ype = 'A DO'
.Dataso urce= Create obiec t('ADODB.Record Set')
.DataSo urce.Cursor Locat ion = 3 && adUseC lient
.DataSo urce.LockTy pe = 3 && adLock Optim istic
.Select Cmd = 'select * From xs'
.Updata bleFi eldLi st = 'xh,xm,xb,zydh,xidh'
.Update NameL ist = 'XH xs.XH, XM xs.XM, XB xs.XB, ZYDH xs.ZYDH, XIDH xs.XIDH'
.KeyFie ldLis t = 'xh'
.AllowU pdate = .T.
.SendUp dates = .T.
.Dataso urce.Active Conne ction = oConne ction
Endwit h
IF loCurs or.Cursor Fill()
Update studen t Set xm='王一平' WHERExb='男' && 触发AfterUpda te事件
ENDIF
** 定义一个基于CursorAdap ter的子类
Define ClassmyCurA dp As Cursor Adapt er
Proced ure AfterU pdate && 定义AfterUpda te事件
Lparam eters FldSta te, lForce, nUpdat eType, cUpdat eInse rtCmd, cDelet eCmd,cResul t
Wait Window '触发Afte rUpda te事件!'
Endpro c
Enddef ine
当执行Update-SQL命令时,就会触发my CurAd p类的Af terUp date事件,用户可以在此事件中做一些自己想做的事。
四、数据环境中的CursorAdap ter
如果你对PR G文件中的OOP编程不是很熟悉,那也不要紧,Visual FoxPro 8.0重新设计了表单的数据环境,在新的数据环境中同样提供了Cur sorAd apter类,你甚至可以用可视化的方式来设置C ursor Adapt er的各项属性,设置完毕,就会在数据环境设计器中产生一个C ursor,然后像处理本地表一样处理这个Cu rsor,例如,你可以将其拖放到表单上实现与表单控件的绑定、用Table Updat e()来更新数据源。
不过,从Microsoft对Visua l FoxPro的产品定位策略来看,Micros oft更倾向于将Vi sualFoxPro作为一个多层结构的中间层开发工具,并且将其融合到.NET框架中来。
而多层结构的中间层实际就是一些C OM组件。
一方面,COM组件的编写必须基于OOP,并且在VFP中,支持私有工作期的Ses sion类只能在PR G文件中定义;另一方面,进程内的CO M组件不允许带有界面元素,因此从组件开发的角度来看,熟悉PRG中的OOP编程更显重要,这也是一个真正的程序设计高手所必须具备的基本功。
五、结束语
曾经风靡一时的FoxP ro,在.NET、XML、Web Servic e大行其道的今天,并没有完全被淘汰,至少目前或者今后几年内不会。
在保持快速、灵活、强大的数据处理能力的同时,新的Visa ulFox Pro 7.0、8.0对.NET、XML、Web Servic e等新技术的强有力的支持,使其依然充满生机和活力。
据去年6月在美国加利福尼亚举行的“Visual FoxPro DevCon2003”会议透露,Visaul FoxPro的下一个版本已在开发中,代码为Eur opa(木卫二),其Beta版预计将于今年下半年发布。
Micros oft承诺,对Visau l FoxPro8.0的技术支持将延续到2010年。
由于V isaul FoxPro8.0刚刚发布还不到3个月,国内相关的资料很少,很多东西都是通过自己实践和摸索得到的,加之本人水平有限,文中错误在所难免,欢迎读者批评指正。
(头大按:原作者是周凤石,写于年初,所以与现在情况稍有出入)。