当前位置:首页 » 操作系统 » delphi数据库开发实例

delphi数据库开发实例

发布时间: 2023-06-27 07:52:55

① delphi 7.0中做一个学生信息管理系统 如何制作打印预览包表呢本人菜鸟求大神指点!!

学校学生管理信息系统的简介
学校学生管理信息系统是针对学校人事处的大量业务处理工作而开发的管理软件,是典型的管理信息系统(Management Information System)。它是一个教育单位不可缺少的部分,它的内容对于学校的决策者和管理者来说都至关重要,它能够为用户提供充足的信息和快捷的查询手段。能有效的帮助学校和老师掌握学生的情况,为学生提供成绩跟课程方面的查询。功能基本符合根据张波尔老师的要求。
学生用户通过输入学生基本信息、课程基本信息等,由系统自行生成相应的数据以供学生查询,另外人事处的管理用户还可以对这些基本信息进行更新和删除, 学校学生管理信息系统力求给用户方便快捷的途径去管理这些繁琐的数据。
具体系统功能需求描述如下:

(1) 学籍信息管理
每年的大量新生入学,老生毕业都需要处理大量的学生信息。通过这一模块,可以实现学生基本情况的添加、删除、更新。还能查询各个学生的情况,姓名、家庭电话、家庭住址、学号等各个消息

(2) 班级信息管理
实现班级的添加、删除、更新。查询班级的所在系别,辅导员等。

(3)课程信息管理
每个学期都会增加一些新的科目,通过本模块可以轻松的添加以及更新课程。可以根据
学期条件或者班级条件的选择,也可根据课程名、课程号或者班级的选择,并对值的输入,可以看到数据集中显示符合条件的课程数据信息,而且可以根据教工的修改要求进行数据的添加、删除、修改的操作。
该项管理对课程的属性进行了具体化的分类,比如可以分辨是考试科还是考察课,而且根据条件的选择大大得提高了对各学期课程数据的记录操作,很大得帮助了教工们工作效率的提高。

(4)成绩信息管理
本模块实现了成绩的输入、删除、更新。还能查询到平均成绩以及单科最高最低成绩以及个人成绩。把成绩统计这个繁琐的工作简单化,为学生成绩的管理方面提高工作效率。

(5)系统管理
因为本系统是供多人一起使用的,必须对某一些人进行限制。于是设置了管理员,非管理员只能进行查询操作,不能进行更改。

三、学校学生管理信息系统的分析和设计
(1)开发环境的简介
设计平台: DELPHI6.0
Delphi是一个对象导向设计的应用程序语言,是开发数据库前端的优秀工具,它的编程语言简洁明快、组件功能强大和编程环境灵活方便。采用Delphi来开发数据库应用程序具有更大的灵活性和可扩展性。

数据库: Microsoft Access
Access 是关系数据库开发工具,数据库能汇集各种信息以供查询、存储和检索。Access 的优点在于它能使用数据表示图或自定义窗体收集信息。数据表示图提供了一种类似于 Excel 的电子表格,可以使数据库一目了然。另外,Access 允许创建自定义报表用于打印或输出数据库中的信息。Access也提供了数据存储库,可以使用桌面数据库文件把数据库文件置于网络文件服务器,与其他网络用户共享数据库。Access 是一种关系数据库工具,关系数据库是已开发的最通用的数据库之一。Access 多用于中小型企业来设计中小型数据库,一般的学校教务系统的数据库用Access 来设计完全能达到要求。由于考虑到本系统是应用在单机系统上,只建立起一个数据库。

数据库访问方式:ADO
ADO(Active Data Objects)实际是一种提供访问各种数据类型 的连接机制。ADO设计为一种极简单的格式,通过ODBC的方法同数据库接口。可以使用任何一种ODBC数据源,即不止适合于SQL Server、Oracle、Access 等数据库应用程序,也适合于Excel表格、文本文件、图形文件和无格式的数据文件。ADO是基于OLE-DB之上的技术,因此ADO通过其内部的属性和方法提供统一的数据访问接口方法。其主要优点是易于使用、高速度、低内存支出和占用磁盘空间较少。

(2)学校学生管理信息系统数据库设计
由于考虑到本系统是应用在单机系统上,另外根据学校人员规模,我只建立起一个数据库,在此数据库基础上建立起如下八个基本表:

学生:学号,姓名,出生年月,性别,籍贯,联系地址,联系电话,班级

班级:系名,班级,主要教室,辅导员,班长

系表:系名,系办公室,联系电话

课程表:课程号,课程号,班级,类别,学时,学名

平均成绩表:班级,学号,姓名,平均成绩

单科成绩表:学号,姓名,课程表,课程名,成绩

选课表:班级,课程号,学期

用户名:用户,密码

(3)窗体设计:

班级管理(banjigl.dfm)

班级查询(banjicx.dfm)

学籍管理(xuejigl.dfm)

学籍查询(xuejicha.dfm)

课程管理(kechenggl.dfm)

课程查询(kechengcha.dfm)

成绩管理(chengjigl.dfm)

成绩查询(chengjicha.dfm)

(4)系统流程图(Data Flow Diagram):

(5)数据库概念结构设计


(6)数据库逻辑结构设计
学生基本情况表:
字段名 数据类型 是否可空 说明
班级 文本 否 外关键字
学号 文本 否 主关键字
姓名 文本 否 无
性别 文本 否 无
出生年月 日期 否 无
籍贯 文本 否 无
联系电话 文本 是 无
联系地址 文本 是 无
班级情况表:
系名 文本 否 外关键字
班级 文本 否 关键字
主要教室 文本 是 无
辅导员 文本 是 无
系名 文本 否 外关键字
班级 文本 否 关键字
系表:
系名 文本 否 关键字
系办公室 文本 是 无
联系电话 文本 是 无
课程表:
课程号 文本 否 关键字
课程名 文本 否 无
班级 文本 是 外关键字
类别 文本 是 无
平均成绩表:
班级 文本 否 外关键字
学号 文本 否 关键字
姓名 文本 是 无
平均成绩 长整型 是 无
单科成绩表:
学号 文本 否 关键字
姓名 文本 否 无
课程号 文本 否 外关键字
课程名 文本 否 无
成绩 长整型 是 无
班级选课表:
班级 文本 否 组合关键字
课程号 文本 否 组合关键字
课程名 文本 是 无
学期 文本 否 组合关键字

(6)课程管理部分的代码:
选课管理:
begin
ComboBox1.Items.Append(adoquery1.FieldValues['系名']); //ComboBox1连到系表的 系名 字段
adoquery1.Next;
end; end;
procere TForm11.ComboBox1Select(Sender: TObject);
begin
adoquery2.Close;
adoquery2.SQL.Clear;
adoquery2.SQL.Add('select * from class where 系名='+''''+ComboBox1.Text+'''');//查询系名是否符合
adoquery2.ExecSQL;
adoquery2.Open;
while not adoquery2.Eof do
begin
ComboBox2.Items.Append(adoquery2.FieldValues['班级']);//符合就调用班级表的字段 班级
adoquery2.Next;
end;
end;

procere TForm11.ComboBox2Select(Sender: TObject);
begin
adoquery4.Close;
adoquery4.SQL.Clear;
adoquery4.SQL.Add('select * from kecheng where 班级='+''''+ComboBox2.Text+'''');//查询课程表中字段 班级 是否符合,符合就调到
adoquery4.ExecSQL; //DBgiid1
adoquery4.Open;
end;

procere TForm11.ComboBox3Select(Sender: TObject);
begin
adoquery4.Close;
adoquery4.SQL.Clear;
adoquery4.SQL.Add('select * from kecheng where 班级='+''''+ComboBox2.Text+''' and 学期='+''''+ComboBox3.Text+''''); //判断学期是否符合
adoquery4.ExecSQL;
adoquery4.Open;
end;

procere TForm11.SpeedButton1Click(Sender: TObject);
begin
while not adoquery4.Eof do
begin
if (adoquery4.FieldValues['课程号']=adoquery3.FieldValues['课程号']) and (adoquery4.FieldValues['班级']=Combobox2.Text) and (adoquery4.FieldValues['学期']=Combobox3.Text) then
break;
adoquery4.Next;
end;
if adoquery4.Eof then
begin
adoquery4.Insert; //把选课内容添加到选课表中。
adoquery4.FieldValues['课程号']:=adoquery3.FieldValues['课程号'];
adoquery4.FieldValues['班级']:=Combobox2.Text;
adoquery4.FieldValues['课程名']:=adoquery3.FieldValues['课程名'];
adoquery4.FieldValues['学期']:=Combobox3.Text;
adoquery4.Post;
end
else
begin
showmessage('本课程此班级已经选过'); //如果已经选过,弹出对话框“本课程此班级已经选过”
end;
end;
procere TForm11.SpeedButton2Click(Sender: TObject);
begin
if not adoquery4.Eof then
adoquery4.Delete;
end;
end.

课程管理:
procere TForm9.FormCreate(Sender: TObject);
begin
ADOQuery3.Close; //关闭数据库
ADOQuery3.SQL.Clear; //清空
ADOQuery3.SQL.Add('select * from kechengbiao');
ADOQuery3.ExecSQL;
ADOQuery3.Open;
dbedit1.DataField:='课程号';
dbedit2.DataField:='课程名';
dbedit3.DataField:='课时';
dbedit4.DataField:='学分';
//DBComboBox1.DataField:='学期';
DBComboBox2.DataField:='类型';

end;

procere TForm9.SpeedButton1Click(Sender: TObject);
begin
if SpeedButton1.Caption='添加' then
begin
adoquery3.Insert; //添加到课程表
SpeedButton1.Caption:='确定';
SpeedButton4.Enabled:=true;
SpeedButton2.Enabled:=false;
SpeedButton3.Enabled:=false;
end
else
if SpeedButton1.Caption='确定' then
begin
if dbedit1.Text='' then
begin
showmessage('请输入课程号!'); //如果课程号没输入,弹出对话框
end
else
begin
adoquery3.Post;
SpeedButton1.Caption:='添加';
SpeedButton4.Enabled:=false;
SpeedButton2.Enabled:=true;
SpeedButton3.Enabled:=true;
end;
end;
end;

procere TForm9.SpeedButton2Click(Sender: TObject);
begin
if adoquery3.Eof then
begin
SpeedButton2.Enabled:=false;
SpeedButton3.Enabled:=false;
end;
if SpeedButton2.Caption='删除' then
begin
SpeedButton2.Caption:='确定';
SpeedButton4.Enabled:=true;
SpeedButton1.Enabled:=false;
SpeedButton3.Enabled:=false;
end
else
begin
adoquery3.Delete; //从数据表中删掉所选记录
SpeedButton2.Caption:='删除';
SpeedButton4.Enabled:=false;
SpeedButton1.Enabled:=true;
SpeedButton3.Enabled:=true;
end;
end;

procere TForm9.SpeedButton4Click(Sender: TObject);
begin
adoquery3.Cancel;
SpeedButton1.Caption:='添加';
SpeedButton2.Caption:='删除';
SpeedButton3.Caption:='修改';
SpeedButton4.Enabled:=false;
SpeedButton1.Enabled:=true;
SpeedButton2.Enabled:=true;
SpeedButton3.Enabled:=true;
end;

procere TForm9.SpeedButton3Click(Sender: TObject);
begin
if SpeedButton3.Caption='修改' then
begin
adoquery3.Edit; //修改课程表中的记录
SpeedButton3.Caption:='确定';
SpeedButton4.Enabled:=true;
SpeedButton2.Enabled:=false;
SpeedButton1.Enabled:=false;
end
else
begin
adoquery3.Post;
SpeedButton3.Caption:='修改';
SpeedButton4.Enabled:=false;
SpeedButton2.Enabled:=true;
SpeedButton1.Enabled:=true;
end;

end;

procere TForm9.Label1DblClick(Sender: TObject);
begin
form11:=tform11.Create(application);
form11.ShowModal;

end;
end.

课程查询部分:
procere Tform4.ComboBox1Select(Sender: TObject);

begin
edit1.Text:='';
button1.Enabled:=false;
end;

procere Tform4.Button1Click(Sender: TObject);
begin
if CheckBox1.Checked=true then
begin
ADOQuery1.Close; //先将数据库关闭
ADOQuery1.SQL.Clear; //清空ADOQuery1内的SQL值清空
ADOQuery1.SQL.Add('select * from kecheng where '+ComboBox1.text+' = '+''''+edit1.Text+''' and 学期 = '+''''+ComboBox2.Text+''''); //合并查询,符合的话在DBGrid中显示出来
ADOQuery1.ExecSQL;
ADOQuery1.Open;
end
else
begin
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('select * from kecheng where '+ComboBox1.text+' = '+''''+edit1.Text+'''');//单个条件查询
ADOQuery1.ExecSQL;
ADOQuery1.Open;
end;
end;

procere Tform4.N2Click(Sender: TObject);
begin //开启其他管理界面
form2.show;
form4.Close;
end;

procere Tform4.N3Click(Sender: TObject);
begin
form3.show;
form4.Close;
end;

procere Tform4.N4Click(Sender: TObject);
begin
form5.show;
form4.Close;
end;

procere Tform4.N6Click(Sender: TObject);
begin
form1.show;
form4.Close;
end;

procere Tform4.N7Click(Sender: TObject);
begin

form4.Close;
end;

procere Tform4.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
button1.Enabled:=true; //当输入条件后,“确定”按钮为有效状态
end;

procere Tform4.CheckBox1Click(Sender: TObject);
begin
ComboBox2.Enabled:=CheckBox1.Checked;//把查询到的数据放在DBGrid上显示出来
end;

end.

四、学校学生管理信息系统的使用说明
本系统分为学生用户和管理用户,如果你不是管理员,那只能进行查询,对数据没有修改权力。只能进行查询,里面有各个方面的,如成绩查询,课程查询,班级查询,学籍查询。各个界面都简单明了,只要输入你所需要的条件,系统自动调出数据。
管理员登陆点系统,点系统,输入管理员用户及密码,跟数据库的用户表比较。如果通过
则能进行课程,学籍,成绩,班级的管理。

五、结束语
学生信息管理系统有利于学校对学生资料的查询,具有可使用性和可维护性,利于学校在需要之时快速了解学生的情况。并可以让具有最高权限的管理员更新、修改信息,已经具备了一定的功能。但由于时间关系和其它原因,本系统还有些不足之处, 如本系统没有实现报表打印的功能等等, 还有待于完善。
在张波尔老师的指导下,经过一段时间的讨论和上机的不断调试,我顺利的完成了开发任务。在开发过程中,我不仅增强了自学的能力和开发软件的能力。对一些软件开发模式有了更加深刻的认识,对应用软件的熟练程度有所提高,已经能运用这项开发过程,学会了如何进行小组式的开发一个综合系统。还从张老师身上学到了很多东西。张老师认真负责的态度严谨治治学精神都使我收益非浅。在此我特向给了很多指导和提供我们开发小组宝贵意见的张波尔老师表示感谢!因为本系统所涉及的内容非常广泛并且比较复杂,加上时间的仓促,尽管我竭尽全力来保证系统的可靠性,但是肯定还有不足之处,恳请用户批评指正。谢谢!

参考文献:(1)Delphi6数据库系统开发实例子导航 人民邮电出版社
(2)程序设计从入门到精通 科学出版社
(3)Delphi6.0程序设计教程 冶金工业出版社
(4)Delphi数据库开发自学教程 人民邮电出版社

各模块主要代码
1、成绩管理模块
⑴ 成绩管理
procere TForm8.Button1Click(Sender: TObject);
var
i:boolean;
begin
i:=false;
ADOQuery2.Close;
ADOQuery2.SQL.Clear;
ADOQuery2.SQL.Add('select * from pjcj where '+edit2.Text+'');
ADOQuery2.ExecSQL;
ADOQuery2.Open;
if not ADOQuery2.Eof then ( 判断是否数据库最后一项)
i:=true;
if i then
begin
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('select * from dkcj where 学号 ='+''''+ADOQuery2.FieldValues['学号']+''''); (使用SQL进行查询)
ADOQuery1.ExecSQL;
ADOQuery1.Open;
button1.Enabled:=false;
end
else
begin
showmessage('没有符合查询条件的记录!!'); (如果没有符合条ComboBox1.Text:='';
ComboBox2.Text:=''; 件的,显示该语句)
ComboBox3.Text:='';
edit1.Text:='';
edit2.Text:='';
adoquery1.Close;
adoquery2.Close;
ComboBox1.Enabled:=true;
end;
dbedit6.DataField:='学号';
dbedit7.DataField:='姓名';
dbedit8.DataField:='班级';
dbedit1.DataField:='学号';
dbedit2.DataField:='姓名';
dbedit3.DataField:='课程号';
dbedit4.DataField:='课程名';
dbedit5.DataField:='成绩';
end;
(2)成绩查询
procere Tform3.Button1Click(Sender: TObject);
var
i:boolean;
begin
i:=false;
ADOQuery2.Close;
ADOQuery2.SQL.Clear;
ADOQuery2.SQL.Add('select * from pjcj where '+edit2.Text+'');
ADOQuery2.ExecSQL; (根据SQL进查询)
ADOQuery2.Open;
if not ADOQuery2.Eof then
i:=true;
if i then
begin
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('select * from dkcj where 学号 ='+''''+ADOQuery2.FieldValues['学号']+'''');
ADOQuery1.ExecSQL;
ADOQuery1.Open;
button1.Enabled:=false;
end
else
begin
showmessage('没有符合查询条件的记录!!');
ComboBox1.Text:=''; (当没有符合条件的记录,自动
ComboBox2.Text:=''; 清空选择框里的查询条件)
ComboBox3.Text:='';
edit1.Text:='';
edit2.Text:='';
adoquery1.Close;
adoquery2.Close;
ComboBox1.Enabled:=true;

end;
end;

procere Tform3.DBGrid2CellClick(Column: TColumn);
var
str:string;
begin
str:=ADOQuery2.FieldValues['学号'];
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('select * from dkcj where 学号 ='+''''+str+'''');
ADOQuery1.ExecSQL;
ADOQuery1.Open;
end;

procere Tform3.N4Click(Sender: TObject); (管理界面的切换)
begin
form5.show;
form3.Close;
end;

procere Tform3.N6Click(Sender: TObject);
begin
form1.show;
form3.Close;
end;
procere Tform3.Edit1Exit(Sender: TObject);
begin
if ComboBox1.Text='平均成绩' then (根据平均成绩查询)
begin
edit2.Text:=edit2.Text+edit1.Text;
end
else
begin
edit2.Text:=edit2.Text+#39;
edit2.Text:=edit2.Text+edit1.Text;
edit2.Text:=edit2.Text+#39;
end;
end;

procere Tform3.Button2Click(Sender: TObject);
begin (本段为对查询条件的刷新,进
ComboBox1.Text:=''; 行不同条件的输入)
ComboBox2.Text:='';
ComboBox3.Text:='';
edit1.Text:='';
edit2.Text:='';
adoquery1.Close;
adoquery2.Close;
button1.Enabled:=false;
ComboBox1.Enabled:=true;
end;

2、 班级管理模块
(1)班级管理
procere TForm9.ComboBox1Select(Sender: TObject);
begin
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('select * from class where 系名 = '+''''+ComboBox1.Text+'''');
ADOQuery1.ExecSQL;
ADOQuery1.Open; (根据系别显示班级信息)
dbedit1.DataField:='系名'; (这五项为表的数据项名)
dbedit2.DataField:='班级';
dbedit3.DataField:='辅导员';
dbedit4.DataField:='班长';
dbedit5.DataField:='专业';
button1.Enabled:=true;
button2.Enabled:=true;
button3.Enabled:=true;
button4.Enabled:=true;
end;
procere TForm9.Button2Click(Sender: TObject); (记录的删除操作)《修改与添加操作与这类似》
begin
if button2.Caption='删除' then
begin
button2.Caption:='确定';
button1.Enabled:=false;
button3.Enabled:=false;
button4.Enabled:=true;

② Delphi深度探索之使用Bold开发数据库应用(1)

介绍

下面我要介绍的Bold for Delphi就是是一套优秀的基于UML模型驱动的面向对象的数据库开发框架 包括了几十个组件组件 以及 个以上的类 可以用来轻松地实现信息模型设计及基于信息模型的的应用程序

基础概念介绍

为了使大家对Bold for Delphi整个框架的使用有一个大概的了解 下面将演示如何用UML设计一个简单的模型并用Bold来完成 并包括如何用Bold快速实现一个简单的操作界面

自打我和我老婆认识以后 就染上了她的臭毛病 比较喜欢乱花钱 没有节制 结果搞的自己常常是挣的不如花的多 老要借外债 后来痛定思痛 决定要对每月收支情况做预算 严格控制费用支出 为此写了还写了好多的财务小程序 下面要讲的这个例子程序就是一个常见的家庭小账本程序 它可以用来统计家庭中的收支情况 软件的功能要求如下

可以定义家庭中的各个人员的信息 可以输入收支情况 并同消费的人员关联起来 给出一定时期内消费的情况统计 作为未来家庭预算的依据

建立信息模型

在产品的需求分析阶段 我们首先要建立数据库程序的信息模型 一般来说信息模型主要是指基于ER图的实体关系模型 这是因为我们使用的数据库大部分都是关系型数据库 虽然有些数据库 比如Oracle有面向对象的特性 但不是很完善 一般很少使用 而关系型数据库有一个很大的问题就是无法直观的体现面向对象的思想 关系型的ER模型能够清晰地描述业务域的静态的数据视图 但你无法从模型获取实体的操作及其相互之间的交互 同时 也很难在关系型数据库中简单地实现继承 重载 多态等等面向对象的技术 因此现代数据库开发方法所提倡的面向对象的编程思想无法简单 清晰 平滑地映射为关系型数据库中的表结构

统一建模语言(UML)是一种以可视化的方式建立软件系统框架 并进行文档化的语言 UML语言是对当今软件工程领域成熟设计实践的一个总结 并且已经被实践证明是可以成功地描述大型的复杂系统的 目前国内很多的大型公司已经开始在软件开发过程中使用UML作为一种标准的信肆春息模型设计语言了 Bold for Delphi就是基于UML的 它内置了一套自己的UML建模工具 当然我们也可以使用Rose或者ModelMaker来进行UML设计

面向对象的UML类图则可以说是对ER模型的一个扩展 它对实体之间的关系以及相互之间的作用也进行了描述 ER模型只是对要进行保存的数据进行的模型化 而类图则包括了全部的类实体的属性以及它们的操作和相互作用 它可以使我们对业务域问题有一个更精确的视图 通过使用各种类图技术可以更容易地 也更快速地建立正确的软件系统

基于Bold for Delphi的数据库开发革命性的一点就是允许我们直接把基于UML的类图映射为关系型数据库的存储 而无须手工的通过代码进行转换 要注意一点的是 Bold同其它建模工具如Together ModelMaker不同 它生成框架代码时只使用了UML中的类图 而Together等可以利用UML图中的类图 协作图等其它UML元素来生成代码框架 但是Together不负责生成对象模型对应的关系数据库模型

类模型

下面的这个类图就是我们的账本程序的一个简单类图

图中显示了两个类 人员信息类 Person 以及账目信息类AcctItem 人员类和账目类之间的连线描述了两个类之间的关系 关系包括一个标题PayAssoc揭示了两者之间的关系是支付的关系 每个属性 PayPerson 和 Pay 以及关系多重度因子 和 n 表明每个人可以完成多个账目的收支 而每个账目至少要有一个关联的人员 同时或雹拿类图还描述了下面一些业务规则衫搭

一个人的信息要有名称 账目信息中包含收支金额大小 以及发生日期

上面的类图如果使用关系型数据库来实现的话 需要建立主从表 并将人员和账目之间的关联约束通过应用程序代码强制一些运行逻辑来完成 这时通常要通过补充详细的文档来描述需要强制的业务逻辑 如果没有详细的设计文档 实现代码时就很容易遗漏某些重要的商业规则 同时这些文档在整个的数据库开发的生命周期里面都需要人来手工地维护 难免会出现文档和模型不匹配的错误 而且文档的工作量比较大 而程序员数量又相对不足的话 程序员会觉得既要写代码又要写文档 无形中增加了很多工作量 难免会有抵触情绪 这些都会影响工作的效率

对于这样的问题 Bold则通过精确描述信息模型 无须详细规则描述文档可以将模型自动的转变为实现代码 商业规则在整个数据库开发生命周期内由Bold的类来维护 减少了文档的工作量和出错的可能

建立示例程序

首先 我们要安装Bold for Delphi Bold的一个月评估版可以从 boldsoft 获取 同时D 的架构版内置了Bold 这里我就不详细介绍申请和安装的过程了 安装好后Bold会在IDE的组件面板中添加很多组件 接下来我们就开始建立使用Bold的Delphi程序了

在Delphi中选File|New Application创建一个新的应用程序

保存窗体文件为MainForm pas保存工程文件为CMoney dpr

添加一个数据模块 设定数据模块的名字为DmMoney

将数据模块保存为CDataMole pas

为了使用Bold来建立系统的信息模型 要进行下列操作

从Bold Handles 组件页上选择BoldModal(命名为bmMoney) BoldSystemTypeInfoHandle(命名为bsthMoney)和BoldSystemHandle(命名为bshMoney)到数据模块中

设定bsthMoney的BoldModal属性为bmMoney

设定bshMoney的BoldSystemTypeInfoHandle 属性为bsthMoney

其中BoldModel组件将被用来保存模型 即类 类的关系 约束以及类型等 这些信息将在设计时作为字符串保存到Delphi的窗体和数据模块文件中 在运行时Bold将执行一些模型的中间转换过程 将模型转化为BoldSystemTypeInfoHandle控件所使用的格式 并选择实现可持续性的机制

在设计时储存在BoldModel组件中的信息模型可以被看做元数据 就象数据库的库表和字段结构一样的信息 而BoldSystemTypeInfoHandle组件则保存BoldSystemHandle所需要的运行时信息 这些信息是对UML模型的一种运行时的表达 这个组件是其他Bold组件的信息源 BoldSystemHandle组件则被用来表达整个系统的业务域元素 可以理解为对象空间 通过对象空间我们可以在运行时获得设计时元数据表达的对象的运行实例 目前用到的三个控件已经可以很好的应用在不需要保存数据的环境中了 但账目记录这类数据库程序必须要保存用户输入的信息 因此还需要添加支持数据可持久性的控件 这里为了快速演示的需要 我们使用XML文件作为存储介质 接下来要添加XML可持续控件到数据模块中

从Bold Persistence组件页上选择BoldPersistenceHandleFileXML控件(命名为bphxMoeny)添加到数据模块中

设定组件的BoldModel属性为bmMoney控件

设定bshMoney组件的PersistenceHandle属性为bphxMoeny组件

现在组件关系示意图如下

BoldPersistenceHandleFileXML组件将使我们的程序可以使用XML文件来保存和读取对象 这是一个使用很方便的控件 特别是在快速原型设计期间 因为在原型设计期间 模型经常会被改动 而重新生成数据库表是很费时间的 而XML文件可以使我们非常快的变更我们的模型设计 当模型基本稳定后 可以去掉这个控件 转而切换为其他使用关系型数据库进行存储的可持续性控件 这样的开发方式可以使我们不需要改动整个程序就能很容易地改变数据持续层的存储策略 也就是前面所说的 数据库平台无关设计

除了前面的一些基本的属性设置外 我们还要设定下列控件属性

组件 属性 值 说明 bsthMoney UseGeneratedCode false 是否使用bold生成类代码 这里暂时先不使用 稍后我们会进一步介绍 bphxMoeny FileName Data xml 指定保存数据的xml文件名 bshMoney AutoActivate true 告诉Bold控件在程序运行后马上打开xml文件用于数据存储

建立模型 下面的步骤是建立我们的模型 Bold for Delphi内置了一个树形的UML建模工具(应该说Bold美中不足的一点就是没有提供象Visio和Rose那样基于拖放的模型设计界面) 我们可以双击BoldModel(bmMoney)组件调出模型设计工具 bold UML模型编辑器(见下图)包含了应用程序模型信息 数据类型信息和关系数据库映射信息

模型编辑器支持下列实体类型

Model: 模型 全部业务域实体集合

Package: 包 整个模型的一个子集所包含的实体 可以将大模型分解为小模型来减少系统复杂度

Class:类 类似于Delphi的类的概念(Delphi的类可以从UML的类来生成) 但包含Object Pascal无法直接描述的类的信息和相互关系 Bold框架通过关联类和特殊的列表类封装了一些额外的功能使得我们可以很容易的处理复杂的类关系

Attribute: 属性 类似于Delphi中的property概念 然而在Bold中 这些属性可以在模型中直接保存而无需我们编写属性的Get Set方法

Operation: 操作 等价于Delphi中的类的过程和函数

Association: 关联 代表了类之间的关系 关联可以使用类来表达 关联也可以有操作和属性 在Bold中建立关联的复杂工作同样可以由框架来实现 我们无须编写代码来完成

Role: 角色 代表关联同类的连接

Data Type: 表示模型所支持的不同数据类型 它可以被扩展以支持用户自定义的数据类型

下图是不同实体类型在模型编辑器中是如何标识的

所有的实体类型都可以通过编辑器的右键菜单来创建和修改属性 同时我们选中实体节点后 实体和全局的选项会显示在右侧的编辑器中 其中重要的有

Name: 模型的名称

lishixin/Article/program/Delphi/201311/24785

③ Delphi开发工具中如何访问数据库结构[2]

获取数据域和索引信息

在取得了数据表信息后 应使用TTable对象访问该数据表的具体信息 对应函数如下

以下是引用片段 procereTDataSet GetFieldNames(List:TStrings); procere慧销TTable GetIndexNames(List:TStrings);

GetFieldNames用来取得数据表中的各个域名 GetIndexNames用来取得数据表中的各个索引名

另外 可以进一步使用TDataset和TTable中的两个属性TDataSet FieldDefs Items[] 和 TTable IndexDefs Items[]来访问具体的数据域信息和索引信息 它们分别是由TFieldDef和TIndexDef组成的数组

TFieldDef描述如下

TIndexDef描述如下

TFieldType定义如下

以下是引用片段 TFieldType=(ftUnknown ftString ftSmallint ftInteger ftWord ftBoolean ftFloat ftCurrency ftBCD ftDate ftTime ftDateTime ftBytes ftVarBytes ftAutoInc ftBlob ftMemo ftGraphic ftFmtMemo ftParadoxOle ftDBaseOle ftTypedBinary ftCursor);

TIndexOptions定义如下

以下是引用片段 TIndexOptions=setof(ixPrimary ixUnique ixDescending ixExpression ixCaseInsensitive);

它们的具体意义可以参见Delphi帮助

应用实例

使用下面的程序片段即可获得指定数据库中指定表的域定义和索引定义 ListBox ListBox 和 ListBox 为Form 中定义的三个列表框 用于显示结果

以下是引用片段 Var Alias TableName:String Table :TTable Begin Alias:= fjs TableName:= d* //初始化 Session GetTableNames(Alias {别名} TableName {过滤器} True {是否显示文件扩展名(对DBF) } False {是否显示系统表} ListBox Items) If ListBox Items Count= then Begin MessageDlg( 数据库 +Alias+ 中没有数据表 +TableName mtError [mbOK] ) Exit End Table :=TTable Create(nil) Table DatabaseName :=Alias Table TableName := ListBox Items Strings[ ] {取得表中字段名及索引名} Table Open if Table Active then begin Table GetFieldNames(ListBox Items) Table GetIndexNames(ListBox Items) end //… 此时结果在ListBox 和ListBox 中 // Table Destroy end

小结

通过上面讨论和实例证明 利用Delphi语言开发数据库软件管理系统 关键技术都已得到解决

参考文献

[ ] (李维 编着) 《DELPHI 高效数据库程序设计》机械工业出版社

[ ] 郭旭等 着 《Delphi 应用开发指南》清华大学出版社

[ ] 大富翁 // delphibbs /

收稿日期 月 日 修改日期 月 日

作者简介 于海生 男 年生于辽宁省丹东市 黑龙江大庆人 年毕业于辽宁化工大仿芦学计算机科学与技术专业备碧带 助理工程师 研究方向为钻井计算机软件开发与应用

lishixin/Article/program/Delphi/201311/8543

④ 如何学习delphi数据库编程

以我的经验一本语言教程 + 一本实例效果最佳:

刘瑞新、张志纲、张兵义等编着,Delphi数据库程序设计教程,机械工业出版社,2004.2

李文立 刘强 梁冰编着,Delphi数据库系统开发案例精选,人民邮电出版社2006-5

祝你很快上手.

热点内容
苹果6怎么设置六位密码 发布:2025-03-21 03:07:10 浏览:75
这么编程 发布:2025-03-21 03:06:34 浏览:363
激光切割编程用的软件 发布:2025-03-21 03:06:26 浏览:234
戴尔服务器能做电脑用吗 发布:2025-03-21 02:37:28 浏览:37
linux怼 发布:2025-03-21 02:13:07 浏览:725
sql游标实例 发布:2025-03-21 02:06:10 浏览:792
b2c开源php 发布:2025-03-21 01:58:10 浏览:441
癫痫持续发作应急演练脚本 发布:2025-03-21 01:50:45 浏览:311
pythondocker 发布:2025-03-21 01:46:04 浏览:319
androidmonkey测试脚本 发布:2025-03-21 01:32:45 浏览:440