7207数据库.docx
《7207数据库.docx》由会员分享,可在线阅读,更多相关《7207数据库.docx(18页珍藏版)》请在冰豆网上搜索。
7207数据库
学
生
成
绩
管
理
系
统
院系:
信院电子系
专业:
信息与计算科学
学号:
11011100xx姓名:
xxx
2013年1月02日
powerBuilder(简称PB)开发学生成绩管理系统,该系统用于实现对学生信息,课程信息和学生成绩的增加,删除,修改查询等功能。
在实现上述功能时涉及了PB中对数据库的基本操作和对数据库中触发器以及存储过程的使用。
准备工作
1.在数据库PSXCJ中创建CXB表。
2.新建操作PSXCJ数据库数据源。
3.新建Profile:
与数据源相连。
一主应用程序与主题窗
1.主应用程序
前面介绍了建立数据库连接及通过数据库画板访问数据库的方法。
但是,在应用程序中药访问数据库必须通过事务对象实现,事务对象是一种特殊的非可视化对象。
在PB应用程序中,如果要连接和操作数据库,必须首先建立事务对象。
在PB中,对数据库操作的步骤如下:
(1)为事务对像属性赋值;
(2)连接到数据库;
(3)根据需要,将事务对像赋值该DataWindow空件或DataStore对象;
(4)执行数据库操作;
(5)断开与数据库的连接。
PB提供了一种默认的全局事务对象SQLCA,开发人员可使用默认对象建立与数据库的连接。
如果应用程序需同时操作多个程序,则必须建立另外的数据库事务对象。
在应用程序XSCJ的open()事件中添加代码,用于对默认是务对象SQLCA的属性赋值,并连接到数据库,具体代码如下:
SQLCA.DBMS="ODBC"
SQLCA.AutoCommit=False
SQLCA.DBParm="ConnectString='DSN=PXSCJ;UID=PUSER;PWD=123456'"
connectusingsqlca;
ifsqlca.sqlcode<>othen
messagebox("提示!
","连接数据库失败原因"+sqlca.sqlerrtext)
return
endif
open(stumain)
2.设计主题窗
设置主窗口MDI类型,并添加菜单,运行。
主要功能:
进入各个界面的主菜单。
创建过程:
(1)创建窗口stumain,WindowType为MDI类型。
(2)创建菜单stumen,添加菜单项。
(3)添加菜单代码,双击菜单项,会出现编辑窗口。
代码设计:
“学生信息查询”菜单Click事件代码;
open(stuseach)
功能:
打开stuseach学生信息查询窗口。
“学生信息修改”菜单Click事件代码;
open(stuinfo)
功能:
打开stuinfo学生信息修改窗口。
“学生成绩修改”菜单Click事件代码;
open(stuscore)
功能:
打开stuinfo学生成绩修改窗口。
④“成绩分布分析”菜单Click事件代码;
open(stuscorechart)
功能:
打开stuscorechart学生成绩修改窗口。
3学生信息查询
输入查询条件,在数据窗口中提示查询的结果。
主要功能:
根据用户的输入条件,运用数据窗口控件的过滤功能,实现数据的查询,并实现学生照片的更新。
创建过程:
(1)创建DataWindowsstuschdw,创建GRi功能的数据窗口。
单击“OK”按钮,进入数据源选择界面,选择SQL_Select。
单击“NEXT”按钮,进入数据表选择界面,选择xcb,xsb,表,并把xcb表中的性别和xsb表中的性别关联,选择xh,xm,xbm,cssj,zy,zxf,bz以供DataGrid显示。
(2)创建输入条件控件:
学号和姓名两个SingleLineEdit控件、专业DropDownListBox
控件和Picture控件,分别命名为“stuxh”、“stuxm”、“stuzy”、“StuZP”。
(3)创建DataWindow控件,命名为dw_1,DataObject对象为stuschdw。
代码设计:
窗口的“open”事件。
设置数据窗口的SetTransObject对象,并获得数据。
dw_1.SetTransTransObject(sqlca)
dw_1.retrieve
添加全局变量。
BLob{5485760}Ls_BLob
intpic_flag
stringcurrent_xh
“查询”Click事件。
根据输入从数据窗口中过滤符合条件的记录。
stringsql,strtmp
stringsstuxh,sstuxm,sstuzy
sstuxh=trim(StuXH.text)
sstuxm=trim(stuXM.text)
sstuzy=trim(stuZY.text)
ifsstuzy<>""then
strtmp="ZY="'+sstuzy+'"and"
strtmp=strtmp+"XHlike'%''+sstuxh'+''%'"
else
strtmp="XHlike'%''+sstuxh+''%'"
Endif
dw_1.setfilter(sstump)
dw_1.filer()
strtmp=""
ifsstuzy<>""then
ifstrtmp="ZY="'+sstuzy+'"and"
strtmp=strtmp+"XMlike'%''+sstuxm+''%'"
dw_1.setfilter(sstump)
dw_1.filer()
endif
else
strtmp="XMlike'%''+sstuxm+''%'"
dw_1.setfilter(sstump)
dw_1.filer()
Emdif
dw_1.retrieve()
④数据窗口Click事件
取当前学号,并从数据库取出其照片信息显示。
blobStuZPBlob
ifrow<>0then
current_xh=dw_1.getitemstring(row,"XH")
SELECTblobZP
INTO:
StuZPBlob
FROMXSBwhereXH=:
current_xh
usingsqlca;
StuZP.SetPicture(StuZPBlob)
endif
⑤“载入照片”Click事件
打开文件对话框,根据用户选择的图片,打开图片循环读入照片数据,存放到变量中去,并更新到数据库中。
stringLs_path,ls_file,ls_name,ls_parms,ls_dir,ls_commaned
integerls_num,ls_cs,i
integerfh,ret
blob{32768}is_pic_blob
//blob{5485760}ls_blob//max5M
stringdefext="JPG"
stringFilter="bitmapFiles(*.JPG),*.JPG"
ulongnbr,ls_len
ret=GetFileOpenName("OpenBitmap",Ls_path,ls_name,defext,filter)
IFret=1THEN
ls_len=filelength(ls_path)
ls_cs=ls_len/(32*1024)
ifmod(ls_len,)=0then
else
ls_cs=ls_cs+1
endif
ls_num=FileOpen(ls_path,StreamMode!
)
//IFls_len>32765THEN
nbr=1
fori=1tols_cs
ret=fileread(ls_name,is_pic_blob)
nbr=BlobEdit(ls_blob,nbr,is_pic_blob)
next
StuZP.SetPicture(ls_blob)
FileClose(ls_num)
pic_flag=1
ifpic_flag=1then
UPDATEBLOBXSB
SETZP=:
ls_blob
wherexh=:
current_xh
usingsqlca;
ifsqlca.sqlcode<>0then
rollback:
else
commit
pic_flag=0
endif
endif
ENDIF
4学生信息修改
对学生信息进行修改、删除的窗体,运行界面。
主要功能:
对学生信息修改、删除,通过基本的Select、Insert、Delete、Update来操作数据库,删除学生时系统调用Check_XSB_CJB触发器来保持数据的参照完整性。
创建过程:
1.界面设计。
参照界面分别放置控件,分别创建“查找”、“添加”、“删除”、“更新”的CommandButton。
2.代码设计。
“查找”Click事件处理。
stringsql
stringsstuXH,sstuXM,sstuBZ,sstuZY
datesstuCSSJ
booleansstuXB
intsstuZXF
selectXH,XM,XB,CSSJ,ZY,ZXF,BZ
into:
sstuXH,:
sstuXM,:
sstuBZ,:
sstuZY
fromXSB
whereXH=:
StuXH.textorXM=:
StuXM.text
usingsqlca;
StuXH.text=sstuXH
StuXM.text=sstuXM
ifsstuXBthen
StuXBN.checked=TRUE
else
StuXBV.checked=TRUE
endif
StuCSSJ.text=string(sstuCSSJ)
StuZY.text=sstuXHZY
StuZXF.text=string(sstuZXF)
StuBZ.text=sstuBZ
“添加”Click事件处理。
通过Insert语句,插入当前的学生记录。
stringsstuXH,sstuXM,sstuBZ,sstuZY
datesstuCSSJ
booleansstuXB
intsstuZXF
sstuXH=StuXH.text
sstuXM=StuXM.text
ifStuXBN.checkedthen
sstuXB=TRUE
else
sstuXB=FALSE
endif
sstuCSSJ.text=date(StuCSSJ.text)
sstuZY.text=StuZY
sstuZXF.text=integer(StuZXF.text)
sstuBZ.text=StuBZ
insertintoXSB(XH,XM,XB,CSSJ,ZY,ZXF,BZ)
values(:
sstuXH,:
sstuXM,:
sstuXB,:
sstuCSSJ,:
sstuZXF,:
sstuBZ,:
sstuZY)
usingsqlca;
ifsqlca.sqlcode<>0then
messagebox(“学生信息”,"添加失败!
")
else
messagebox(“学生信息”,"添加成功!
")
endif
“删除”Click事件处理。
通过Insert语句,插入当前的学生记录,会引起Check_XSB_CJB触发器的动作。
stringsstuXH
sstuXH=StuXH.text
datefromXSB
whereXH=:
sstuXH
usingsqlca;
ifsqlca.sqlcode<>0then
messagebox(“学生成绩管理”,"没有此学生!
")
else
messagebox(“学生成绩管理”,"删除成功!
")
endif
④“更新”Click事件处理。
stringsstuXH,sstuXM,sstuBZ,sstuZY
datesstuCSSJ
booleansstuXB
intsstuZXF
sstuXH=StuXH.text
sstuXM=StuXM.text
ifStuXBN.checkedthen
sstuXB=TRUE
else
sstuXB=FALSE
endif
sstuCSSJ=date(StuCSSJ.text)
sstuZY=StuZY.text
sstuZXF=integer(StuZXF.text)
sstuBZ=StuBZ.text
updateXSB
setXM=:
sstuXM,XB=:
sstuXB,CSSJ=:
sstuCSSJ,ZXF=:
sstuZXF,BZ=:
sstuBZ,ZY=:
sstuZY)
whereXH=:
sstuXH
usingsqlca;
ifsqlca.sqlcode<>0then
messagebox(“学生信息”,"更新失败!
")
else
messagebox(“学生信息”,"更新成功!
")
endif
5学生成绩修改
学成绩输入、修改的窗体。
主要功能:
用户选择专业和课程,这时下面的数据窗口中会显示相应课程的学生的成绩和学分,修改后批量更新到数据库,并更新相应学生的总学分,相应的存储过程实现请参照实习0.
创建过程:
(1)数据窗口的设计,Grid风格的数据窗口用来显示学生课程信息,这里选择TempCJB所需要的字段。
关闭保存为数据窗口stuscorein。
(2)成绩输入界面设计:
创建专业、课程名、学号的DropDownListBox,分别为stuzy、stukern,专业DropDownListBox中添加“计算机”、“通信工程”。
代码设计:
窗口的“open”事件。
添加课程名的显示项,设置dw_1数据窗口的SetTransObject对象,并获取数据。
stringskcm
dw_1.SetTransObject(sqlca)
//addKCMadd
declarecukcmcursorfor
selectKCMformKCBorderbyKCMdesc;
opencukcm;
fetchcukcminto:
skcm
//StuKCM.additem(skcm)
dowhilesqcla.sqlcode=0
StuKCM.additem(skcm)
fetchcukcminto:
skcm;
loop
closecukcm;
StuKCM.text=skcm
stugetscoreinfo()
dw_1.retrieve()
“专业”selectionchanged事件处理。
使用stugetscoreinfo从数据中载入当前选择的专业和课程的学生成绩信息。
stugetscoreinfo()
“课程名”selectionchanged事件处理。
使用stugetscoreinfo从数据中载入当前选择的专业和课程的学生成绩信息。
stugetscoreinfo()
④stugetscoreinfo()函数。
根据输入的学号、课程名,调用Load_CJ存储过程来载入当前选择的专业和课程的学生成绩信息到临时表Temp_CJB中并显示。
selectKCH
into:
sKCH
fromKCB
whereKCM=:
StuKCM.text
usingsqlca;
sZY=stuzy.text
sql="executeLoad_CJ?
?
"
preparesqlcafrom:
sqlusingsqlca;
executesqlcausing:
sKCH,:
sZY;
dw_1.retrieve()
⑤“更新”Click事件。
调用Write_CJ来批量更新临时表中的成绩信息,同时修改相应学生的总学分。
stringsql
stringsKCH,sZY
dw_1.update()
selectKCH
into:
sKCH
fromKCB
whereKCM=:
StuKCM.text
usingsqlca;
sZY=stuzy.text
sql="executeLoad_CJ?
?
"
preparesqlcafrom:
sqlusingsqlca;
executesqlcausing:
sKCH,:
sZY;
dw_1.retrieve()
ifsqlca.sqlcode<>0then
messagebox(“学生成绩管理”,"更新失败!
")
else
messagebox(“学生成绩管理”,"更新成功!
")
endif
6学生成绩分布分析
主要功能:
用户选择课程名,在图形统计控件中显示当前的课程的分数段统计情况。
创建过程:
(1)Graph控件:
Graph属性设定。
(2)界面设计创建课程名DropDownListBox,为stukcm。
代码设计:
窗口的“open”事件。
添加课程名的先是向,设置dw_1数据窗口的SetTranObject对象,并获得数据。
stringskcm
declarecukcmcursorfor
selectKCMformKCBorderbyKCMdesc;
opencukcm;
fetchcukcminto:
skcm
//StuKCM.additem(skcm)
dowhilesqcla.sqlcode=0
StuKCM.additem(skcm)
fetchcukcminto:
skcm;
loop
closecukcm;
StuKCM.text=skcm
“确定”Click事件事件。
查询当前的课程号,调用TJ_CJ存储过程,更新TJB并显示当前统计结果到图形界面。
intirs1,irs2,irs3,irs4,irs5
stringsKCH,sql
selectKCH
into:
sKCH
fromKCN
whereKCM=:
StuKCM.text
usingsqlca;
sql="executeTJ_CJ?
"
preparesqlsafrom:
sqlusingsqlca;
executesqlcausing:
sKCH;
selectrs1,rs2,rs3,rs4,rs5
into:
irs1,:
irs2,:
irs3,:
irs4,:
irs5
fromTJB
whereKCH=:
sKCH
usingsqlca;
gr_1.rest(ALL!
)
gr_1.addseries("<60")
gr_1.addseries("60-69")
gr_1.addseries("70-79")
gr_1.addseries("80-89")
gr_1.addseries("90-100")
gr_1.adddata(1,irs1)
gr_1.adddata(2,irs2)
gr_1.adddata(3,irs3)
gr_1.adddata(4,irs4)
gr_1.adddata(5,irs5)
附录