当前位置:首页 » 编程软件 » pb动态脚本

pb动态脚本

发布时间: 2022-09-19 14:11:29

Ⅰ PB中,Dynamic为何而存在

在PB中Dynamic是个很有意思的关键字,它允许在PowerScript中动态的调用对象事件或函数,不管这个被调用的事件或函数是否存在,编译器都能通过(点保护时能保存)。但如果在运行时被调用的事件或函数不存在,则会报错并取出程序。其实这是PB的一种后期绑定的机制,又叫动态绑定。也就是用了Dynamic的事件或函数直到运行期才知道实际调用的是哪个事件或函数。 当使用以下脚本调用时 w_a mywindow Open(mywindow, "w_a_desc") mywindow.DYNAMIC Set("hello") 程序运行并不会出错,因为它调用的是w_a_desc的set()函数。Mywindow是一个w_a的变量,但它指向了子类w_a_desc的实例。这是一种典型的装箱过程,但是在父类w_a的定义中并没有Set(String)的这个函数,在这里又能被w_a访问调用。这在程序编写的有些时候是很方便的。 通常的父类是不允许调用子类的特定函数的,因为这会破坏了父类定义的接口规则。这种方法的使用也影响了代码的维护,例如一旦改变了子类w_a_desc该函数接口,编译器并不会在第一时间报出错误,而只能到运行时才会出错。无形时即影响了软件质量,又给测试增加了测试难度。

Ⅱ 关于PB软件编写脚本问题,紧急!

connect using sqlca;
dw_1.settransobject(sqlca)
dw_1.retrieve()
disconnect using sqlca;

Ⅲ 如何在pb脚本当中获取存储过程的返回值

本文拟以SYBASE ASE 10.X和11.X数据库为例,说明如何在PB脚本当中获取存储过程的返回值。作为一个存储过程,其输出的结果数据可能包括三类:SELECT结果集、RETURN结果、OUTPUT参数。尽管输出方式众多,但PB脚本仅仅借助简单的FETCH…INTO…语句即可全部获取这些输出数据,具体方式如下:
(一)在SYBASE ASE 10.X和11.X数据库当中创建一个存储过程deptroster,其有一个输入参数@deptno、两个输出参数@totsal 和 @avgsal、一个RETURN值@number_of_emps以及包含职员姓名和工资的SELECT结果集,可见除了输入参数@deptno外,其他均为输出数据,我们需要在PB脚本中获取,具体代码如下:

CREATE PROCEDURE deptroster @deptno integer,

@totsal double precision output,

@avgsal double precision output

AS

DECLARE @number_of_emps integer

SELECT emp_fname, emp_lname, salary FROM employee

WHERE dept_id = @deptno

SELECT @totsal = sum(salary),

@avgsal = avg(salary),

@number_of_emps = COUNT(*) FROM employee

WHERE dept_id = @deptno

RETURN @number_of_emps;
二)PB脚本当中我们需要捕获SELECT结果集、RETURN值和两个输出参数,其输出顺序也是按照“SELECT结果集、RETURN值、输出参数”顺序输出,具体代码如下:

integer fetchcount = 0

long lDeptno, rc

string fname, lname

double dSalary, dTotSal, dAvgSal

lDeptno = 100

//此处声明存储过程名称

DECLARE deptproc PROCEDURE FOR
@rc = dbo.deptroster

@deptno = :lDeptno,

@totsal = 0 output,

@avgsal = 0 output

USING SQLCA;

//此处开始执行存储过程

EXECUTE deptproc;

//判断执行结果

CHOOSE CASE SQLCA.sqlcode
CASE 0

//如果返回0则表示执行成功,至少存在一个SELECT结果集

//借助LOOP循环开始捕获这个SELECT结果集

DO

FETCH deptproc INTO :fname, :lname, :dSalary;

CHOOSE CASE SQLCA.sqlcode

CASE 0

fetchcount++

CASE 100

MessageBox ("End of Result Set", &

string (fetchcount) " rows fetched")

CASE -1

MessageBox ("Fetch Failed", &

//此处关闭存储过程

CLOSE deptproc;

CASE 100

// 如果返回100,则表示没有返回结果集.

// 此时不需要单独执行CLOSE语句.

MessageBox ("Execute Successful", "No result set")

CASE ELSE

//其他情况则表示存储过程执行失败,提示用户即可

MessageBox ("Execute Failed", &

string (SQLCA.sqldbcode) " = " &

Ⅳ pb常用的脚本

powerscript

Ⅳ pb如何将动态创建的数据窗口释放掉

当 们把用powerbuilder(以下简称pb)开发的数据库客户端应用程序交给用户后,还需要在用户的服务器端的数据库系统上进行一系列配置工作,如建立业务数据库和建表、视图、主键、索引等数据对象。只有正确配置了数据库服务器上的数据结构,应用程序才能正常运行。通常由经验丰富的数据库管理员,使用数据库系统提供的工具,手工或通过其他辅助工具,来完成数据库端的配置工作。本文以微软的sql server 2000为例,介绍用pb开发一个生成业务数据库及各种业务数据对象的程序,用户只要运行这个程序,就可以建立数据库端的数据结构。 程序功能及结构 程序的主要功能是建立客户应用程序运行时需要的业务数据库和在新建立的业务数据库上建立数据对象。 程序的输入信息通过4个单行编辑文本框获得: ●sle_database:新建立的数据库名称; ●sle_datafile:新建数据库所用的数据文件; ●sle_logfile:新建数据库所用的日志文件; ●sle_script:建立数据库中的数据对象所用的脚本文件。 完成程序功能的两个按钮分别为:cb_create 用于建立数据库;cb_table用于在新建的数据库中建立表、主键等数据对象。 在两个输出窗口中输出结果:dw_database 用于显示新建的数据库名称及数据文件;dw_objects用于显示通过cb_table按钮建立的数据对象。 具体实现 考虑到对于一个特定的应用,在系统分析阶段就已经确定数据库所需要的数据空间、日志空间的大小等一些系统物理信息,不会等到程序运行时由用户确定,所以这些信息不需要用户输入。数据库的名称一般来说也是固定的,用户输入的数据库名称(sle_database),可用来检查数据库系统中是否已经有同名的数据库。数据文件和逻辑文件的物理位置和名称,由用户根据服务器上的磁盘空间空闲情况输入(sle_datafile、sle_logfile),程序中给出了初始值,指定的文件位置是sql server通常的数据文件存放位置。 1.建立数据对象的脚本文件(sle_script) 该文件是普通的文本文件类型,其内容由建立表、主键等数据对象的数据定义语言(ddl)组成,其语法符合数据库系统的规则。例如,脚本test.sql内容为建立两个带有主键的表: create table xz_tj_all ( gxjg char(4) not null, nian smallint not null, yue tinyint not null, bz1 tinyint not null, bz2 tinyint not null, a1 integer , a2 integer , a3 integer , primary key (gxjg, nian, yue, bz1, bz2) ) create table xz_tj_4_1 ( gxjg char(4) not null, nian smallint not null, yue tinyint not null, bz1 tinyint not null, bz2 tinyint not null, a1 integer , primary key (gxjg, nian, yue, bz1, bz2) ) 2.窗口的open事件 应用程序只用到一个窗口(w_create_database),在其open事件中,对两个全局事务对象进行创建,并利用其中的一个事务对象(tr_sql)与系统数据库(master)进行连接。此时还没有进行业务数据库的创建工作,业务数据库不存在,所以不能在这里进行与新建业务数据库的连接。w_create_database 的open事件脚本如下: //创建与master系统数据库相连接的事务对象 tr_sql = create transaction tr_sql.dbms =“mss microsoft sql server 6.x” tr_sql.database = “master” //数据库系统管理员 tr_sql.logpass = “sa” //服务器名 tr_sql.servername = “station4” //系统管理员口令 tr_sql.logid = “sa” tr_sql.autocommit = false tr_sql.dbparm = “” //连接到master系统数据库 connect using tr_sql; if tr_sql.sqlcode <> 0 then messagebox (“数据库连接错误”,“不能连接到sql server数据库master。请确认sql server数据库是否启动。~n~r” + “错误信息:”+ tr_sql.sqlerrtext) return end if //从系统表sysdatabases中检索数据库信息 dw_database.settransobject(tr_sql); //创建与新建业务数据库相连接的事务对象 tr_newbase = create transaction tr_newbase.dbms =“mss microsoft sql server 6.x” tr_newbase.logpass =“sa” tr_newbase.servername =“station4” tr_newbase.logid =“sa” tr_newbase.autocommit = false tr_newbase.dbparm =“” 3.cb_create按钮的单击事件 根据业务需要,这里创建的数据文件和日志文件的初始大小为100mb,最大值为200mb,增量为20mb。按钮cb_create根据输入参数构造动态sql语句,创建数据库。cb_create的clicked事件脚本如下: //数据库名 string ls_database //数据文件路径及文件名 string ls_datafile //日志文件路径及文件名 string ls_logfile //创建数据库的sql语句 string ls_mysql //逻辑数据文件名 string ls_logicalfilename //逻辑日志文件名 string ls_logicallogname setpointer(hourglass!) //取得用户输入的数据库名称 ls_database = trim(sle_database.text) //取得数据文件位置和名称 ls_datafile = trim(sle_datafile.text) //取得日志文件位置和名称 ls_logfile = trim(sle_logfile.text) ls_logicalfilename = ls_database +“arch1” ls_logicallogname = ls_database +“archlog1” tr_sql.autocommit = true //建立数据库的语句 ls_mysql=“create database ”+ls_database+“on”& +“( name =”+ls_logicalfilename+“,”& +“filename = ‘”+ls_datafile+“',”& +“size = 100mb,”& +“maxsize = 200,”& +“filegrowth = 20)”& +“log on ”& +“( name = ”+ls_logicallogname+“,”& +“filename = ‘”+ls_logfile+“',”& +“size = 100mb,”& +“maxsize = 200,”& +“filegrowth = 20)” execute immediate :ls_mysql using tr_sql; tr_sql.autocommit = false //检索出刚刚建立的数据库 dw_database.retrieve(ls_database) cb_table.enabled = true setpointer(arrow!) 4.cb_table按钮的单击事件 按钮cb_table从指定的脚本文件(sle_script.text)中读取内容,构造动态的sql语句,创建数据对象。为简化程序,对于脚本文件大于32765字节的情况,本文没做处理,读者可用多次读文件等技术自行处理。 cb_table的clicked事件脚本如下: //创建数据对象前的时间 datetime ldt_create //数据库名 string ls_database //创建数据对象的sql语句 string ls_sql //存储脚本文件名 string ls_filename //打开文件的文件号 int li_fileno //文件长度,读取的文件字节数 long ll_filelength, ll_number //取得新建的数据库名称 ls_database = trim(sle_database.text) if messagebox(“请确认”,“将要在”+ls_database+“数据库中生成表结构?”, question!,yesno!,2) = 2 then return end if setpointer(hourglass!) //为连接业务数据库的事务对象设置数据库值 tr_newbase.database = ls_database connect using tr_newbase; if tr_newbase.sqlcode <> 0 then messagebox (“数据库连接错误”,“不能连接到sql server数据库:”+ls_database +“。~n~r”+“错误信息:”+ tr_newbase.sqlerrtext) return end if //取得建立数据对象的时间,并从系统表sysobjects中提取建立的数据对象 select distinct getdate() into :ldt_create from sysobjects using tr_newbase; //此数据窗口将显示新建事务对象 dw_objects.settransobject(tr_newbase) //从输入中取得脚本文件名 ls_filename = trim(sle_script.text) ll_filelength = filelength(ls_filename) //对大于32765字节的文件不做处理 if ll_filelength > 32765 then messagebox(“”,“脚本文件太大”) disconnect using tr_newbase; return elseif ll_filelength > 0 then //读取文件内容,执行动态sql语句 li_fileno = fileopen(ls_filename, streammode!) ll_number = fileread(li_fileno, ls_sql) if ll_number > 0 and ll_number <= 32765 then tr_newbase.autocommit = true execute immediate :ls_sql usingtr_newbase; tr_newbase.autocommit = false end if fileclose(li_fileno) else //不能正确读取文件信息 sle_script.setfocus() sle_script.selecttext(1,len(sle_script.text)) messagebox(“打开脚本文件出错”,“请输入正确的表结构脚本文件名称”) disconnect using tr_newbase; return end if //检索刚刚建立的数据对象 dw_objects.retrieve(ldt_create) disconnect using tr_newbase; setpointer(arrow!)

Ⅵ PB中,Dynamic为何而存在

但如果在运行时被调用的事件或函数不存在,则会报错并取出程序。其实这是PB的一种后期绑定的机制,又叫动态绑定。也就是用了Dynamic的事件或函数直到运行期才知道实际调用的是哪个事件或函数。 当使用以下脚本调用时w_a mywindowOpen(mywindow, "w_a_desc")mywindow.DYNAMIC Set("hello") 程序运行并不会出错,因为它调用的是w_a_desc的set()函数。Mywindow是一个w_a的变量,但它指向了子类w_a_desc的实例。这是一种典型的装箱过程,但是在父类w_a的定义中并没有Set(String)的这个函数,在这里又能被w_a访问调用。这在程序编写的有些时候是很方便的。 通常的父类是不允许调用子类的特定函数的,因为这会破坏了父类定义的接口规则。这种方法的使用也影响了代码的维护,例如一旦改变了子类w_a_desc该函数接口,编译器并不会在第一时间报出错误,而只能到运行时才会出错。无形时即影响了软件质量,又给测试增加了测试难度。

Ⅶ pb脚本语言

按第一段来说:int n=0 //这个要使用窗口的实例变量,你这是局域变量,被刺clicked后计数器都被清0了,当然无效 select 密码 into:pw from guanliyuan where 口令=:name and 密码=:code;这句sql语句也有问题,这些写法就是用户名和密码都要对上才能执行成功,既然都对上了,sql 里面的into 和下面判断都没啥实际意义了不是。 if sle_code.text=trim(pw) then n = n + 1//这句,汗,之前你的让pw = sle_code.text ,然后现在判断是不是相等?还有这个错误计数器N累加干嘛,密码对上了还累加错误次数计数器 还有我都不知道一个口令,一个密码,这两个概念有区别嘛,我就当是用户名或者用户号了你这么写吧//先把n定义为窗口实例变量
Integer ii_n = 0//登陆按钮event:clicked
String ls_pw
String ls_name,ls_code
ls_name = sle_name.Text
ls_code = sle_code.TextIF ls_name = ''THEN
MessageBox('提醒','请输入用户名和密码')
RETURN
END IFSELECT 密码 INTO:ls_pw FROM guanliyuan Where 口令 = :ls_name ;
IF SQLCA.SQLCode = 100 THEN //没找到用户
ii_n ++ //错误计数器累加
MessageBox('提醒','错误的用户名或密码') //其实是没有找到这个用户名
GOTO Error
END IF
//如果你允许空密码的话,而你的数据密码的字段允许NULL
IF IsNull(ls_pw) THEN ls_pw = ''IF ls_pw <> ls_code //输入的密码和数据库里的密码对不上
MessageBox('提醒','错误的密码,请重新输入')
ii_n++
GOTO Error
END IF//排除以上错误的情况后肯定密码对上了
Open(w_denglu_user)
Close(PARENT)
RETURN
Error:
IF ii_n = 3 THEN
MessageBox('提醒','你已达到最大次数,不能登录')
Close(PARENT)
END IF

热点内容
qsv格式转换不能访问 发布:2025-04-16 08:39:28 浏览:388
文件如何解压缩 发布:2025-04-16 08:38:12 浏览:420
aspnet插入数据库数据 发布:2025-04-16 08:28:20 浏览:518
区块链供应链应用开发智能存储 发布:2025-04-16 08:12:37 浏览:798
x86架构存储 发布:2025-04-16 08:12:27 浏览:902
将电脑的文件上传到服务器 发布:2025-04-16 08:10:05 浏览:334
sql中between 发布:2025-04-16 07:56:28 浏览:769
安卓手机多功能键在哪里 发布:2025-04-16 07:56:27 浏览:55
pythondict中文 发布:2025-04-16 07:55:42 浏览:466
存储管理常见问题 发布:2025-04-16 07:53:36 浏览:348