数据库应用系统开发工具(PB).ppt
,引言 Power Builder(以下简称PB)是广泛使用于C/S体系结构下的面向对象的数据库应用程序的客户端开发工具。其优秀的面向对象特性,特别是其具有一个功能强大的智能对象数据窗口,使得开发人员利用它操作关系数据库时无需编写SQL语句,能迅速简单地建立复杂的图形应用,来访问本地或网络服务器上的数据库数据。同时它也可用于分布式和B/S体系结构的应用程序的开发。,数据库应用系统开发工具PB,学习要求 应用程序的体系结构;利用PB开发数据库应用程序的全过程;能将前面所学知识与PB结合开发C/S方式的应用系 统。,第9章 数据库应用系统开发工具PB,目前,应用程序的开发主要可选择三种体系结构:客户/服务器(C/S)、分布式和B/S(或WEB)体系结构。C/S应用程序是传统开发人员普遍采用的应用程序体系结构。随着INTERNET和INTRANET的不断普及和应用程序业务逻辑的复杂化,C/S体系结构的应用程序带来一些问题。为解决这些问题,分布式和WEB体系结构应运而生。,9.1 应用程序体系结构,9.1.1 C/S体系结构9.1.2 分布式体系结构9.1.3 WEB体系结构,9.1 应用程序体系结构,C/S体系结构将整个系统划分为两层:一层驻留在客户端,一般由应用程序及相应的数据库连接程序构成,另一层安装在服务器端,通常是某个数据库系统,包括数据库和服务器组件。客户端软件的主要功能是处理与用户的交互、按照某种业务逻辑进行处理以及与数据库进行交互,服务器端数据库系统根据客户端的请求进行数据库操作,然后将结果传送给客户端。客户端与服务器端(数据库)软件之间的交互通过SQL语句进行。,9.1.1 C/S体系结构,C/S结构具有以下优点:(1)采用该体系结构可缩短软件系统的开发周期。C/S体系结构将处理权力下放到客户端,因此客户端用户拥有强大的处理能力,这在很大程度上激发了终端用户的积极性,提高了工作效率。(2)提高系统性能。在该体系结构下,处理是分布式的,由众多的CPU参与处理,从而提高了整个系统的效率。(3)采用该体系结构开发的系统具有柔性。从组织运营和技术两方面提高了组织的柔性。,9.1.1 C/S体系结构,产生的问题:(1)维护困难。(2)缺乏安全性。(3)客户机负荷过重。(4)网络传输负担过重。(5)不适应INTERNET环境的要求。,9.1.1 C/S体系结构,1.客户端开发工具可以完成的工作(1)设计窗口和定义窗口的控件(2)生成菜单(3)生成数据窗口(4)在程序中直接书写SQL语句操作数据库(5)可以方便地生成和维护数据库(6)在图形方式下生成数据查询。用户即使不会使用SQL语句也可以在此环境下生成复杂的查询,并将其作为一类对象保存。(7)实现数据库之间数据的转换,9.1.1 C/S体系结构,2.数据库可以完成的工作 数据库是C/S应用系统的核心,从客户端开发工具来看,它的作用主要有:(1)接收SQL指令,执行SQL指令,并将指令的执行结果返回给客户端。(2)查询优化。(3)事务处理(4)并发处理(5)存取权限管理(6)数据库规则,9.1.1 C/S体系结构,(7)相关完整性约束(8)存储过程(9)触发器(10)视图(11)序号生成器,9.1.1 C/S体系结构,9.1.1 C/S体系结构,查询优化 客户端发出的SQL指令,数据库要先对其进行语法和句法分析,然后进行查询优化。查询优化分为两类:一类是基于语法的优化,这类优化是根据SQL语句的写法而进行的,相同的查询不同的写法会导致完全不同的查询效率。另一类是基于成本的优化,这类优化与SQL语句的写法无关,仅与要完成的工作有关。基于成本的优化技术降低了对开发人员的要求,可以使开发人员更专心地解决应用中的问题。,9.1.1 C/S体系结构,事务处理 数据库的特点是数据的集中管理和共享,在通常情况下总是有若干个事务并发地运行,这些并行的事务可能并发地存取相同的数据。因此,数据库的一个重要任务是要有一种机制去保证这种并发的存取和修改不破坏数据的完整性,确保这些事务能正确地运行并取得正确的结果。,9.1.1 C/S体系结构,并发处理 若不加控制的话,事务并发执行将导致不正确的结果和数据库状态的不一致。为保证数据库正确地反映所有事务的更新,以及在一事务修改数据库中的数据时,其它事务不能同时修改这些数据,数据库必须用锁来控制对数据的并发存取。并发处理是数据库最重要的问题之一,解决的办法是加锁。大多数数据库都有自动加锁功能。当数据库认为必要时,会在相关对象上加上一个适当的锁。但自动加锁并不一定都恰当,有时需要编程进行干预。,9.1.1 C/S体系结构,数据库规则 规则是加在数据库表列上的约束条件,是在数据库上设定的。主要有限制列的取值范围、唯一性、是否非空等。如果列的输入值不满足约束条件时,则数据库会给出错误信息,数据库只接收满足约束条件的数据。,9.1.1 C/S体系结构,触发器 触发器是一种特殊类型的存储过程,它在插入、删除或修改特定表中的数据时起作用。触发器可以维持表间数据的一致性,保证数据的相关完整性。触发器的优点是不管什么原因造成数据库数据变化时都能自动响应。,9.1.1 C/S体系结构,视图 视图是一个或多个表中数据的一种表现形式,可将视图看作为一个移动的窗口,通过它可看到感兴趣的数据。视图看起来非常象表,对它的查询和操作与表相同。使用视图有以下优点:看到的是所需要的。视图允许用户集中在他们感兴趣的数据或他们负责的数据上进行工作。那些对特定用户或与特定工作无关的数据可以被排除在视图之外。简化数据操作。视图不仅可简化用户对数据的理解,而且可以简化他们的操作。那些被经常使用的查询可以定义为视图,从而使用户不必为以后的操作每次指定全部查询条件。,9.1.1 C/S体系结构,视图允许用户以不同的方式查询同样的数据。安全性。通过视图用户只能查询或修改他们所能见到的数据。通过使用视图和有选择的授权,用户可被限制在使用数据的不同子集上。逻辑数据独立性。视图可帮助用户屏蔽真实表结构带来的影响,使应用程序和数据库结构相互独立,互不影响。,3 C/S应用系统开发应考虑的问题及解决方案 开发C/S应用系统时主要应考虑两个问题:(1)客户端开发工具主要是应用前台的问题,数据库主要是应用后台的问题。由于数据库和客户端开发工具的功能都在不断增强,客户端开发工具在向数据库方向上延伸,数据库的功能在向客户端开发工具方向延伸,一些功能是相互交叉的,所以有些问题用客户端开发工具和数据库都能解决。对于应用中的某些特定问题,使用客户端开发工具还是数据库来解决,用数据库解决该问题的好处是什么,用客户端开发工具的好处又是什么?(2)对于非数据库莫属的工作,客户端开发工具表现特征怎样?客户端开发工具如何针对它们编程?,9.1.1 C/S体系结构,应用系统开发中的一些解决方案:(1)维护体现企业规则的表间关系可用客户端开发工具编程完成,也可用数据库触发器来控制。这种表间的关系是随着企业规章制度的变化而变化的。如果用客户端开发工具编程来实现,则程序的维护将是很困难的。原则上,此类问题应该用触发器来解决,用触发器来实现具有以下优点:企业规则可以在数据库中集中控制。如果企业规则发生变化,只需修改相应数据库触发器的内容,无需修改客户端应用程序,系统容易维护。客户端应用程序编程变得更简单。系统运行效率会提高。但过多地滥用触发器反而会使系统的效率降低。,9.1.1 C/S体系结构,(2)体现企业规则的数据运算可用客户端开发工具编程完成,也要用存储过程完成。(3)事务是由数据库管理的最小逻辑工作单元,在一个事务中所有对数据库的更新操作要么全部成功,要么全部失败。(4)并发处理是多人同时更新数据库中相同数据时的处理方式,数据库可以自动加锁,但这种自动加锁方式不一定适合实际需要。在实际的并发条件下会出现很多难以预料的复杂情况,“恰当”地加锁是客户端开发工具的任务,也是一个较难的问题。(5)序号生成。应该由数据库来完成。,9.1.1 C/S体系结构,(6)视图是数据库中原始数据的某种变换。有时候,这种变换可以用开发工具来完成。但视图的许多优良特性是客户端开发工具所不具有的。哪些工作应由开发工具来完成,哪些工作应由视图来完成,是数据库设计人员和开发人员要认真研究的问题。(7)数据库表列的约束既可以在数据库中完成,又可使用开发工具编程实现。在这一点上它们功能完全重叠,但它们的特性差异较大。在数据库中定义的约束条件只有把数据送到数据库时才起作用,屏幕上录入数据正确与否,数据库无法在录入时知道。而在开发工具中定义的约束只有在屏幕录入时才起作用,数据库不管它的对与错。因此两种约束同样重要。哪些约束用数据库完成,哪些约束在客户端应用程序完成,哪些约束两种都要做是需要认真研究与解决的问题。,9.1.1 C/S体系结构,分布式应用体系结构将应用系统分为三层:表示层、业务逻辑层和数据访问层。表示层应用程序安装在客户机上或从网络上下载到客户机上,它负责用户界面并与用户进行交互。数据访问层是数据源,通常是数据库系统。业务逻辑层是指程序中做出智能决策的那一部分功能,业务逻辑层应用程序驻留在应用服务器上,该层也称为中间层。分布式应用程序体系结构有如下优点:(1)逻辑封装性。将应用系统划分为不同逻辑块,层次清楚。(2)痩客户机。减少甚至消除了传统C/S体系结构中的“胖客户机”的功能负担,使其消肿为“痩客户机”。,9.1.2 分布式体系结构,(3)提高系统性能。将复杂的应用和业务逻辑分离出来并由一台或多台应用服务器进行处理,不仅可提高应用程序的执行速度,而且可减少网络通信流量。(4)提高安全性。由于所有业务逻辑集中驻留在应用服务器上,系统管理人员可方便监控服务器的运行状况,容易控制访问服务器和与服务器打交道的人员数量,从而减少系统管理人员管理系统和维护的工作量,确保系统安全可靠地运行。(5)零客户管理工作。当需要动态改变应用程序的业务逻辑时,只要改变应用服务器的相应应用程序,客户机上的应用程序几乎不需要改变。,9.1.2 分布式体系结构,WEB应用程序体系结构是分布式应用程序体系结构的变种。在此体系结构中,客户端软件是通用的WEB浏览器,应用服务器软件有WEB服务器和其它逻辑服务器。在此体系结构中,客户端通过浏览器向WEB服务器发出请求,WEB服务器将此请求转换成对其它应用服务器或数据库服务器的请求,当其它应用服务器或数据库服务器返回数据给WEB服务器后,WEB服务器生成数据(网页),并将其传回给客户机上的浏览器。详细实现过程我们将在WEB数据库一章中讨论。,9.1.3 WEB体系结构,9.2.1 PB应用开发流程9.2.2 PB对象概述,9.2 PB基础,在此我们以PB8.0为例说明PB应用程序开发过程。(1)系统分析和设计 在此阶段主要完成系统需求分析,理解系统要完成的任务。(2)建立工作空间 工作空间(Workspace)是PB中组织各种开发资源的一个概念,类似于其它高级语言中的工程概念,但又有所不同。工作空间是对软件资源进行管理的有效手段,其作用是方便对各种软件对象进行分类管理。(3)建立应用对象 要建立应用程序必须在工作空间下建立应用对象(Application),应用对象下管理的是项目的所有软件资源。,9.2.1 PB应用开发流程,(4)建立各种对象 完整的PB应用是由多种对象组合在一起构成的,这些对象包括窗口(Window)、数据窗口(Data window)、类(Class)、菜单(Menu)、函数(Function)等,它们类似于积木,通过Power Script语言将这些对象组合起来就构成了一个完整的PB应用程序。(5)编写事件处理程序 在各种对象设计完成后,需要使用Power Script编写对象或控件的事件处理程序,在这些程序中可嵌入标准SQL语句,从而实现对数据库的操作。,9.2.1 PB应用开发流程,(6)运行调试 通过上述步骤设计的应用程序,要经过不断的运行调试、查找错误,最后运行成功后才打包生成可执行文件。(7)打包生成可执行程序 利用PB提供的打包功能,生成并发布应用程序,脱离PB环境独立运行。,9.2.1 PB应用开发流程,1.对象、属性和事件 PB的对象是由PB提供的,可用来构造PB应用程序的一些部件。PB为这些对象约定了属性(properties)和事件。属性决定了事件的特征,而事件是外部作用于对象上的“动作”,这一动作可触发一段程序的执行。每个PB对象包含以下组成部分:(1)每一个对象都包含一个属性集来描述对象的特征,可以通过程序读取或设置这些属性值。(2)每一对象可有一组相关事件,每一个事件对应一个事件处理程序,当对象指定事件发生时就会触发相应事件的处理程序。,9.2.2 PB对象概述,9.2.2 PB对象概述,(3)每一对象可有若干个函数供对象中的脚本(Script)调用。(4)每个对象可有若干结构。(5)每一对象可以有若干脚本代码,每一段脚本代码与对象的某一事件相对应,对应事件发生时自动执行其脚本代码。脚本代码也称为事件处理函数或事件处理程序。开发人员可以为对象的属性指定特定的值,为对象或控件的事件编写特定的程序,也可为对象定义新的事件(即用户自定义事件)。当对象的事件发生时,将驱动一特定的程序段完成其操作,因此在学习PB时我们应该了解对象的事件何时触发、事件触发的先后顺序等。,9.2.2 PB对象概述,2.PB库文件 PB的所有对象存储在PB的库文件(扩展名为PBL)中。一个PB的应用程序有一个或多个库文件。在建立PB应用对象时系统会提示开发者指定一个文件名。当PB库文件过大时会影响应用程序的执行效率,我们可以建立新的库文件,将PB对象存储在不同的库文件中。建立一个工作空间将产生一个扩展名为PBW的文件,它记录有关工作空间的信息。在一个工作空间中可建立多个目标,每一目标对应于一个扩展名为PBT的文件,其中记录了有关目标的信息。每一个目标实际上是一个应用程序,它可对应一个或多个库文件。,3.应用对象 PB的应用程序是从应用对象开始执行的。应用程序对象定义应用程序的特征,如当前应用的库文件、缺省字体字型等。应用对象常使用的事件是Open事件和Close事件,当执行一个应用程序时,应用对象的Open事件被触发,在Open事件中必须有一条打开主窗口的语句,还可有一些与数据库连接有关的语句等。当用户结束应用时,应用对象的Close事件被触发,此事件是关闭数据库。4.窗口对象 窗口是用户和PB应用程序间的主要界面,它可以显示信息,接收用户的信息,响应用户的操作等。窗口由属性、事件和控件构成。其中属性定义了窗口的外形和特征,如窗口的大小、标题等。最常用的事件是Open 和Close事件。控件是窗口用来控制应用的部件,如命令按钮。,9.2.2 PB对象概述,5.数据窗口对象 数据窗口对象用于数据库或其它数据源的数据检索和数据操作。它可根据用户的需求设计成不同的显示风格,也可以对每一列定义显示格式、编辑格式和合法性检验规则等。数据窗口的数据源可以是表、视图、存储过程或外部数据。一个窗口可以有多个数据窗口,不同的数据窗口可以对应不同的数据源甚至不同的数据库系统。6.查询对象 一个查询(Query)是用一个名字保存的一条Select语句,使其可以重复用于数据窗口对象的数据源。由于查询可以一次编码,重复使用,因此使用它可提高开发效率。,9.2.2 PB对象概述,7.菜单对象 菜单是用户操作应用程序的主要界面或工具。用户通过选择菜单项可执行相关的命令或任务。开发者可为用户定制菜单,为菜单项定义快捷键或图标。PB定制的菜单类似于Word的菜单,它可分为多个层次,一个菜单项可弹出一个下拉式菜单,一个下拉式菜单项又可弹出一个级联菜单等。8.用户对象 在PB应用程序中,有一些对象具有类似的特征并重复出现或使用时,我们可以定义用户对象(User object)。用户对象一经定义,就和PB自身对象一样使用。PB有两类用户对象:可视用户对象和类用户对象。,9.2.2 PB对象概述,9.工程对象 建立可执行程序、动态连接库或其它系统应用的组件时需要建立工程(Project)对象。PB允许在可执行文件或动态连接库中包含附加资源(如位图和图标等),也可将附加资源单独分发。10.函数 PB可以定义两种类型的函数:(1)对象级函数。为指定对象定义的函数,这类函数封装在指定对象之内,如窗口函数。(2)全局函数。它不封装在其它对象之内,而是作为独立的对象存储。这些函数主要是一些通用的函数,如数学运算函数。,9.2.2 PB对象概述,11.结构 结构(Structure)对象类似于C语言中的结构,是由一个或多个相关的变量构成,这些变量可以有相同或不同的变量类型。使用结构可以将一组相关的数据项作为一个数据实体来处理。PB有两类结构:(1)对象级结构。它是与特定对象相关的结构,这些结构可用于对象自己的程序代码中,也可以被其它对象的程序引用。(2)全局结构。它不与任何对象有关,可以在应用程序的任何程序代码中说明结构实例和对此结构进行引用。,9.2.2 PB对象概述,PB通过两类数据库接口软件与不同的数据库相连,即通用的ODBC(Open Database Connectivity)接口软件与专用的数据库接口软件。ODBC开放式数据库互接标准接口允许应用存取以SQL做为查询语言的数据库管理系统,PB提供了到ODBC的接口软件,通过这一接口软件,PB可以连接到任何支持ODBC的数据库上。专用接口软件是专为某种数据库设计,通过更换PB到数据库的接口软件以及数据库到网络的接口软件,可以使PB连接到不同的数据库上,与不同的数据库构成客户/服务器体系结构的客户端或B/S模式的WEB服务器端。,9.3 PB与数据库接口,9.3.1 ODBC9.3.2 PB中ODBC数据源及数据库连接参数的配置9.3.3 PB与Oracle连接9.3.4 应用程序与Oracle数据库连接,9.3 PB与数据库接口,ODBC是一种访问数据库的统一界面,已被数据库界广泛接受和采用。从逻辑上看,ODBC由两部分组成:(1)一部分是连接客户端的标准客户端界面。从客户端的角度ODBC遵守共同的标准,这使得不同的开发工具连接和使用数据库的方式是一样的,也使得使用不同的数据库管理系统的方式也一样。(2)另一部分是连接专门的数据库管理系统的服务器端界面或驱动程序。ODBC实际上是一个访问数据库的函数库,应用程序可以通过该函数库直接操作数据库中的数据。另外ODBC是基于SQL语言的,所以ODBC是SQL与应用程序之间的标准接口。,9.3.1 ODBC,ODBC由应用程序、驱动程序管理器、驱动程序和数据源构成。其中应用程序通过ODBC函数完成对数据库的访问操作,其功能包括:(1)请求对数据源的连接,获取连接句柄。(2)指定事务控制方式。(3)定义接收结果的数据区。(4)向数据源发送SQL语句。(5)接收SQL语句的查询结果。(6)处理出错信息,并将出错信息返回给应用程序。(7)结束对数据源的连接。,9.3.1 ODBC,驱动程序管理器负责对ODBC的驱动程序和数据源进行管理,其功能包括:(1)安装指定的驱动程序。(2)定义数据源,并在ODBC.INI文件中把数据源映射到具体的ODBC驱动程序上。(3)为每一驱动程序提供ODBC函数的入口点。(4)为ODBC调用提供参数验证等。,9.3.1 ODBC,驱动程序是真正实现ODBC函数调用和访问数据库的动态连接函数库,对不同的数据库有不同的驱动程序。一般情况驱动程序由数据库厂商提供。驱动程序的功能为:(1)建立与数据源的连接。(2)向数据源提交SQL请求。(3)处理查询结果。(4)将数据源错误转换为标准错误代码,并返回给应用程序。(5)提交事务的开始请求、完成请求和撤消请求等。,9.3.1 ODBC,数据源是通过ODBC连接的关系数据库。ODBC是通过驱动程序来保证数据库的独立性,而驱动程序则是一个用以支持ODBC函数调用的模块,应用程序通过调用驱动程序所支持的函数来操纵数据库。通过建立不同的数据源,可以对不同的数据库进行操作。,9.3.1 ODBC,1.定义数据源 不管是在PB下操作数据库,还是在应用程序中使用数据库,如果通过ODBC连接数据库,则必须首先定义数据源(DSN)。我们也可通过PB的数据库配置文件(Database Profiles)对话框调用ODBC管理程序来实现。其方法如下:单击PB的DB profile工具按钮,展开ODBC,选择Utilities,双击ODBC administrator 调用ODBC管理程序,点击“用户DSN”标签页,单击“添加”命令按钮,选取所使用的数据库的驱动程序,按“完成”命令按钮,指定ODBC标签页下的Data source name(数据源名)和Database标签页下的Database file(数据库文件名)和其它一些参数。,9.3.2 PB中ODBC数据源及数据库连接参数的配置,2.数据库连接参数的配置 在PB下操作库,必须对数据库的连接参数进行配置。其方法如下:(1)单击PB的DB profile工具按钮。(2)选取数据驱动程序,在此选择ODBC。(3)对Connection标签页下指定参数:Profile name(配置文件名)、Data source(数据源名称,在1中定义的数据源名称)、user name(用户名)、password(口令)。一些数据库如Oracle,我们可使用专用接口,只要对数据库连接参数进行配置,而不要定义数据源。,9.3.2 PB中ODBC数据源及数据库连接参数的配置,由于使用专用接口的查询速度要比使用ODBC接口快得多,在应用系统中应采用Oracle专用接口。PB中Oracle接口的使用方法如下:(1)在客户机上安装Oracle客户端软件,并利用Oracle的Net Configuration Assistant配置客户端,假定数据库的连接描述符(数据库别名)为WZ。(2)单击PB的DB profile工具按钮。(3)选取数据驱动程序,在此选择Oracle。(4)对Connection标签页下指定参数:Profile name(配置文件名)、Database、Servername、Login ID(用户名)、password(口令)。其中Database=”WZ”,servername可设置为“TNS:WZ.world”或“:WZ.world”或“WZ.world”,Login ID为“WZZK”,Password为“WZZKADMI”。,9.3.3 PB与Oracle连接,PB应用程序要访问数据库必须向数据库服务器提供合法的登录信息并进行登录。PB的数据库连接是建立与某台数据库服务器上数据库的可靠通信,以传递和提交用户的数据库操作请求。PB利用事务对象管理数据库的连接。1事务对象及其建立 事务对象是PB的不可视对象,对象类型为transaction。SQLCA(SQL Communications Area)是一个事务对象实例,它是PB预定义的一个全局事务对象,用来管理开发期间的数据库连接参数的配置文件,以便PB与数据库服务器进行交互。同时我们也可以在应用程序中自己定义事务对象,其方法如下:(1)用transaction类型说明事务对象变量。(2)用CREATE 语句建立对象实例。,9.3.4 应用程序与Oracle数据库连接,(3)设置连接参数并建立连接。(4)利用事务变量进行数据库操作。(5)用DESTROY语句清除事务对象变量。例9-1 建立事务对象myoracle。transaction myoracle/定义事务对象变量 myoracle=CREATE transaction/建立事务对象实例 myoracle.DBMS=”O91 ORACLE9i”myoracle.Database=”WZ”/数据库别名 myoracle.Userid=”wzzk”/用户名,9.3.4 应用程序与Oracle数据库连接,9.3.4 应用程序与Oracle数据库连接,myoracle.Dbpass=”wzzkadmi”/用户口令 myoracle.Logid=”wzzk”/登录名 myoracle.Logpass=”wzzkadmi”/登录口令 myoracle.ServerName=”wz.world”myoracle.Autocommit=FALSE myoracle.DBParm=”CommitOnDisconnect=NO”connect using myoracle;/通过事务对象与数据库连接如果在PB应用程序中使用SQLCA,则不需要定义,只需设置连接参数且connect命令后的“using SQLCA”可省略。,9.3.4 应用程序与Oracle数据库连接,2事务对象的使用 PB的事务对象可在PB脚本的任何地方定义,但在使用时应注意定义的事务对象变量是全局变量、共享变量、实例变量还是局部变量,因为其作用范围不同。在执行SQL语句或进行数据窗口操作之前,必须使用CONNECT连接相应数据库。如果使用自定义的事务对象,在SQL语句后面应加上“Using 事务对象变量名”。在完成对数据库的操作后,使用“DISCONNECT Using 事务对象名;”断开与数据库的连接,在适当时候应清除事务对象变量,每一种编程语言都有自己的约定,PB也不例外。PowerScript是PB的编程语言,事件处理程序、自定义函数等的编写都是使用 PowerScript编写的。由于我们已学习了一种或几种高级语言(如C语言),在此仅对PowerScript作一简单介绍。,94 PowerScript 语言介绍,9.4.1 PowerScript基本概念9.4.2 常量、变量、函数和表达式9.4.3 PowerScript语句9.4.4 嵌入式SQL与动态SQL语句9.4.5 函数与事件的调用9.4.6 ORACLE的存储过程和函数调用,94 PowerScript 语言介绍,1 空值 空值是关系数据库中的一个特殊概念,可以将其认为一个特定的值,也可以将其认为不确定的值。空值不是空字符串,也不是数字0。用NULL表示空值。在PowerScript中不能用赋值语句对变量赋NULL值,而应使用函数SetNULL()对变量赋NULL。也不能将NULL用于比较运算,而须使用函数IsNULL()来判断表达式是否为NULL。在SQL的INSERT和UPDATE中可以使用NULL将表中字段设置为空值。,9.4.1 PowerScript基本概念,2 代词 PowerScript可以使用代词来引用对象或控件,这样可以增加程序代码的通用性。PowerScript中的代词有:Parent、This和Super。(1)Parent Parent引用当前对象的父对象或包含当前对象的对象,它可用于窗口中的控件、用户对象的控件和菜单等。(2)This This用于引用当前对象自身的属性或事件等。它可用于窗口、用户对象、菜单、应用对象和各种控件等。,9.4.1 PowerScript基本概念,(3)Supper 子对象或控件中的程序可以调用祖先对象或控件中的程序,可以直接使用祖先的名称调用,也可使用代词Supper来调用。这里所说的子对象与祖先对象是有继承关系的两个对象。调用祖先对象函数的格式为:Supper:函数名(参数)调用祖先对象事件的格式为:Call Supper:事件名或:Supper:event(事件名),9.4.1 PowerScript基本概念,常量、变量、函数和表达式是所有程序设计语言的重要组成部分,在此只介绍PowerScript的特殊部分。1数据类型 PowerScript的数据类型可分为标准数据类型、可变数据类型、系统对象数据类型和枚举数据类型。(1)标准数据类型 标准数据类型是我们在高级程序设计语言中所熟悉的数据类型,如Char、Int,在此不作介绍。(2)可变数据类型 可变数据类型(Any类型)变量可以保存任意数据类型的值。可用赋值语句给Any类型的变量赋值,赋值后,变量类型也随之变化。,9.4.2 常量、变量、函数和表达式,(3)系统对象数据类型 系统对象数据类型是PowerScript的一种特殊类型。在PB中窗口、菜单、各种控件都是系统对象。有时为建立系统对象的不同实例,需要定义具有系统对象数据类型的变量。(4)枚举数据类型 枚举数据类型常用作函数参数或指定对象或控件的属性。即在PB中有些函数的参数、对象或控件的属性是枚举数据类型的。应当注意的是用户不能定义枚举数据类型的变量,且在每一枚举值之后应加上“!”。,9.4.2 常量、变量、函数和表达式,2常量 常量的使用与我们所学过的高级语言类似,在此仅介绍符号常量的定义。符号常量是将一个标识符说明为一个常量,它的作用主要是用来提高程序的可读性和可移植性。其格式为:CONSTANT 权限 类型 常量名=常量值 或:权限 CONSTANT 类型 常量名=常量值 其中权限为PRIVATE(私有)、PROTECTED(保护)和PUBLIC(公共)。例如:说明pi是一个公共常量的语句为:CONSTANT PUBLIC REAL pi=3.14159,9.4.2 常量、变量、函数和表达式,3变量(1)全局变量 在整个应用程序内有效,它独立于任何对象。可以在窗口、用户对象、菜单或其它对象的脚本中定义全局变量。(2)实例变量 属于定义它的对象并与该对象的一个实例有关,可以将其看作对象的一个属性。实例变量与定义它的对象实例同时建立和撤消。,9.4.2 常量、变量、函数和表达式,(3)共享变量 属于定义它的对象并在这个对象的所有实例中引用。共享变量在定义它的对象关闭时并不撤消,其值保持不变,再次打开该对象可继续使用该值。共享变量只能在定义它的对象脚本中引用。可以在窗口中、用户对象、菜单或应用对象中定义共享变量。(4)局部变量 局部变量在使用它的事件处理函数或自定义函数中说明。程序段内只能引用在其内部定义的局部变量。局部变量在定义它的脚本中执行时建立,在脚本执行完成后立即释放。,9.4.2 常量、变量、函数和表达式,PowerScript中的函数分为内部函数、用户自定义函数、外部函数和远程过程调用(Remote procedure call,简称为RPC)。内部函数由系统函数和对象函数组成,系统函数与任何对象无关的并由PowerScript提供,这些函数完成一些公共的计算和处理功能。用户自定义函数是用户根据需要定义的函数,用户可定义全局函数,也可定义对象函数。外部函数是指使用其它语言编写并保存在动态链接库中的函数,在使用外部函数时必须进行说明。系统函数的调用与其它高级语言函数的调用一致。对象函数的调用格式为:对象名.函数名(参数值表)。,9.4.2 常量、变量、函数和表达式,5表达式 表达式是由常量、变量、函数和运算符等构成的。PowerScript支持四类运算符:算术运算符、关系运算符、逻辑运算符和字符串连接运算符。它们的使用与其它高级语言类似,但应注意的是:减号(-),在一般情况下“-”被认为是连字符,在表达式中要将“-”作为减号来使用时必须在它的前后都加上一个空格。,9.4.2 常量、变量、函数和表达式,1赋值语句 赋值语句给变量或对象的属性赋值。给变量赋值的格式为:变量名=表达式。给对象的属性赋值的格式为:对象名.属性名=表达式。应当注意的是PowerScript不允许一次给多个变量或属性赋值。同时与C语言类似,PowerScript提供了一些简化的赋值运算符,如“+”。2分支结构 PowerScript提供的分支结构有条件语句和多分支语句。(1)条件语句条件语句根据特定条件选择执行不同的语句,它分为单行格式和多行格式。,9.4.3 PowerScript语句,单行格式如下:IF 条件 THEN 语句1 ELSE 语句2 多行格式:IF 条件1 THEN 语句组1ELSEIF 条件2 THEN 语句组2 ELSE 语句组END IF,9.4.3 PowerScript语句,(2)多分支结构 CHOOSE CASE语句是用来进行多分支选择的,其格式如下:CHOOSE CASE 表达式 CASE 表达式1 语句组1 CASE 表达式2 语句组2 CASE 表达式n 语句组n CASE ELSE 语句组END CHOOSE,9.4.3 PowerScript语句,3循环结构 PowerScript的循环语句有5种,其格式分别如下:格式1:DO UNTIL 条件 语句组 LOOP 该语句当条件不成立时执行语句组,直到条件成立时结束循环。格式2:DO 语句组 LOOP UNTIL 条件该语句先执行语句组,然后检测条件是否成立,若条件不成立继续执行语句组,若条件成立,则结束循环。,9.4.3 PowerScript语句,格式3:DO WHILE 条件 语句组 LOOP 该语句当条件成立时执行语句组,当条件不成立时结束循环。格式4 DO 语句组 LOOP WHILE 条件 该语句先执行语句组,然后检测条件是否成立,若条件成立继续执行语句组,否则结束循环。格式5 FOR 循环变量=初值 TO 终值 STEP 步长 语句组 NEXT,9.4.3 PowerScript语句,4CALL语句 CALL语句用于在了对象中调用祖先对象中的函数或事件。可以调用菜单、用户对象、窗口等祖先对象中的事件或函数,也可以调用用户对象或窗口祖先对象中控件的事件。其格式如下:CALL 祖先对象名控件名:事件名。5建立与删除对象实例语句 CREATET 和DESTROY语句分别用来创建和删除对象实例。(1)CREATE语句 CREATE语句根据指定的对象类型建立一个对象实例,该语句的返回结果为存储在同一类型的变量中的对象实例。在对象实例被创建后可以引用对象实例的属性。,9.4.3 PowerScript语句,该语句有两种格式,一种是静态指定对象类型,另一种是动态指定对象类型。它们的格式如下:格式1:对象变量=CREATE 对象类型 此语句为对象变量创建一个指定对象类型的对象实例。格式2:对象变量=CREATE USING 对象类型字符串 该语句根据对象字符串中指定的对象类型建立一个对象实例。(2)DESTROY语句 DESTORY语句删除由CREATE语句建立的对象实例。用CREATE语句建立的对象实例在使用完毕后应使用该语句及时释放,使对象实例所占用的内存资源得到重新使用。该语句格式为:DESTROY 对象变量,9.4.3 PowerScript语句,在PB应用程序开发过程中,在多数情况下对数据库的操作是通过数据窗口进行的,但数据窗口并不是万能的,有时我们需要利用SQL语句对数据库进行操作。PowerScript提供了嵌入式SQL语句与动态SQL语句。1 嵌入式SQL 在PowerScript的脚本中可以使用标准SQL语句,但在标准SQL语句的后面应加上“USING 事务对象名;”,如果所使用的事务对象是SQLCA,则只需在SQL语句后加上“;”即可。例如连接数据库命令为:CONNECT USING SQLCA;如果在SQL语句中使用变量,应在变量之前加上“:”。应该注意的是:在SQL语句中使用的函数应该是数据库系统的函数,而不是PB的函数。,9.4.4 嵌入式SQL与动态SQL语句,2 动态SQL(1)既无输入参数、也无结果集的动态SQL语句 该类型SQL语句格式为:EXECUTE IMMEDIATE 字符串 USING 事务对象名;(2)有输入参数、但无结果集的动态SQL语句 该类型动态SQL语句能够处理设计时已经知道SQL语句的参数个数,且该SQL语句没有返回值。它可以在运行时定义参数的数据操作语句。其格式如下:PREPARE 动态策略区变量 FROM 字符串 USING 事务对象名;EXECUTE 动态策略区变量 USING 参数值表;,9.4.4 嵌入式SQL与动态SQL语句,9.4.4 嵌入式SQL与动态SQL语句,其中动态策略区(DynamicStagingArea)变量是类型为DynamicStagingArea的对