动态数据窗口的使用
林 栋
在PB中,动态数据窗口是实现高级数据库应用程序的主要手段,在程序执行阶段,用户可以随时将动态数据窗口连接向不同的数据库以完成更多的数据管理功能。
用PB开发数据库应用程序时,一般使用SyntaxFromSQL()和Creat()函数在程序中创建一个动态数据窗口,SyntaxFromSQL()函数的使用语法如下:
transaction.SyntaxFromSQL ( sqlselect, presentation, err )
transaction是PB中的事务处理对象,应用程序必须使用它来获得数据库连接的正确信息;sqlselect参数是包含合法SQL语句的字符串;presentation参数用来指定数据窗口的显示风格;err参数是用来保存错误信息的字符串变量。
SyntaxFromSQL()函数执行后将返回一个字符串,将此字符串传递给Create()函数,这样就可以在程序中创建一个动态数据窗口。
下面用PB6.0设计一个简单的例子介绍动态数据窗口的使用。
1.创建数据表
在PB的程序绘图器(Application Painter)中新建一个应用程序,名称是Student;通过数据表设置窗口为数据表创建五个字段,它们的名称和数据类型分别是:number(integer)、name(char)、sex(char)、class(char)和address(char),创建的数据表保存在名称为student的数据表中。
2.添加数据表记录
第一步完成后,我们已经创建了学生档案数据库的框架了。向数据表中添加需要的学生记录之前,还必须为数据表定义一个主键(Primary
Key),主键是为了防止数据表中有相同的记录而设立的,我们将五个字段中的number字段设置为主键。然后就可以往数据表中添加记录了。
3.创建数据窗口
还需要建立一个数据窗口,它用来显示创建的学生档案数据表。建好后将其保存为名称是d_all的数据窗口中。
4.创建程序主界面
这个例子包含主窗口和查询窗口两个窗口,主窗口用来显示学生档案数据表的所有记录,查询窗口完成用户自定义的查询功能。
在窗口绘图器中创建一个如图1所示的主窗口,各控件的名称见图中所示。主窗口中的数据窗口控件是一个静态数据窗口,该数据窗口控件将与刚才创建的d_all数据窗口相连接。最后将主窗口的名称保存为w_main。
再建一个如图2所示的查询窗口。位于窗口上部的“查询条件”包含两个下拉式列表框和一个文本框,第一个列表框让用户选择数据表中字段,如学号、姓名等,第二个列表框选择关系比较符,包括“>”、“<”和“=”三个关系符,文本框让用户输入一个数值,以建立一个完整的查询条件,例如“学号>2”就是一个查询条件,在查询窗口中也包含一个数据窗口控件,它的名称是dw_search,在程序运行阶段它将实现动态数据窗口的功能。
5.编写程序代码
在PB中,如程序中有执行连接数据库的操作,一般都在程序打开的事件中创建一个事务处理对象,所以在程序的Open事件中添加以下程序代码:
//设置事务处理对象
SQLCA.DBMS=ProfileString(″Pb.INI″,″Database″,″DBMS″,″″)
SQLCA.Database=ProfileString(″Pb.INI″,″Database″,″Database″,″″)
SQLCA.LogId=ProfileString(″Pb.INI″,″Database″,″LogId″,″″)
SQLCA.LogPass=ProfileString(″Pb.INI″,″Database″,″LogPassword″,″″)
SQLCA.UserID=ProfileString(″Pb.INI″,″Database″,″UserID″,″″)
SQLCA.DBPass=ProfileString(″Pb.INI″,″Database″,″DatabasePassword″,″″)
SQLCA.Lock=ProfileString(″Pb.INI″,″Database″,″Lock″,″″)
SQLCA.DbParm=ProfileString(″Pb.INI″,″Database″,″DbParm″,″″)
//连接数据库
Connect Using SQLCA;
if SQLCA.SQLCode<0 then
MessageBox (″连接失败!″,″数据库连接失败″)
Halt
end if
//打开程序主窗口
open(w_main)
进入窗口绘图器并选择显示w_main主窗口,在该窗口的打开事件(Open)中编写如下代码:
//使数据窗口连接向学生档案数据库
dw_all.SetTransObject(SQLCA)
dw_all.Retrieve()
dw_all.SelectRow(dw_all.Getrow(),true)
选择查询按钮,然后单击工具栏上的Script按钮编写有关该按钮的程序代码,在单击按钮的Clicked事件中输入以下代码:
open(w_search)
按照同样的方法,在退出按钮的单击事件中添加如下代码:
close(w_main)
选取程序主窗口中的查询按钮,在该按钮的单击事件中添加如下代码:
//ls_column是保存查询条件中的字段名称
//ls_where保存完整的查询条件
//ls_sql_statement是查询数据库的SQL语句
//ls_return保存执行SyntaxFromSQL()函数后的返回值
//ls_sql_errors保存SyntaxFromSQL()函数的错误
//ls_presentation保存动态数据窗口的显示风格
string ls_column,ls_where,ls_sql_statement,ls_return,ls_sql_errors,ls_presentation
//判断查询条件的字段
CHOOSE CASE ddlb_column.text
case ″姓名″
ls_column=″name″
case ″学号″
ls_column=″number″
case ″性别″
ls_column=″sex″
case ″班级″
ls_column=″class″
case ″住址″
ls_column=″address″
END CHOOSE
//使用SQL语言保存查询条件
ls_where=″student.″+ls_column+ddlb_relate.text+″ ′ ″+sle_condition.text+″ ′ ″
ls_sql_statement=″SELECT FROM student Where ″+ls_where
//设置动态数据窗口的显示风格
ls_presentation=″style(type=grid)column(color=255)″
ls_return=SQLCA.SyntaxFromSQL(ls_sql_statement,ls_presentation,ls_sql_errors)
//在动态数据窗口中显示查询结果
If len(ls_sql_errors)>0 Then
messagebox(″Syntax From SQL″,ls_sql_errors)
//创建动态数据窗口
Else
dw_search.Create(ls_return,ls_sql_errors)
If len(ls_sql_errors)>0 Then
messagebox(″SQL Creat ″,ls_sql_errors)
Else
//显示数据库查询结果
dw_search.settransobject(SQLCA)
dw_search.retrieve()
End If
End If
关闭按钮的单击事件的程序代码是:
close(w_search)
图1
图2