在powerbuilder的应用程序开发过程中,对数据库中数据进行操作的对象是数据窗口对象(datawindow),利用数据窗口对象,我们可以十分方便地完成对数据库中已经存在的表中数据进行检索、查询、插入、删除和更新。但是,在实际问题中,我们常常遇到数据库中的一些表是用户在程序运行期间动态生成的,若要对这样表中的数据进行操作,就要运用动态数据窗口对象,值得提到的一点是,在动态数据窗口对象生成时,其标题区(header band)中的文本不能直接显示成汉字,这的确是一点遗憾,不过这个问题可以通过映射的方法得到解决。
一、 问题的提出
设有如下两张表:
a表中的记录是用户可以在程序运行期间进行自由增加、修改、删除和更新的,b表中的属性(即:字段)由a表中的记录决定并动态创建,而且,能够方便地对b表中的数据提供汉化的操作界面。当然,将b表创建为下表
也是可以的,但是,在动态生成数据窗口对象时,其标题区(header band)中的文本不会显示成汉字,而是一些乱码,反而不利于问题的解决。
二、 问题的解决
1、 动态创建b表的解决
我们要动态创建b表,就要构建动态sql语句。何谓动态sql语句?数据库应用程序通常进行确定的工作,因此在编写和编译时,就可以确定完整的sql语句,但当需要使用powerbuilder不支持的嵌入sql语句(如ddl语句),或者在编译时不知道语句的具体格式或参数,则在运行时构成sql语句,这类语句被称为动态sql语句。
动态sql语句的格式:
execute immediate sql statement [using transation object];
参数说明:
sql statement 包含一条有sql语句的字符串
transation object 事务对象
2、 动态数据窗口对象创建及标题区(header band)中文本汉化的解决
(1) 在程序运行时,我们可以调用create函数动态生成数据窗口对象。格式如下:
datawindowcontrol.create(syntax{,errorbuffer})
参数说明:
datawindowcontrol 将在其中创建数据窗口对象的数据窗口控件名
syntax 数据窗口对象源代码
errorbuffer 用于保存错误信息的字符串
(2) 由于标题区(header band)中文本框的名称是对应细目区(detail band)中相应列的名称加上"_t"构成的,而细目区(detail band)中列的名称又是相应表的属性的名称。因此,我们能够使用游标(cursor)取出a表中的ywm和zwm的值,然后使用映射的方式替换标题区(header band)中文本框的文本(text)属性,从而使标题区(header band)中文本框的文本显示为相应的汉字。
三、 一个简单的例子
在powerbuilder 6.5和ms sql server 6.5的环境下,使用一个简单的例子实现上述的观点,限于篇幅,只列出主要界面及关键程序。
1、"动态创建b表"按钮对应的代码是:
int li_i=1,li_count
string ywm[],zdlx[],ls_temp,ls_sql
//使用游标(cursor)从数据库的表中获取ywm和zdlx的值并存储于数组ywm[]和zdlx[]中
select count(*) into :li_count from a;
declare a_cur cursor for select ywm,zdlx from a order by ywm;
open a_cur ;
fetch a_cur into :ywm[li_i], :zdlx[li_i] ;
do while sqlca.sqlcode=0
ls_temp=trim(zdlx[li_i])
choose case ls_temp
case "1"
ls_temp="char(10)"
case "2"
ls_temp="numeric(7,2)"
end choose
zdlx[li_i]=ls_temp
ywm[li_i]=trim(ywm[li_i])
li_i++
fetch a_cur into :ywm[li_i], :zdlx[li_i] ;
loop
close a_cur;
//创建b表和主键(primary key)
ls_sql="create table b"+"("+ywm[1]+" "+zdlx[1]+" not null,"&
+"constraint pk_b primary key ("+ywm[1]+"))"
execute immediate:ls_sql;
//增加b表的列
for li_i=2 to li_count
ls_sql="alter table b add "+ywm[li_i]+" "+zdlx[li_i]
execute immediate:ls_sql;
end for
2、"动态创建数据窗口对象"按钮对应的代码是:
string syntax,sqlselect,errmsg,ls_col1,ls_col2,ls_name,ls_b;
//动态创建数据窗口对象datawindow
ls_b="b"
sqlselect="select * from "+ls_b;
syntax=sqlca.syntaxfromsql(sqlselect,"style(type=grid)",errmsg);
dw_1.create(syntax)
//汉化标题区(header band)文本
declare v_cur cursor for select ywm,zwm from a order by ywm;
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器