第十一章SQL视图、VFP8.0的CursorAdapter和客户/服务器编程11.1客户/服务器结构(Client/Server).....................................................................................111.2创建和使用视图(SQLView).................................................................................................211.3更新视图的数据...................................................................................................................1111.4集成视图(CombiningView)...............................................................................................1311.5使用视图和SQL传递进行C/S模式编程........................................................................1411.6VFP8.0的CursorAdapter与C/S模式编程....................................................................17如果用户想为自己的应用程序提供一个定制的更新的数据集,可以使用视图(SQLView,下面简称视图)。视图结合了表(Tables)和查询(Queries)两者的特性:象一个查询,用户可以使用视图从一个或多个相关的表中提取一个数据集;象一个表,用户又能运用视图去更新View中的信息,并且永久地存贮结果到磁盘(而查询产生的临时表CURSOR只能读,既不能编辑,又不能存贮到磁盘)。本章主要讲述如何建立、使用和更新视图,以及设置属性去优化视图的性能。在xBASE中也有一个视图,但它是一种为重新使用而存贮数据环境的方法。本章的视图不同,是SQL视图。本章还介绍了客户/服务器(Client/Server)编程(特别是VFP8.0中用ADO的CursorAdapter等进行C/S模式编程)、Oracle升迁向导等。11.1客户/服务器结构(Client/Server)在讲述视图前,先讨论与远程视图等密切相关的客户/服务器结构。客户/服务器(Client/Server)结构中的数据库服务器与Novell网中的文件服务器不同,如图11-1所示,它在前端(客户机)和后端(服务器)均有自己的数据库管理系统,它的主要概念是“简单的劳动分工”,即专业化:让服务器代替每个需要处理数据库任务的工作站以最佳状态来完成那些任务(存贮和管理数据),而把客户机设计成提出请求,可以用有效的、美观的格式返回并显示数据。而Novell网上文件服务器多用户是对应结构,其服务器只是数据的一个库文件,各工作站可以直接访问数据。这种结构,若要加快查询和处理的速度,需要升级每一个工作站。而客户/服务器结构,只需简单地升级数据库服务器。即使是旧硬件也能提供快速的访问,因为它不是直接访问数据,而是让一个服务器来完成任务。VFP的重大发展之一就是具有了支持客户/服务器结构的特点。利用VFP可在前端开发出先进的客户/服务器应用程序,VFP同时将现有xBASE中对数据库的定义提升到后端数据库(见图11-1服务器中的SQLServer或Oracle、Paradox等)的实体特性(见7.1节的数据库意义),也引入了远程视图View和本地视图View来分别查看、更新服务器以及客户机上的数据(见本章视图SQLView)。要使用客户/服务器结构,应该连接VFP和数据库服务器。这里假定使用微软公司的SQLServer(版本2000)作为一个进程在Windows2000服务器操作系统平台上运行。用户不必在运行SQL服务器的Windows2000服务器上登记,SQLServer的优点之一就是它管理着自己的安全,并使用着其Windows2000服务器中的服务,所以只需要有使用SQLServer的许可就行了。取得SQLServer数据库服务器许可之后,接着应按下面介绍的方法,使用ODBC驱动程序来连接SQLServer,把VFP连接到服务器上(使用ODBC驱动程序来连接Oracle,把VFP连接到Oracle服务器上可仿照之)。.建立ODBC数据源在安装VFP时,用户如果选择完全安装(Complete),或者用户自定义安装(Custom)选项,便可得到开放式数据库连接ODBC(OpenDatabaseConnectivity)支持。用ODBC,可以从VFP访问SQLServer数据源。但是,在访问这个数据源前,必须先定义它。要定义一个数据源(DataSources),需要:(1)转到Windows控制面板(ControlPanel),并选ODBC图标。(2)在数据源(DataSources)对话框选添加(Add)。(3)在添加数据源(AddDataSource)对话框选择SQLServerODBC程序,并选确定(OK)。(4)在ODBCSQLServer安装对话框,键入数据源名称(DataSourceName,例如:SQL2000)、说明(Description,例如:SQLserverVersion2000)和其它合适的信息,然后选确定。(5)在数据源对话框选关闭(Close)。11.2创建和使用视图(SQLView)在创建视图之前,先提及一下与之密切相关的SQL查询。SQL是关系数据库标准语言——StructuredQueryLanguage(结构查询语言)的简称,VFP、Oracle以及SQLServer等数据库都使用SQL。第3.9节中涉及到的Insert(插入)、Update(更新)和Delete(删除)等都是SQL命令,但是最常用最重要的SQL命令是查询命令Select:例11.1:创建一个视图很象建立一个查询(query),要选择表和希望包括在视图中的字段;指定用来关联表的连接条件;还可任选如何将视图中所做的数据改变传送到源表(基表)的方式(视图是从这些基表建起来的)。创建一个视图时,VFP存贮了一个视图定义(Viewdefinition)在当前数据库中。该定义包括视图的那些表、字段的名字以及它们的属性设置。当使用视图时,视图定义被用来形成一个确定视图数据集的SQL语句。关于视图属性的信息,见本章后面的“设置视图和连接属性”部分,或者参考VFP软件Help(帮助)的DBGETPROP()及CURSORGETPROP()函数。可以创建两种类型的视图:本地视图(LocalView)和远程视图(RemoteView)。远程视图使用远程SQL句法从远程ODBC数据源选择信息。本地视图使用VFPSQL句法从表或视图选择信息。用户可以添加一个或多个远程视图进入一个本地视图,使用户能在该同一视图访问来自VFP和远程ODBC数据源的信息。关于在一单个视图中访问本地和远程视图的信息,见本章后面“结合本地和远程数据在一个视图”部分。在VFP中建立视图会用到一个有用的工具-视图设计器(ViewDesigner),如图11-2所示。图11-2视图设计器(远程视图和本地表共存于本地视图中)数据库中使用的视图设计器与查询设计器基本类似,不同的只是上面已谈到的三点:视图不象查询,它是可修改的,在SQLView中修改数据后,VFP会自动修改与视图有关的基表(即视图建立在之上的表)中的数据;视图只能作为数据库的一部分保存下来而不是作为一个单独的文件(选择文件+保存菜单项去存贮视图,视图名不能含路径),而查询可以作为单独的QPR文件存贮;视图可以包含远程服务器中的表,用户在自己的计算机上所作的修改可以送回到服务器。如果数据库中包含远程基表,可以使用视图设计器的更新条件(UpdateCriteria)卡。这是为避免与其他用户冲突而设立的,可用来确定如何修改源表。如果视图只包含本地表,则不需要使用这个卡。11.2.1创建本地视图(LocalView)为创建本地视图,可在菜单“文件”(File)->“打开”(open),打开一个项目后在项目管理器(ProjectManager)选择一个数据库(Database),然后选本地视图(LocalView),再选“新建”(New)去打开视图设计器(ViewDesigner);或者使用CREATESQLVIEW命令带AS子句。例11.2:建立一个包括Products表中全部字段的视图:CREATESQLVIEWProduct_ViewAs;SELECT*FROMtestdata!products如果打开数据库设计器,可看见此视图在数据库模式中如同表的方式显示,所不同的是在表名处代之以视图名。上例中,数据库testdata后带有“!”符号,表示不是当前打开的数据库。从此数据库的Products表选全部字段,建立了名叫Product_view的视图。注意:当创建或使用项目管理器中的视图时,项目管理器为用户自动打开了数据库。如果使用一个在项目外面的视图,用户则必须打开数据库或者确保已用“!”符号指出了数据库范围。另外还应注意:CREATESQLVIEW与CREATEVIEW命令是不一样的,前者是对数据库的表,后者是对自由表。11.2.2创建多表视图用户若想访问存贮在两个或更多的表中的相关信息时,可创建多表视图。在用视图设计器创建一个视图时,添加多个表,或者用CREATESQLVIEW命令能建立多表视图。通过修改已存在的视图或通过创建新视图,创建多表视图。1.修改一个视图在项目管理器中,选择视图的名字,然后选修改(Modify)去打开视图设计器。或者,打开数据库,使用带有此视图的MODIFYVIEW命令。还可用视图设计器工具栏去添加一个新表到视图。例11.3:用程序码在视图设计器中显示Product_view视图:OPENDATABASEtestdataMODIFYVIEWProduct_view2.用语言创建一个多表视图可使用CREATESQLVIEW命令带FROM子句来创建一个多表视图,用WHERE或FROM子句指出联接条件。(1)在WHERE子句中使用联接条件例11.4:如果想知道订单的信息,包括接收订单雇员和发出订单顾客的信息,可建立一个使用Customer、Orders和Employee表的视图,用WHERE子句指出连接条件(即视图中只包含满足此条件的记录)。OPENDATABASEtestdataCREATESQLVIEWcust_order_emp_wiewAS;SELECT*;FROMtestdata!customer,testdata!orders,testdata!empoyee;WHEREcustomer.cust_id=orders.cust_id;.AND.employee.emp_id=orders.emp_id此程序创建了多表视图cust_order_emp_view。注意:对于远程视图,联接条件通常出现在WHERE子句中。(2)用FROM子句指定视图的联接条件先看下面两个例子。例11.5:OPENDATABASEtestdataCREATESQLVIEWcust_orders_viewAS;SELECT*FROMtestdata!customer;INNERJOINtestdata!orders;ONcustomer.cust_id=orders.cust_id例11.6:OPENDATABASEtestdataCREATESQLVIEWcust_orders_viewAS;SELECT*FROMtestdata!customer;LEFTOUTERJ