一、用户需求分析
该实习完成的是一个简单的学生学籍管理系统,功能比较简单,要在实际中应用还需进一步的改进和功能的进一步的扩充,它实现的功能如下
1、完成数据的录入和修改,并提交数据库保存。其中的主要数据包括学生的基本信息以及操作员管理等。
2、实现学生信息的简单查询、高级查询及人数的统计。
3、信息具有一定的安全性。对操作员要有口令管理
使用的开发工具:PowerBuilder9.0
二、设计数据库
在下面的表的结构的描述中 ,遵循以下规则:
表的中文含义(表名),如 “学生档案表(student)”。
列的中文含义:列名(数据类型及宽度)[能否为空] [pk]
如“学号:student_id(C12) [n][pk]”表示该列的中文含义是“学号”,列名是 “student_id” 数据类型是“char”,宽度是12,不能为空,[pk]说明该列作为主键。各个表的结构如下
1、学生档案表(student)
学号:student_id(C12) [n] [pk]
姓名:student_name(C12) [y]
性别:sex(C2) [y]
生日:birthday(date)[y]
民族:nation(C10)[y]
政治面貌:background (C10)[y]
学院:department_name (C40)[y]
专业:major_name (C40) [y]
班级:class (C4)[y]
籍贯:hometown (C20) [y]
联系地址:address (C30) [y]
电话:telephone (C20) [y]
备注:remark(C30) [y]
2、操作员表(operator)
编号:operator_id (C20)[n] [pk]
姓名:operator_name (C20) [y]
密码:password (C10) [y]
然后在PowerBuilder9.0中创建ASA本地数据库,操作步骤如下
1、 从“Tools”菜单中选择“Database Profile…”菜单项,系统显示“Database Profiles”对话框,单击“ODBC”项目中“Utilities”图标左边的“+”。
2、 双击“Utilities”项目下的“Create ASA Database”项 ,系统显示“Create ASA Database”对话框。
3、配置数据库的属性。用户名和密码都取默认值,数据库名为student。
4、配置好其他属性后单击OK按钮。
这样就完成了ASA本地数据库的创建。然后在student数据库重创建上面的表。完成了数据库及表的创建,然后连接到数据库,这样子数据库的连接参数都保存在注册表中。以后就可以使用了。
三、系统设计
1、创建应用库和应用对象
工作区名为student.dbw
应用库名为student.dbl
应用对象名为 student,注释名为学生学籍管理系统
对应用对象的open事件进行编程,包括:打开应用程序的封面窗口,设置数据库的连接参数并连接数据库,然后打开登陆窗口。我只使用了一个数据库,用的数据库事务对象是默认的SQLCA。
Open事件中的程序代码:
open(m_welcome)//打开应用程序启动封面窗口
// Profile student
SQLCA.DBMS = "ODBC"
SQLCA.AutoCommit = False
SQLCA.DBParm = "ConnectString='DSN=student;UID=;PWD='"
connect ;
if sqlca.sqlcode<>0 then
messagebox("提示","数据库连接错误,请检查后重试!",stopsign!)
close(m_welcome)
else
messagebox("提示","数据库已经连接上,点击确定进入",information!)
close(m_welcome)
open(w_login)
end if
2、创建全局变量
string gs_password//操作员的口令
string gs_operator_id//操作员的编号
3、创建菜单
菜单名称为m_menu ,各菜单项及相应的Clicked事件中的代码如下:
学生档案管理 (m_file)
更新(m_input):open(w_input)
学号查询(m_query): open(w_query)
w_query.sle_query_id.setfocus()
高级查询(m_querymore):open(w_querymore)
系统设置(m_system)
口令更改(m_chagepassword):open(w_changepassword)
重新登陆(m_relogin): w_main.visible=false
open(w_login)
关于(m_about)
退出(m_quit):disconnect;halt
4、创建数据窗口
1、d_student:学生档案数据窗口。
创建选项:Grid;
显示风格;Quick Select;
数据源 student表,选择所有列;
按student_id排序;
2、d_studentshort:学生学号显示窗口。
创建选项:Grid;
显示风格;Quick Select;
数据源 student表,选择学号属性列;
按student_id排序;
5、创建窗口并在窗口中放置所需的控件
1、w_welcome:封面窗口。
创建选项 Title=“欢迎(欢迎使用学生学籍管理系统测试版)”
WindowType=“popup”
st_welcome.Text=“欢迎使用学生档案管理系统”
st_connect.Text=“正在连接数据库...”
2、w_login :登陆窗口。
创建选项 Title=“登录”
WindowType=“response!”
Icon= “Window!”
st_remind.Text =“请在下面填入您的用户名和口令”
st_id.Text =“用户名”
sle_id.Text =“”
st_password.Text =“口令”
sle_password.Text =“”
sle_password.Password =TRUE
p_login=“ D:/学生学籍管理系统/login.GIF”
cb_ok.Text =“确定”
cb_cancel.Text =“取消”
“确定”按钮的Clicked 事件的代码为
string ls_operator_id
string ls_getpassword,ls_password
ls_operator_id=sle_id.Text
ls_operator_id=trim(ls_operator_id)
ls_getpassword=sle_password.Text
select operator.password
into :ls_password
from operator
where operator.operator_id=:ls_operator_id ;
if sqlca.sqlcode <> 0 then
messagebox("提示","该用户不存在")
sle_id.Text=""
sle_password.Text=""
sle_id.setfocus()
return
end if
if ls_password <> ls_getpassword then
messagebox("提示","口令不正确")
sle_password.Text=""
sle_password.setfocus()
return
end if
gs_operator_id = ls_operator_id
gs_password = ls_password
close(w_login)
open(w_main)
w_main.visible=true
“退出”按钮的Clicked事件的代码为:
disconnect;
halt
3、w_main:主窗口。
创建选项:
Title=“学生档案管理系统”
WindowType=“main!”
MenuName=“m_menu”
st_name.Text =“数据库系统概论实习”
st_vertion.Text =“学生学籍管理系统测试版”
st_me.Text =“欢迎您的测试”
p_main=“ D:/学生学籍管理系统/main.jpg”
4、w_changepassword: 更改口令窗口。
创建选项:
Title=“更改口令”
WindowType=“response!”
p_changepassword=“ D:/学生学籍管理系统/login.GIF”
st_oldpassword.Text =“原口令”
sle_oldpassword.Text =“”
st_newpassword.Text =“新口令”
sle_newpassword.Text =“”
st_newpassword_sure.Text =“确认”
sle_newpassword_sure.Text =“”
cb_ok.Text =“更改”
cb_cancel.Text =“取消”
“更改”按钮的Clicked 事件的代码为
string ls_oldpassword
string ls_newpassword
ls_oldpassword=sle_oldpassword.Text
if ls_oldpassword <> gs_password then
messagebox("提示","口令不正确!")
return
end if
if sle_newpassword.Text <> sle_newpassword_sure.Text then
messagebox("提示","两次输入口令不一致!")
return
end if
ls_newpassword = sle_newpassword.Text
update operator
set password = :ls_newpassword
where operator_id = :gs_operator_id ;
messagebox("提示","修改成功!")
close(w_changepassword)
“取消”按钮的Clicked 事件的代码为
close(w_changepassword)
5、w_input:更新窗口。
创建选项:
Title=“学生基本资料”
WindowType=response!
dw_student.DataObject=“d_student”
cb_add.Text =“增加”
cb_delete.Text =“删除”
cb_save.Text =“保存”
cb_cancel.Text =“退出”
st_hello.Text =“ *修改资料后要记得保存哦…”
Open事件中的程序代码:
dw_student.setTransObject(SQLCA)
dw_student.Retrieve()
“增加” 按钮的Clicked事件的代码为:
open(w_add)
“删除” 按钮的Clicked事件的代码为:
int li_ret
li_ret=MessageBox("提示","确实要删除吗?如果确定删除后请保存结果",exclamation!,yesno!)
if(li_ret = 1) then
dw_student.DeleteRow(0)
end if
“保存” 按钮的Clicked事件的代码为:
if dw_student.update()=1 then
commit;
messagebox("提示","保存成功!")
else
rollback;
messagebox("提示","保存失败!")
end if
“退出” 按钮的Clicked事件的代码为:
close(w_input)
6、m_add: 添加一个学生记录窗口。
创建选项:
Title=“添加一个学生记录”
WindowType=response!
st_input.Text =“请输入学生信息”
st_add_id.Text =“学号”
sle_add_id.Text=“”
st_add_name.Text =“姓名”
sle_add_name.Text=“”
st_add_sex.Text =“性别”
ddlb_add_sex.text=“”,Items为“男”“女”
st_ad_birthday.Text =“出生日期”
sle_add_birthday.Text=“”
st_add_nation.Text =“民族”
sle_add_nation.Text=“”
st_add_background.Text =“政治面貌”
sle_add_background.Text=“”
st_add_departmen.Text =“学院”
sle_add_department.Text=“”
st_add_major.Text =“专业”
sle_add_major.Text=“”
st_add_class.Text =“班级”
sle_add_class.Text=“”
st_add_hometown.Text =“籍贯”
sle_add_hometown.Text=“”
st_add_address=.Text “联系地址”
sle_add_address.Text=“”
st_add_telephone.Text =“电话”
sle_add_telephone.Text=“”
st_add_remark.Text =“备注”
sle_add_remark.Text=“”
cb_add_ok.Text =“保存”
cb_add_cancel.Text =“退出”
Open事件中的程序代码:
w_input.visible=false
“保存” 按钮的Clicked事件的代码为:
long l
string ls_student_id
string ls_student_name
string ls_sex
date ls_birthday
string ls_nation
string ls_background
string ls_department_name
string ls_major_name
string ls_class
string ls_hometown
string ls_address
string ls_telephone
string ls_remark
ls_student_id=sle_add_id.Text
ls_student_name=sle_add_name.Text
ls_sex=ddlb_add_sex.text
ls_birthday=date(sle_add_birthday.Text)
ls_nation=sle_add_nation.Text
ls_background=sle_add_background.Text
ls_department_name=sle_add_department.Text
ls_major_name=sle_add_major.Text
ls_class=sle_add_class.Text
ls_hometown=sle_add_hometown.Text
ls_address=sle_add_address.Text
ls_telephone=sle_add_telephone.Text
ls_remark=sle_add_remark.Text
if ls_student_id = "" then
messagebox("提示","学号不能为空!",stopsign!)
return
end if
w_input.dw_student.setfilter("student_id='"+ls_student_id+"'")
w_input.dw_student.filter()
l=w_input.dw_student.retrieve()
if l <> 0 then
messagebox("提示","该学号已经存在!",stopsign!)
return
end if
insert into student
values( :ls_student_id,
:ls_student_name,
:ls_sex,
:ls_birthday,
:ls_nation,
:ls_background,
:ls_department_name,
:ls_major_name,
:ls_class,
:ls_hometown,
:ls_address,
:ls_telephone,
:ls_remark) ;
if sqlca.sqlcode <> 0 then
rollback;
messagebox("提示","保存失败!",stopsign!)
return
end if
commit;
messagebox("提示","保存成功!")
w_input.dw_student.setfilter("")
w_input.dw_student.filter()
w_input.dw_student.retrieve()
//清空各个控件
sle_add_id.Text=""
sle_add_name.Text=""
ddlb_add_sex.text=""
sle_add_birthday.Text=""
sle_add_nation.Text=""
sle_add_background.Text=""
sle_add_department.Text=""
sle_add_major.Text=""
sle_add_class.Text=""
sle_add_hometown.Text=""
sle_add_address.Text=""
sle_add_telephone.Text=""
sle_add_remark.Text=""
sle_add_id.setfocus()
“退出” 按钮的Clicked事件的代码为:
close(w_add)
w_input.visible=true
7、w_query: 按学号查询的窗口。
创建选项:
Title=“查询”
WindowType=response!
st_student_id.Text =“学号”
sle_student_id.Text=“”
st_student_name.Text =“姓名”
sle_student_name.Text=“”
st_sex.Text =“性别”
sle_sex.text=“”
st__birthday.Text =“出生日期”
sle_birthday.Text=“”
st_nation.Text =“民族”
sle_nation.Text=“”
st_background.Text =“政治面貌”
sle_background.Text=“”
st_departmen.Text =“学院”
sle_department.Text=“”
st_major.Text =“专业”
sle_major.Text=“”
st_class.Text =“班级”
sle_class.Text=“”
st_hometown.Text =“籍贯”
sle_hometown.Text=“”
st_address.Text =“联系地址”
sle_address.Text=“”
st_telephone.Text =“电话”
sle_telephone.Text=“”
st_remark.Text =“备注”
sle_remark.Text=“”
dw_student_short.DataObject= “d_student_short”
st_suery_id.Text =“请输入学号”
sle_query_id.Text =“”
cb_query.Text =“查询”
cb_reset.Text =“清空”
cb_cancel.Text =“退出”
Open事件中的程序代码:
dw_student_short.setTransObject(SQLCA)
dw_student_short.Retrieve()
“查询” 按钮的Clicked事件的代码为:
string ls_query_id
string ls_student_name
string ls_sex
string ls_birthday
string ls_nation
string ls_background
string ls_department_name
string ls_major_name
string ls_class
string ls_hometown
string ls_address
string ls_telephone
string ls_remark
ls_query_id=sle_query_id.Text
select student_name,
sex,
birthday,
nation,
background,
department_name,
major_name,
class,
hometown,
address,
telephone,
remark
into :ls_student_name,
:ls_sex,
:ls_birthday,
:ls_nation,
:ls_background,
:ls_department_name,
:ls_major_name,
:ls_class,
:ls_hometown,
:ls_address,
:ls_telephone,
:ls_remark
from student
where student_id = :ls_query_id ;
if SQLCA.sqlcode <> 0 then
messagebox("提示","没有找到,请核查学号后重新输入!",stopsign!)
sle_query_id.Text=""
return
end if
sle_student_id.Text=ls_query_id
sle_student_name.Text=ls_student_name
sle_sex.Text=ls_sex
sle_birthday.Text=ls_birthday
sle_nation.Text=ls_nation
sle_background.Text=ls_background
sle_department_name.Text=ls_department_name
sle_major.Text=ls_major_name
sle_class.Text=ls_class
sle_hometown.Text=ls_hometown
sle_address.Text=ls_address
sle_telephone.Text=ls_telephone
sle_remark.Text=ls_remark
messagebox("提示","查询完毕",information!)
sle_query_id.Text=""
“清空” 按钮的Clicked事件的代码为:
sle_student_id.Text=""
sle_student_name.Text=""
sle_sex.Text=""
sle_birthday.Text=""
sle_nation.Text=""
sle_background.Text=""
sle_department_name.Text=""
sle_major.Text=""
sle_class.Text=""
sle_hometown.Text=""
sle_address.Text=""
sle_telephone.Text=""
sle_remark.Text=""
sle_query_id.Text=""
“退出” 按钮的Clicked事件的代码为:
close(parent)
8、w_querymore:高级查询的窗口。
创建选项:
Title=“分类查询”
WindowType=response!
dw_querymore .DataObject=d_student
st_name.Text =“姓名”
sle_name.Text =“”
st_sex.Text =“性别”
ddlb_sex.Text =“” Items为“男”“女”
st_department_query.Text =“学院”Items为“计算机学院”“电信学院”“文学院 ”等等
ddlb_department.Text =“”
cb_query.Text =“开始查询”
cb_quit.Text =“退出查询”
st_num.Text =“”
Open事件中的程序代码:
dw_querymore.setTransObject(SQLCA)
dw_querymore.Retrieve()
“开始查询” 按钮的Clicked事件的代码为
string ls_department
string ls_name
string ls_sex
//查询条件
string ls_condition1
string ls_condition2
string ls_condition3
int num
//第一个条件 查询的学院
ls_department=trim(ddlb_department.Text)
ls_condition1="department_name='"+ls_department+"'"
if ls_department = "" then
ls_condition1=""
end if
//第二个条件 查询的姓名
ls_name=trim(sle_name.Text)
ls_condition2="student_name like '%"+ls_name+"%'"
if ls_name ="" then
ls_condition2=""
end if
//第三个条件 查询的性别
ls_sex=trim(ddlb_sex.Text)
ls_condition3="sex='"+ls_sex+"'"
if ls_sex = "" then
ls_condition3=""
end if
// 三个条件都有的情况
if ls_condition1 <> "" and ls_condition2 <> "" and ls_condition3 <> "" then
ls_condition1=ls_condition1+" and "
ls_condition3=" and "+ls_condition3
end if
//两个条件的情况
if ls_condition1 = "" and ls_condition2 <> "" and ls_condition3 <> "" then
ls_condition2=ls_condition2+" and "
end if
if ls_condition1 <> "" and ls_condition2 = "" and ls_condition3 <> "" then
ls_condition1=ls_condition1+" and "
end if
if ls_condition1 <> "" and ls_condition2 <> "" and ls_condition3 = "" then
ls_condition1=ls_condition1+" and "
end if
//过滤查询
dw_querymore.setfilter(ls_condition1+ls_condition2+ls_condition3)
dw_querymore.filter()
num=dw_querymore.retrieve()
//统计满足条件的人数
st_num.Text="查询完毕,满足条件的学生共有"+string(num)+"人"
“退出查询” 按钮的Clicked事件的代码为
close(parent)
四、小结
通过这个小应用系统的学习,掌握数据库系统的基本原理,初步尝试用PowerBuilder开发数据库的技术。
数据库系统概论实习报告
—学生学籍管理系统
学院 计算机学院
学号 200232530020
姓名