《第09章PowerScript语言.ppt》由会员分享,可在线阅读,更多相关《第09章PowerScript语言.ppt(72页珍藏版)》请在三一办公上搜索。
1、2023/8/29,数据库原理及开发,1,第9章 PowerScript语言,本章重点内容 PowerScript基本概念 变量与常量的数据类型、作用域、声明及引用 PowerScript基本语句的格式要求 函数与结构的定义及引用 嵌入式SQL的应用,2023/8/29,数据库原理及开发,2,9.1.1 标识符标识符是指在程序中使用的变量、标号、函数、窗口、控件、菜单及所引用对象的名称。在PowerBuilder8中,标识符的命名遵从下述规则:标识符必须以英文字母或者下划线“_”开头。标识符不能是保留字。标识符只能由字母、数字和如下特殊字符组成:短划线“-”,下划线“_”,美元符“$”,号码符
2、“#”和百分号“%”。标识符不区分大小写字母。标识符不能超过40个字符,且中间不能出现空格。,9.1 PowerScript基本概念,2023/8/29,数据库原理及开发,3,由于PowerScript允许在标识符中使用短划线“-”,这就使得在使用减号“-”操作符时,需要在它前后加空格,否则PowerScript将把表达式当作标识符处理,出现编译错误。标识符命名规则最好使用有一定意义的单词,当同一类标识符有多个时,可以使用两个以上单词的组合,建议用以下方法:使用下划线“_”(例如:w_main)。首字母大写(例如:FirstCount)。,9.1 PowerScript基本概念,2023/8/
3、29,数据库原理及开发,4,9.1.2 保留字:保留字不能单独作为一个标识符,但可以作为单词组合的其中一个单词。9.1.3 代词,9.1 PowerScript基本概念,2023/8/29,数据库原理及开发,5,9.1 PowerScript基本概念,9.1.3 代词1Parent:(1)当为窗口中的控件编写脚本使用Parent时,Parent指代包含控件的窗口。(2)当为用户对象中的控件编写脚本使用Parent时,Parent指代用户对象。(3)当在菜单的脚本中使用Parent时,它指代上一级菜单。2This代表对象或控件本身,2023/8/29,数据库原理及开发,6,9.1.3 代词3Pa
4、rentWindow代词ParentWindow仅能在菜单的脚本中使用,它代表运行时菜单所在窗口。注意:用户不能用ParentWindow来引用父窗口(菜单所在窗口)中的控件。4Super用户可以直接用祖先的名称调用它们,也可以使用代词Super引用其直系祖先。注意,不能用Super调用祖先窗口中的控件的脚本,9.1 PowerScript基本概念,2023/8/29,数据库原理及开发,7,9.1.4 空值(NULL)空值(NULL)表示未定义或未知的,它与空字符串、数值零和日期0000-00-00不同,因为NULL不是0或非0的任何数值。空值是PowerBuilder与数据库交换数据时使用的
5、一种特殊值。所有PowerBuilder变量数据类型都支持空值,即可以给任何类型的数据赋空值,但不能将空值作为变量的默认初始值。,9.1 PowerScript基本概念,2023/8/29,数据库原理及开发,8,9.1.4 空值(NULL)给变量赋空值的途径有两条:从数据库中读到空值。用SetNull函数赋值。测试变量或表达式的值是否为空值应该调用IsNull()函数,而不是用等号。,9.1 PowerScript基本概念,2023/8/29,数据库原理及开发,9,9.1.5 特殊ASCII字符,9.1 PowerScript基本概念,2023/8/29,数据库原理及开发,10,9.1.5 特
6、殊ASCII字符包括上表中所列字符在内,任何ASCII字符都可以在符号后用它的ASCII码值表示,ASCII码值可以用十进制(000-255),十六进制(后接小写的h,范围01-FF),八进制(后接小写的o,范围000-377)。,9.1 PowerScript基本概念,2023/8/29,数据库原理及开发,11,9.1.6 断行、续行和注释1语句的断行、续行和分隔分隔符:PowerScript的行分隔符是分号“;”。断行:可以加上分隔符表示断行,把多条语句写在一行上。续行:在语句中间加上续行符“&”,换行后接着书写。注意:不能在标识符或保留字的中间续行。不需要在SQL语句中用续行符,因为Po
7、werBuilder中的SQL语句总是以分号结束,编译器认为从SQL语句开始到分号之间的每一部分都是SQL语句的组成部分。,9.1 PowerScript基本概念,2023/8/29,数据库原理及开发,12,9.1.6 断行、续行和注释2注释行注释:以双斜杠“/”开始到行结束。块注释:以“/*”开始到“*/”结束。,9.1 PowerScript基本概念,2023/8/29,数据库原理及开发,13,9.2 数据类型,9.2.1 标准数据类型,2023/8/29,数据库原理及开发,14,9.2 数据类型,9.2.1 标准数据类型,2023/8/29,数据库原理及开发,15,9.2 数据类型,9.
8、2.2 系统对象数据类型在PowerBuilder应用中,窗口、菜单、各种控件都是系统对象,每一种系统对象实际上是定义在PowerBuilder内部的一种数据类型。9.2.3 任意数据类型任意数据类型,即Any类型,是PowerScript中较为灵活的数据类型,Any类型是一种可变的数据类型,Any类型的变量能使自己变成赋给它的数据值的类型,它可以接受标准数据类型、结构类型、对象类型以及数组等各种类型。,2023/8/29,数据库原理及开发,16,9.2.3 任意数据类型通过赋值语句给Any类型变量赋值后,可以用ClassName()函数检查Any类型的实际数据类型Any类型也存在着一些潜在的
9、不安全因素。使用Any类型时应注意以下几点:访问Any类型变量前必须先赋值。如果定义了一个Any类型的数组,那么在赋值以前不能访问该数组的元素。如果定义了一个Any类型的结构,那么在给结构赋值以前不能访问其成员变量。,9.2 数据类型,2023/8/29,数据库原理及开发,17,9.2.3 任意数据类型Any类型变量参加运算时,必须保证所有参加运算的数据值的类型一致,否则会发生错误。当函数原型中不允许Any类型作为函数参数时,需要使用类型转换函数进行类型转换,否则将产生诸如“Unknown function”或“Function not found”之类的编译错误。因为PowerScript通
10、过函数名、参数类型及参数个数来确定调用哪个函数。另外,对那些可以确定数据类型的变量,应避免使用Any类型,原因在于:(1)Any类型变量的实际类型需要在PowerScript运行过程中确定,无疑会使运行时间变长,影响程序运行效率,在循环体中使用Any类型变量更是如此。(2)编译器不对Any类型数据进行正确性检查,错误只在运行时才会发现,而运行时的错误难以查出出错原因。,9.2 数据类型,2023/8/29,数据库原理及开发,18,9.2.4 枚举类型 枚举类型是PowerScript中定义的特殊常量。枚举类型通常用来设置对象和控件的属性或者作为系统函数的参数使用。所有枚举类型的值都是系统预先定
11、义的,不能像其他语言一样可以向定义好的枚举类型集合中添加新的元素,而只能按系统要求使用它。枚举类型实际上一组固定的值,这些值通常以英文单词开始,以“!”结尾来表示其为特殊类型。,9.2 数据类型,2023/8/29,数据库原理及开发,19,无论是常量或是变量在使用前都应先声明,以便编译时分配适当的存储空间,并且声明的格式、位置不同,其作用域和可见性也不同。9.3.1 变量变量是指在程序运行过程中可以改变的量。在应用中,使用变量前必须先予以声明。声明变量的简单语法格式为:数据类型名 变量名=初始值 其中,数据类型 变量名为任何合法的标识符,9.3 变量与常量,2023/8/29,数据库原理及开发
12、,20,9.3.1 变量声明变量时可以直接把一常量或表达式的值赋给它(初始化),变量初始化是在编译时进行,而不是在运行时完成。如果声明变量时不赋初值,系统将按数据类型的默认值自动赋初值可以在同一条语句同时声明多个相同类型的变量,变量之间用逗号(,)分隔即可。语法格式为:数据类型名 变量名=初始值,变量名=初始值,变量名=初始值,9.3 变量与常量,2023/8/29,数据库原理及开发,21,9.3.2 常量常量是在程序运行过程中其值保持不变的量。声明常量时需要加关键字CONSTANT,必须赋初值,并且不能再改变。常量声明的语法格式为:CONSTANT 数据类型 常量名=值其中常量名一般用大写字
13、母表示,以便将其和变量名区别开来。注意,声明常量时不能在一行中进行多项声明。,9.3 变量与常量,2023/8/29,数据库原理及开发,22,9.3 变量与常量,9.3.3 数组组成数组的变量称为元素,每一个元素都有唯一索引号(下标),用于将其与其它元素区分开来。数组有两种类型,即一维数组和多维数组,多维数组的大小必须确定,而一维数组的大小可以确定,也可以不确定。数组的每一维最多可包含147,483,647个元素。声明数组的语法格式如下:数据类型 数组名d1,dn=初值,2023/8/29,数据库原理及开发,23,9.3.4 变量的作用域作用域即使用范围,无论是变量还是常量都有自己的作用域1全
14、局变量(Global)全局变量可以在整个应用程序中被访问,它的作用域是整个应用程序。PowerBuilder8中声明全局变量的方法。为了增强程序的可读性和编码的规范性,全局变量名以字符g开头,表示该变量为全局变量(Global)。2实例变量(Instance)实例变量属于某个对象(应用程序、窗口、用户对象或菜单)并与该对象相关联,只有在该对象及与该对象相关的控件的脚本中才能使用其定义的实例变量。,9.3 变量与常量,2023/8/29,数据库原理及开发,24,3共享变量(Local)共享变量和实例变量类似,只能在定义共享变量的对象和与该对象相关的控件的脚本中访问共享变量。但是,共享变量与实际的
15、类定义相关联,而与对象实例无关,这意味着所有同类实例都可共享相同的变量。共享变量是一种静态变量,将保存其最后的设置,也就是说,它所在的对象关闭后再次打开时,共享变量依然保持对象关闭时的值。4局部变量(Shared)局部变量在使用它的事件或函数中声明,它仅属于声明它的脚本,在该程序段的任何地方均可访问局部变量,但其它程序段不能访问该程序段中的局部变量。运行程序后,进入某个程序段时,自动为该程序段的局部变量分配内存,退出程序段时局部变量占用的内存被释放。,9.3 变量与常量,2023/8/29,数据库原理及开发,25,运算符表示了一个或两个操作数之间的运算操作。PowerScript利用运算符构成
16、表达式,完成一定的运算。9.4.1 算术运算符,9.4 运算符与表达式,2023/8/29,数据库原理及开发,26,扩展算术运算符,9.4 运算符与表达式,2023/8/29,数据库原理及开发,27,9.4.2 关系运算符,9.4 运算符与表达式,2023/8/29,数据库原理及开发,28,9.4.3 逻辑运算符9.4.4 连接运算符连接运算符“+”,用于把Sring型或Blob型变量的内容连接起来。,9.4 运算符与表达式,2023/8/29,数据库原理及开发,29,9.4.5 运算符的优先级,2023/8/29,数据库原理及开发,30,9.4.6 表达式表达式是由算术运算符、关系运算符及逻
17、辑运算符连接起来的变量、常量构成的语法单位。数值数据类型转换级别,9.4 运算符与表达式,2023/8/29,数据库原理及开发,31,9.5.1 赋值语句语法格式为:variablename=expression其中,variablename代表变量名,expression代表表达式,也可以是字符串、数字、变量或常量以及数组等。在赋值语句中,若等号右边是表达式,则先将其结果转化为等号左边变量的类型后,再赋值给变量。注意:因为等号“”在表达式中可以作为关系运算符,所以在赋值语句中,不能实现连续赋值。,9.5 基本语句,2023/8/29,数据库原理及开发,32,9.5.2 条件控制语句1IFTH
18、EN语句(1)单行IFTHEN语句语法格式为:IF condition THEN action1 ELSE action2(2)多行IFTHEN语句语法格式为:IF condition1 THEN Action1 ELSEIF condition2 THEN Action2ELSE Action3END IF多行IFTHEN语句即使只有action1一个语句块,也需要END IF表示多行IFTHEN的结束。,9.5 基本语句,2023/8/29,数据库原理及开发,33,2CHOOSE CASE语句适用于多分支选择结构。语法格式为:CHOOSE CASE testexpressionCASE e
19、xpressionliststatementblockCASE expressionliststatementblockCASE expressionliststatementblockCASE ELSEstatementblockEND CHOOSE,9.5 基本语句,2023/8/29,数据库原理及开发,34,2CHOOSE CASE语句其中,testexpression代表测试值,expression代表判断表达式,statementblock代表测试值与判断表达式相匹配时执行的语句块,方括号里的内容可以省略。判断表达式可以有如下几种形式:(1)用逗号分隔一组数据。(2)用TO表示一个区
20、间。(3)用IS代表测试值,与关系运算符一起构成关系表达式(4)用前三种形式的组合,用逗号进行分隔。,9.5 基本语句,2023/8/29,数据库原理及开发,35,2CHOOSE CASE语句在CHOOSE CASE语句中,至少应包含一个CASE子句,并且由END CHOOSE结束。执行CHOOSE CASE语句时,PowerScript将逐条查找CASE子句,如果找到与测试值相匹配的判断表达式,就执行该CASE子句中的语句块,然后执行END CHOOSE的后继语句。如果包含CASE ELSE子句,那么在未找到任何匹配的判断表达式时,执行CASE ELSE子句中的语句块。,9.5 基本语句,2
21、023/8/29,数据库原理及开发,36,9.5.3 循环控制语句1DOLOOP语句(1)DO UNTIL conditionLOOP语法格式为:DO UNTIL conditionStatementblockLOOP执行过程为:先判断控制条件condition,如果为false,则执行语句块statementblock,执行到LOOP后,接着判断条件condition,直到结果为true时结束循环。,9.5 基本语句,2023/8/29,数据库原理及开发,37,(2)DO WHILE conditionLOOP的语法格式:DO WHILE conditionStatementblockLOO
22、P执行过程为:先判断控制条件condition,如果为true,则执行语句块statementblock,执行到LOOP后,接着判断条件condition,直到结果为false时结束循环。(3)DOLOOP UNTIL condition的语法格式:DO StatementblockLOOP UNTIL condition执行过程为:先执行语句块statementblock,然后判断控制条件condition,如果为false,则继续执行语句块statementblock,直到condition的结果为true时结束循环。,9.5 基本语句,2023/8/29,数据库原理及开发,38,(4)D
23、OLOOP WHILE condition的语法格式为:DO StatementblockLOOP WHILE condition执行过程先执行语句块statementblock,然后判断控制条件condition,如果为true,则继续执行语句块statementblock,直到condition的结果为false时结束循环。四种循环结构比较前两种结构是先判断条件,再执行循环体,所以有可能开始时条件就不满足,从而使得循环体一次都不能得以执行;后两种结构是执行一次循环体后再判断条件,所以至少可以执行一次循环体。,9.5 基本语句,2023/8/29,数据库原理及开发,39,2FORNEXT语句
24、语法格式为:FOR varname=start TO end STEP incrementStatementblockNEXT3GOTO语句GOTO语句的语法格式为:GOTO label其中,label是语句标号,它使用标识符的命名规则,语句标号可以出现在程序的任何位置,但必须在一行语句的最前面,并且后面要跟冒号。,9.5 基本语句,2023/8/29,数据库原理及开发,40,4循环嵌套循环嵌套是指把一个循环放在另一个循环的循环体中。5EXIT语句EXIT语句是中途结束循环的语句。注意:如果在循环嵌套中使用EXIT语句,那么执行EXIT语句只能退出当前层的循环,而不能退出所有循环。6CONTI
25、NUE语句CONTINUE语句控制循环的执行使之返回循环开始处。,9.5 基本语句,2023/8/29,数据库原理及开发,41,9.5.4 其它语句1CALL语句CALL语句在继承对象中调用祖先对象的脚本。语法格式为:CALL ancestorobjectname controlname:event其中,ancestorobjectname是指祖先对象名,方括号里的内容表示可以省略,controlname是指祖先对象中的控件名,event是指祖先对象中的事件名。2RETURN语句RETURN语句用于立即终止脚本或函数的执行并返回调用程序。其语法格式为:RETURN expression其中,e
26、xpression表示函数的返回值,方括号内的内容可以省略。,9.5 基本语句,2023/8/29,数据库原理及开发,42,3HALT语句HALT语句用于终止应用程序的运行。其语法格式为:HALT CLOSE其中CLOSE为可选项,当遇到不包含CLOSE的HALT语句时,将立即终止应用程序的运行,如果遇到包含CLOSE的HALT语句,则先执行应用对象的CLOSE事件中的脚本,然后终止应用程序。4CREATE语句CREATE语句用于创建对象实例。语法格式有两种:语法一:Objectvariable=CREATE objecttype其中,Objectvariable表示返回的句柄,即与创建的对象
27、实例类型相同的变量。Objecttype表示所创建对象的类型。,9.5 基本语句,2023/8/29,数据库原理及开发,43,4CREATE语句语法二:Objectvariable=CREATE USING objecttypestring其中,Objectvariable表示返回的句柄,即与创建的对象实例类型相同的变量。Objecttypestring表示要创建对象类型名称的字符串。注意:CREATE语句用于创建非可视对象,可视对象的实例使用OPEN函数打开,标准数据类型和结构体不用CREATE语句创建,当对象的AutoInstantiate属性被设置为TRUE时不需要使用CREATE语句。
28、5DESTROY语句DESTROY语句用于释放由CREATE语句创建的实例。语法格式为:DESTROY Objectvariable其中,Objectvariable表示对象实例变量,9.5 基本语句,2023/8/29,数据库原理及开发,44,9.6.1 MessageBox()函数使用MessageBox()函数可以向用户显示或提示各种信息。语法如下:MessageBox(title,text,icon,button,default)title是一个被用来确定MessageBox标题的字符串。text是在MessageBox中显示的文本。icon用来指示显示在MessageBox左侧的图标
29、。可选的值有Information!StopSign!、Exclamation!、Question!、None!。,9.6 常用标准函数,2023/8/29,数据库原理及开发,45,button用来指示你想要显示的命令按钮的集合。这些值是OK!、OKCancel!、YesNo!、YesNoCancel!、RetryCancel!、AbortRetryIgnore!。返回值只有1、2、3和-1,分别表示用户的按键和失败的情况。默认值是OK!。default指定默认的按钮举例messagebox(提示,你好,StopSign!,OKCancel!,2),9.6 常用标准函数,2023/8/29,数
30、据库原理及开发,46,9.6.2 GetFileOpenName()函数和 GetFileSaveName()函数 作用用于显示Windows系统打开文件对话框和保存文件对话框,GetFileOpenName()用于选择要打开的文件名及所在路径,GetFileSaveName()用于选择或输入要保存的文件名及路径。格式GetFileOpenName(title,pathname,filename,extension,filter,initdir,aFlag)GetFileSaveName(title,pathname,filename,extension,filter,initdir,aFla
31、g),9.6 常用标准函数,2023/8/29,数据库原理及开发,47,title字符串类型:用于指定对话框标题栏上显示的文本。pathname字符串变量:用于存储从对话框返回的路径和文件名。filename字符串变量:用于存储从对话框返回的文件名。extension字符串(可选)(长度为13个字符):用于指定对话框中默认文件的扩展名,该参数的默认值为没有扩展名,9.6 常用标准函数,2023/8/29,数据库原理及开发,48,filter字符串(可选):用于指定在对话框中文件类型下拉列表框中显示的允许用户选择或保存的文件的扩展名类型,格式为*.ext,例如*.exe;如果只显示.txt为后缀
32、名的文本文件,则Filte参数值为:”Text Files(*.TXT),*.TXT”;如果显示多种扩展名,并且可操纵多种扩展名的文件,则filter参数值可按如下格式设置:”PIF files,*.PIF,Batch files,.BAT“。Filter参数的默认值为:”All Files(.),.”,表示所有类型文件。initdir字符串(可选):用于指定对话框打开时的初始路径,默认值为系统当前路径。,9.6 常用标准函数,2023/8/29,数据库原理及开发,49,aFlag long型(可选):用于指定在对话框中的可用选项。每种选项的flag值用公式2(index-1)计算,其中ind
33、ex是和选项相关的整数值。最后传递给GeFiletOpenName和GetFileSaveName的flag值是各选项flag值之和。返回值Integer类型,成功时返回1,如果用户单击“取消”按钮则返回0;出错返回-1;如果某一参数为NULL,则返回值为NULL。实例:文件拷贝功能实现,9.6 常用标准函数,2023/8/29,数据库原理及开发,50,9.6.3 数据类型检查函数数据类型检查函数又称为Is簇函数它们用来判断一个字符串是否符合某种数据类型的格式,返回值是一个布尔类型的值。Is簇函数的语法格式为:Is*(string)其中string为要测试的字符串。IsNumber()用于测试
34、某字符串是否为有效数值。IsDate()检测指定的字符串是否包含有效日期。IsTime()检测指定的字符串是否包含有效时间。IsNull()测试某变量或表达式的值是否为Null。,9.6 常用标准函数,2023/8/29,数据库原理及开发,51,9.6.4 数据类型转换函数,9.6 常用标准函数,2023/8/29,数据库原理及开发,52,9.6.5 Run()函数调用Run()函数可以在PowerBuilder应用程序中运行其它的应用程序。语法格式为:Run(Program,state)其中参数Program是一个字符串,指定要运行的程序名称。,9.6 常用标准函数,2023/8/29,数据
35、库原理及开发,53,9.7.1 自定义函数参数的传递方式有以下三种:Value 表示值传递,将实际参数的值传递给函数。Reference地址传递,把实际参数的地址传递给函数,如果函数修改了形式参数的值,则实际参数的值也就被修改了。Readonly只读地址传递,把实际参数的地址传递给函数,但不允许修改参数的值。,9.7 自定义函数和结构,2023/8/29,数据库原理及开发,54,1自定义全局函数(1)选择FileNew菜单项,或在工具栏中单击New图标,打开New对话框,单击PB Object选项卡。(2)选择Function图标,然后单击OK按钮,或者直接双击该图标,打开Function画板
36、,9.7 自定义函数和结构,2023/8/29,数据库原理及开发,55,(3)在Function Name项中输入函数名,自定义全局函数的命名一般用“f_”开头,命名规则即标识符的命名规则;在Return Type下拉列表框中选择函数的返回值类型,如果函数没有返回值,则选择“None”项;在Pass By下拉列表框中选择参数传递方式;在Argument Type下拉列表框中选择参数类型;在Argument Name项中输入参数名(即形式参数,简称形参),命名规则即标识符的命名规则。(4)编写完函数脚本后可以编译并保存该函数。,9.7 自定义函数和结构,2023/8/29,数据库原理及开发,56
37、,2自定义对象函数自定义对象函数与某对象相联系,是为具体的对象(如窗口、菜单、用户对象或应用程序)而定义的,它是这些对象的一部分,与对象保存在一起。自定义对象函数的访问级别可以改变,有三个级别分别为:Public可以在应用程序的任何脚本中调用该函数Private只能在定义该函数的对象脚本中才能调用该函数,不能在该对象的后代脚本中调用该函数。Protected可以在该函数的对象以及它的后代的脚本中调用该函数。调用自定义对象函数时,如果在对象中调用,则可直接调用,如果在对象外调用,必须在函数名前指定对象名。,9.7 自定义函数和结构,2023/8/29,数据库原理及开发,57,9.7.2 结构1全
38、局结构全局结构,在应用程序的任何地方都可以访问的结构。全局结构作为独立的对象存放在库中。创建过程(1)选择FileNew菜单项,或在工具栏中单击New图标,打开New对话框,单击PB Object选项卡。(2)选择Structure图标,然后单击OK按钮,或者直接双击图标,打开Structure画板 输入域变量2对象结构对象结构是在具体的对象(如窗口、菜单、用户对象或应用程序)中定义的,它是这些对象的一部分,与对象保存在一起。与函数不同的是不能为结构定义访问级别,一般只能在对象内使用,或当该对象打开时,可以在其它对象脚本中使用该结构。,9.7 自定义函数和结构,2023/8/29,数据库原理及
39、开发,58,如果需要在程序中连接数据库就必须通过嵌入式SQL来完成,有时候我们需要在程序中直接使用SQL语句操作数据库。PowerScript提供了一整套嵌入式SQL语句。PowerScript支持在程序中使用嵌入式SQL语句,并且支持在SQL语句中使用具体数据库管理系统(DBMS)特有的SQL语句、函数和保留字,实际上,对于SQL语句,PowerBuilder在将其发送到DBMS之前,并不做任何处理,而由DBMS完成相应操作,最后PowerBuilder得到处理结果。,9.8 嵌入式SQL语句,2023/8/29,数据库原理及开发,59,PowerBuilder中嵌入SQL语句的要求整个SQ
40、L语句可以写在一行,也可以写成更清晰易懂的多行格式,不需使用断行续行符,只要在整个语句结束处加上一个分号(;)即可。在SQL语句中可以使用常量或合法的变量,但使用变量时须在变量前加个冒号(:)(通常称做绑定变量),多个变量或常量之间用逗号(,)分隔。,9.8 嵌入式SQL语句,2023/8/29,数据库原理及开发,60,9.8.1 数据库连接的建立与断开1使用CONNECT建立与数据库的连接CONNECT是每个访问数据库的PowerBuilder程序必须使用的语句,它的功能是通过事务对象将应用程序与数据库建立连接,连接成功后,其它SQL语句和数据窗口才能通过事务对象对数据库进行操作。CONNE
41、CT语句的语法格式为:CONNECT USING TransactionObject;其中,TransactionObject是事务对象,在执行该语句前,必须正确设置事务对象的数据库连接属性。方括号()表示该成分可以省略,省略时使用默认的事务对象SQLCA。,9.8 嵌入式SQL语句,2023/8/29,数据库原理及开发,61,9.8.1 数据库连接的建立与断开2使用DISCONNECT断开与数据库的连接DISCONNECT语句断开与数据库的连接,执行该语句时,它首先执行COMMIT语句(事务提交语句),完成事务提交,然后断开与数据库的连接。DISCONNECT语句的语法格式为:DISCONN
42、ECT USING TransactionObject;其中,TransactionObject是前面用CONNECT语句连接的事务对象名。,9.8 嵌入式SQL语句,2023/8/29,数据库原理及开发,62,9.8.2 提交与回滚事务1提交事务语句COMMITCOMMIT语句提交事务,完成数据库的物理修改。执行该语句后,将关闭所有先前打开的游标(CURSOR)和过程(PROCEDURE),并开始一个新的事务。COMMIT语句的语法格式为:COMMIT USING TransactionObject;其中,TransactionObject是事务对象名,缺省时使用事务对象SQLCA。,9.8
43、 嵌入式SQL语句,2023/8/29,数据库原理及开发,63,9.8.2 提交与回滚事务2回滚事务语句ROLLBACKROLLBACK(回滚)语句放弃自上一个COMMIT、ROLLBACK或CONNECT语句以来的所有数据库操作,关闭所有的游标和过程,并开始一个新的事务。其语法格式为:ROLLBACK USING TransactionObject;其中,TransactionObject是事务对象名,缺省时使用事务对象SQLCA。,9.8 嵌入式SQL语句,2023/8/29,数据库原理及开发,64,9.8.3 数据查询语言和数据操纵语言 第3章介绍的数据查询语言SELECT语句和数据操纵
44、语言UPDATE、DELETE和INSERT语句都可以嵌入PowerScript脚本语言中使用,只需遵守嵌入规则即可。并且在这几种语句的最后可加入USING TransactionObject子句,USING作为关键字,TransactionObject为连接数据库的事务对象名称。如果连接数据库使用缺省的事务对象SQLCA,则该子句可以省略。,9.8 嵌入式SQL语句,2023/8/29,数据库原理及开发,65,9.8.4 检查SQL语句的执行情况每当执行一条SQL语句后,与该语句相关的事务对象的SQLCode属性都给出一个值指示SQL语句的执行是否成功,SQLCode取值为:0:最近一次SQ
45、L语句执行成功-1:最近一次SQL语句执行失败100:最近一次SQL语句没有返回数据当SQLCode的值为-1时(即最近一次SQL语句执行失败时),事务对象的SQLDBCode属性中存放着数据库厂商提供的错误代码、事务对象的SQLErrText属性中存放着数据库厂商提供的错误信息,利用这两个属性,可以得到出错原因。,9.8 嵌入式SQL语句,2023/8/29,数据库原理及开发,66,Int Emp_numEmp_num=Integer(sle_Emp_Num.Text)SELECT employee.Emp_LName,employee.Emp_FnameINTO:sle_LName.tex
46、t,:sle_FName.textFROM EmployeeWHERE Employee.Emp_nbr=:Emp_numUSING Emp_tran;if Emp_tran.SQLCode=100 then/未找到满足条件的数据MessageBox(查询雇员,未找到指定雇员)elseif Emp_tran.SQLCode 0 then/SELECT语句执行不成功MessageBox(数据库错误,&Emp_tran.SQLErrText,Exclamation!)/出错信息End If,9.8 嵌入式SQL语句,9.8.4 检查SQL语句的执行情况实例,2023/8/29,数据库原理及开发,6
47、7,9.8.5 游标操作(读取多行数据)当需要读取多条记录时,就需要使用游标进行操作。其典型运用过程一般为:(1)用DECLARE声明游标;(2)用OPEN语句打开游标;(3)使用FETCH语句读取一行数据;(4)处理数据;(5)判断是否已经读完所有数据,未读完时重复执行(3)(5)步;(6)使用CLOSE语句关闭游标。,9.8 嵌入式SQL语句,2023/8/29,数据库原理及开发,68,1DECLARE语句使用游标前需要用DECLARE语句声明游标,其语法格式为:DECLARE CursorName CURSOR FOR SelectStatementUSING TransactionOb
48、ject;其中,CursorName是游标的名称,可以使用任何有效的标识符来表示;SelectStatement是任何有效的SELECT语句;TransactionObject是事务对象名,缺省时使用SQLCA。,9.8 嵌入式SQL语句,2023/8/29,数据库原理及开发,69,2OPEN语句OPEN语句打开已经声明的游标并执行相应的SELECT语句。其语法格式为:OPEN CursorName;其中CursorName是已经用DECLARE语句声明的游标名。3FETCH语句FETCH语句从游标中读取当前记录并把它保存到指定的变量中。当数据库支持下述用法时,还可以使用FETCH FIRST
49、、FETCH PRIOR、FETCH LAST。FETCH语句的语法格式为:FETCH CursorName INTO HostVariableList;其中CursorName是OPEN语句打开的游标名,HostVariableList是与SELECT语句中选择字段相对应的绑定变量列表。,9.8 嵌入式SQL语句,2023/8/29,数据库原理及开发,70,4CLOSE语句CLOSE语句关闭先前打开的游标。其语法格式为:CLOSE CursorName;其中CursorName是先前打开游标的名称。关闭游标后,就不能再使用FETCH语句从游标中读取数据了。,9.8 嵌入式SQL语句,2023
50、/8/29,数据库原理及开发,71,例如,要实现从数据库用户表中将所有name(用户名)字段的值读取出来写到窗口上的下拉列表框控件ddlb_1中,利用游标的实现代码如下:string name/定义变量/定义游标declare user_point cursor forselect password.namefrom password;open user_point;/打开游标fetch user_point into:name;/获取数据/循环读取数据放入下拉列表框do while sqlca.sqlcode=0 ddlb_1.additem(name)/将数据写到下拉列表框中fetch u