在Delphi中动态建立数据库结构
--------------------------------------------------------------------------------
一、问题的提出
在程序运行过程中动态建立数据库结构是我们编写功能通用的数据库管理系统常见
的问题。通用数据库管理系统开发的基本思路是:系统允许用户自行设定管理对象的数据
库结构,然后通过算法和编程技巧,在用户设定完成后动态创建管理对象的数据库结构和
完成系统功能的一些其它数据,这样可以满足不同用户对管理系统管理项目的不同要求,
进而达到通用的目的。因此,通用数据库管理系统开发的关键是系统能否动态地创建数据
库结构。我们熟悉的Foxbase+、Foxpro等语言,均提供了动态创建数据库结构的命令或过
程。
但是,在许多资料和书籍中,没有介绍用Delphi如何动态建立数据库结构,给我们开发
一些功能通用的数据库管理系统带来了不便。那么如何在Delphi中动态建立数据库结构
呢本文是作者在查阅大量资料,经过反复实践的基础上得出的在Delphi中动态创建数据
库结构的方法。
二、设置Delphi数据库配置程序
在Delphi中要进行数据库管理必须先设置好数据库配置程序BDE,所有对数据库的 ***
作,最后都要通过BDE去完成。下面以最常见的Dbase数据库为例来配置Delphi的数据库引
擎BDE。
1 进入Delphi的集成开发环境IDE(Integrated Development Environment),在Dat
abase菜单下选择Explore,出现SQL Explorer窗体,在Object菜单下选择BDE Administra
tor。
2 出现BDE Administrator窗体后在Database页上选择Dbase,在Definition页中将
Type项设为Standard;将Default Driver项设为Dbase;将Path项设为一工作目录名(如:D
:\MYNAME)。以上过程即为数据库的别名(Aliases)设置,这在以后Delphi的程序开发过程
中要经常用到。
3 选择Configration页,在Drivers的Native项中选择Dbase,在Definition页中将T
ype项设为File;将Langdriver项设为DBASE CHS CP936;将Level项设为5。
4 完成上述工作后,在Object菜单中选择Save as Configration,按出现的对话框要
求将以上的设置保存好。至此,数据库的基本配置工作就完成了,我们就可以进行下面的
工作了。
三、动态创建数据库结构方法
在Delphi中动态创建数据库结构有两种方法。
方法一:使用Table组件的CreateTable方法。步骤如下:
1 进入Delphi的IDE建立一个新项目文件和新窗体(Form1)单元文件(unit1pas)。
2 在Form1上加入Table1、Edit1、Edit2、Button1组件。将Button1组件的Captio
属性设为‘创建’。
3 用鼠标双击Button1进入Unit1pas单元文件,在光标处加入下列代码。
with table1 do
egi
active:=false
databasename:=‘dbase'
tablename:=‘mydbf'
tabletype:=ttdbase
fielddefsclear
fielddefsadd(edit1text,ftstring,10,false)
fielddefsadd(edit2text,ftinteger,0,false)
createtable
end
4 按F9键编译运行,在Edit1处输入一字段名称:ZD1,在Edit2处输入一字段名称:ZD
2,然后点击"创建"按钮,程序将在D:\MYNAME目录中产生一个名为MYDBF的数据库文件,用
Database Desktop查看文件结构如下:
FieldName
Type
Size
Dec
ZD1 C 10
ZD2 N 11
方法二:使用Query组件,用结构化查询语言SQL(Structured Query Language)语句创
建,步骤如下:
1 同方法一之步骤1。
2 在Form1窗体中加入Query1、Button1组件,将Query1的Database Name属性设为‘
Dbase’;将Button1组件的Caption属性设为‘创建’。
3 在Query1的SQL属性单击,出现Sting List Editor窗口,在该窗体中输入以下SQL
语句:
Create Table My(
ZD1 Char(10),
ZD2 Numeric(10,2))
4 双击Button1进入Unit1pas单元,在光标处加入下列代码:
Query1ExecSQL
5 按F9键 编译运行,在"创建"按钮处单击即可产生一个名为MYDBF的数据库文件,
存放在D:\MYNAME目录中,用Database Desktop查看其结构如下:
FieldName Type Size Dec
ZD1 C 10
ZD2 N 10 2
以上所介绍的 *** 作和程序均在Windows98 *** 作系统下,Delphi 30 C/S版上调试运行
通过。
TADOQuery,TDataSource,TDBGrid
ADOQuery1设置ConnnectionString属性连接数据库或Connection属性设置为其他连接数据库的组件,如ADOConnection,
DataSource1的DataSet属性设置为ADOQuery1,
DBGrid1的DataSource属性设置为DataSource1。
然后你要查询哪个表或哪些数据时,在ADOQuery1的SQL属性输入SQL语句。
或在代码里这样写:
ADOQuery1Close;
ADOQuery1SQLClear;
ADOQuery1SQLadd('select from 表名');
ADOQuery1open;
每次打开connect为true的时候总d出个对话框,要输入用户名还有密码
你是用TADOConnection连接数据库的吗
是的话把ADOConnection的LoginPrompt属性设置成False
ADOQuery1:Missing SQL property:是因为你连接时,没有SQL语句(ADOQuery1的SQL属性是空的)。
Delphi作为一种目前十分流行的数据库开发语言 在数据库开发领域有着十分重要的地位 它不仅提供了可视化的开发环境 使得开发变得相对容易 而且还是一种面向对象的语言 使得程序员能够充分利用面向对象编程的种种优势——如封装 继承等等 从而大大减轻了开发的难度和工作量 下面 我们就谈一谈利用面向对象的特性来开发数据库控件的方法
Delphi本身提供了一些数据库控件 如DBGrid Table等 它们给开发带来了很多方便 下面我们来以一个能够显示数据表中的所有字段的控件为例来说明如何用Delphi来进行控件的编程
首先要为控件选择一个合适的父类 Windows的一个好处就在于它将许多 *** 作标准化了 通过这些标准的 *** 作 使得学习和使用都有章可循 用户就很容 易融会贯通地掌握整个系统 在Delphi中提供了许多控件 这些控件生成的应用程序足以满足Windows编程的要求 而一些新的控件也可以在此基础上 产生 它一方面继承了一部分控件标准的 *** 作 另一方面也在程序中加入一些代码来实现特定的功能 这样用户使用起来不会觉得突兀 也简化了程序的开发 根据 我们的目标可以看出 利用 下拉框 控件作为新控件的父类比较合适 因为它提供了下拉框中的所有标准 *** 作 这就可以大大减少我们的编程量 然后就是为 特定的功能编写代码 我们应该想到 如果一个下拉框能够显示一个数据库中的所有字段 那么它一定有一个属性能够与数据库相连 我们将这个属性定名为 DataSource 并将这一属性添加到控件中 添加的方法是 首先在Private段中加入如下代码
FDataLink:TFieldDataLink; function GetDataSource:TDataSource; Procedure SetDataSource( Value:TDataSource);其中TfieldDataLink是一个十分重要的类 我们之所以能够很容易地进行数据库控件的开发全是拜它之赐 它有一些十分有用的属性 如 DataSource 利用这个属性 我们就能很容易地指定新控件的DataSource属性
第三步就是为控件的功能编写代码 可以想到 如果我们想要在拉下下拉框时显示数据库中的所有字段 就要在它的DropDown事件中加入代码来将所有 的字段加入到下拉框的下拉区域中 这应该分两步走 第一就是要取得指定数据库的所有字段 第二就是将这些字段以字符串的格式加入到下拉框中(而拉下时显示 所有字段的功能则由下拉框控件自己完成) 在取得数据库的字段时 用到了我们上面提到的TfieldDataLink类 下面的代码就可以获得指定数据库 的字段数目
j:= ; j:=FDataLink DataSource DataSet FieldCount ;//取得数据库中的所有字段的名字 I:= ;
然后再用下面的代码将这些字段的名字加入到下拉框的items属性中 值得注意的是在每次拉下这个下拉框时都要将items属性清空 否则这个下拉框将每次都会因加入重复的内容而变得越来越长 并且一次选择可以选定许多项 使得控件看起来有点怪
items Clear ; //清空items属性
repeat //循环 *** 作将字段加入下拉框中
items Add (FDataLink DataSet Fields[I] FieldName ); //将字段名加入到下拉框中
I:=I+ ;
until I>j- ; //直到所有的字段加入完为止
第四步 就是将以上代码加入到Delphi的控件编辑窗口中去 点击Delphi的 Component/New Component 菜单 系统出现一个对话框 将对话框如图 所示填写
填写完毕点击 OK 按钮 就可以创建一个文件 将上面提供的代码加入到文件的适当位置 就可以完成这个控件的编写 图 是带有这个控件的程序的例子
可以想见 这个控件有着十分广泛的功能 例如 我们能够利用它设置指定字段的值来运行查询 也可以返回数据库中指定字段的数据类型 长度等信息 给我们的编程提供了极大的方便
但是也应该看到 这个控件也有一些缺点 那就是它只能显示字段的名称 一般的数据库中字段的名称都是英文的 这给中文版的应用软件带来不便 下面我们 就用FdataLink的另一个属性来显示中文化的字段 这个属性就是DisplayName 它所指定的是数据库字段的显示名称 而这个名称我们可以在 设计时将其汉化 这样在应用程序中显示出来的就是有意义的中文了
lishixinzhi/Article/program/Delphi/201311/8535
; ——此文章摘自《Delphi 数据库开发经典案例解析》定价 ¥特价 ¥购买>>
根据实例介绍 科目表 是系统的关键表 其他各表均与 科目表 通过 科目代码 字段进行多对一的关联 系统共需要 张表 用途分别如表 所示
创建数据库
打开SQL Server企业管理器 新建一个数据库 名称为caiwubook 利用配书光盘中的脚本代码 \Chap \建库脚本\ 财务管理系统实例程序 sql 文件创建数据库对象 完成数据库的设计 也可以利用 \Chap \建库脚本\caiwubook bak 文件直接恢复数据库 这样数据库中存在初始的科目信息和系统参数数据数据
后面几小节我们将列出几个重点的数据表的建库脚本 其他数据表的脚本请参考脚本文件
创建 科目表 数据表
创建 科目表 数据表的SQL脚本如下
CREATE TABLE [dbo] [ 科目表 ] (
[ 科目代码 ] [char] ( ) NOT NULL
[ 科目名称 ] [char] ( ) NULL
[ 助记码 ] [char] ( ) NULL
[ 科目类别 ] [char] ( ) NULL
[ 是否存货科目 ] [char] ( ) NULL
[ 余额方向 ] [char] ( ) NULL
[ 数量单位 ] [char] ( ) NULL
) ON [PRIMARY]
GO
创建 凭证表 和 分录表 数据表
创建 凭证表 数据表的SQL脚本如下
CREATE TABLE [dbo] [ 凭证表 ] (
[ 凭证编号 ] [char] ( ) NOT NULL
[ 会计期间 ] [int] NULL
[ 凭证字号 ] [char] ( ) NULL
[ 日期 ] [datetime] NULL
[ 附单据 ] [int] NULL
[ 制单 ] [char] ( ) NULL
[ 借方合计 ] [money] NULL
[ 贷方合计 ] [money] NULL
[ 过帐状态 ] [char] ( ) NULL
[ 凭证状态 ] [char] ( ) NULL
) ON [PRIMARY]
GO
创建 分录表 数据表的 SQL 脚本如下
CREATE TABLE [dbo] [ 分录表 ] (
[ 编号 ] [int] IDENTITY ( ) NOT NULL
[ 凭证编号 ] [char] ( ) NOT NULL
[ 摘要 ] [char] ( ) NULL
[ 科目代码 ] [char] ( ) NULL
[ 借方 ] [money] NULL
[ 贷方 ] [money] NULL
[ 数量 ] [int] NULL
[ 单价 ] [money] NULL
[ 结算方式 ] [char] ( ) NULL
[ 结算号 ] [int] NULL
[ 结算日期 ] [datetime] NULL
) ON [PRIMARY]
GO
创建其他关键数据表
以下是其他关键数据表的创建脚本 其他数据表可以参看配书光盘中的相关内容
CREATE TABLE [dbo] [ 科目余额表 ] (
[ 科目代码 ] [char] ( ) NULL
[ 期初借方余额 ] [money] NULL
[ 期初贷方余额 ] [money] NULL
[ 本期借方发生额 ] [money] NULL
[ 本期贷方发生额 ] [money] NULL
[ 本年借方累计发生额 ] [money] NULL
[ 本年贷方累计发生额 ] [money] NULL
[ 本期借方余额 ] [money] NULL
[ 本期贷方余额 ] [money] NULL
[ 最后结算分录 ] [int] NULL
[ 会计期间 ] [int] NULL
[ 余额方向 ] [char] ( ) NULL
[ 内部编号 ] [int] IDENTITY ( ) NOT NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo] [ 资产负债表 ] (
[ 会计期间 ] [int] NOT NULL
[ 现金及现金等价物 ] [money] NULL
[ 应收帐款 ] [money] NULL
[ 坏帐准备 ] [money] NULL
[ 应收帐款净值 ] [money] NULL
[ 流动资产总计 ] [money] NULL
[ 固定资产原值 ] [money] NULL
[ 累计折旧 ] [money] NULL
[ 固定资产总计 ] [money] NULL
[ 其他资产 ] [money] NULL
[ 资产总计 ] [money] NULL
[ 应付帐款 ] [money] NULL
[ 预收帐款 ] [money] NULL
[ 应付工资 ] [money] NULL
[ 其他负债 ] [money] NULL
[ 负债总计 ] [money] NULL
[ 实收资本 ] [money] NULL
[ 资本公积 ] [money] NULL
[ 赢余公积 ] [money] NULL
[ 未分配利润 ] [money] NULL
[ 所有者权益总计 ] [money] NULL
[ 负债及所有者权益总计 ] [money] NULL
) ON [PRIMARY]
GO
创建主键及外键等表约束
在查询分析器中通过如下代码创建数据表的主键及外键等表约束
主键 外键关联字段
ALTER TABLE [dbo] [ 科目表 ] WITH NOCHECK ADD
PRIMARY KEY CLUSTERED
(
[ 科目代码 ]
) ON [PRIMARY]
GO
ALTER TABLE [dbo] [ 凭证表 ] WITH NOCHECK ADD
CONSTRAINT [PK_ 凭证表 ] PRIMARY KEY CLUSTERED
(
[ 凭证编号 ]
) ON [PRIMARY]
GO
ALTER TABLE [dbo] [ 分录表 ] WITH NOCHECK ADD
CONSTRAINT [PK_ 分录表 ] PRIMARY KEY CLUSTERED
(
[ 编号 ]
) ON [PRIMARY]
GO
ALTER TABLE [dbo] [ 帐簿初始化表 ] WITH NOCHECK ADD
PRIMARY KEY CLUSTERED
(
[ 科目代码 ]
) ON [PRIMARY]
GO
ALTER TABLE [dbo] [ 本期汇总帐簿 ] WITH NOCHECK ADD
CONSTRAINT [PK_ 本期汇总帐簿 ] PRIMARY KEY CLUSTERED
(
[ 科目代码 ]
) ON [PRIMARY]
GO
ALTER TABLE [dbo] [ 分录表 ] ADD
CONSTRAINT [FK_ 分录表 _ 凭证表 ] FOREIGN KEY
(
[ 凭证编号 ]
) REFERENCES [dbo] [ 凭证表 ] (
[ 凭证编号 ]
)
CONSTRAINT [ 分录表 _ 科目代码 _fk] FOREIGN KEY
(
[ 科目代码 ]
) REFERENCES [dbo] [ 科目表 ] (
[ 科目代码 ]
)
GO
其他外键 主键等约束参看配书光盘脚本
lishixinzhi/Article/program/Delphi/201311/24743
内建的Bold对象编辑界面
双击BoldGrid中左侧的箭头 或者记录可以激活对象编辑对话框 对象编辑对话框可以同时启动多个 如下图所示意
在BoldGrid中 我们可以使用ctrl+鼠标点击来多选对象 也可以点击网格左上角来选中所有的对象 但是默认的BoldGrid对象编辑器不支持人员和账目对象的关联的显示和编辑 但d出的对象编辑器则支持这些关联 上图框起来的箭头 可以用来拖放对象 将哈巴狗拖动到PayPerson的位置 就可以建立支付人同账目对象之间的关联了
还有一点要注意的是d出式对象编辑器并不是同Grid同步绑定的 因此我们可以打开多个编辑器的同时还可以在网格内的记录间导航到不同的位置 两者可以做到互不影响游标 而传统的数据库程序无法做到这点 因为当游标改变时 会同步改变所有同DataSource绑定的数据感知组件中的内容
退出系统后 可以看到Data xml中记录了刚才输入的信息
主从关系的实现
使用上面的Bold程序 再输入一个大尾巴兔兔的用户 你会发现有一个问题 就是大尾巴兔兔同志目前没有任何账目支出 但是点选到大尾巴兔兔对象上时 账目网格组件仍然是显示所有的账目信息 而没有实现主从关联
为了实现主从关系 需要修改一下账目对象的BoldListHandle组件的属性 将blhAcct的RootHandle属性由原来的DmMoney bshMoney改成blhPerson 表示父对象是人员 同时要将Expression属性改成Pay 另外为了能够在账目网格中显示同账目关联的人员信息 双击bgAcct网格 添加一个新的Column 设定它的BoldProperties Expression为PayPerson name 表示字段用来显示支付账目人的名字 见下图示意
再次运行程序 可以看到这回实现了真正的主从关联 当点击哈巴狗时 只显示同哈巴狗关联的账目 同时 如果这时点击账目网格的添加命令的话 新建的对象的PayPerson自动设定为哈巴狗 如下图示意
级联删除的实现
前面虽然我们实现了主从关系 但是将所有人员都删除后 你会发现data xml文件中仍然有账目信息 这表明 删除人员时 没有将同人员绑定的账目信息删除 也就是说并没有实现级联删除
为了更形象的察看这一现象 在界面添加一个BoldGrid BoldNavigator和BoldListHandle来显示系统中所有的对象 设定BoldListHandle的RootHandle属性为DmMoney bshMoney 设定Expression属性为MoneyModelRoot allInstances表示显示系统中所有的对象实例
然后向前面一样将BoldListHandle绑定到BoldGrid和BoldNavigator 并创建默认的Columns 再次运行后的效果如下图所示意
可以看到全部对象列表中有两个字段 type字段表示系统中对象的类型 而AsString字段则显示对象的字符串表达 但是默认Person对象的AsString字段里面显示的是对象组件加类别字符串 而AcctItem对象的AsString显示的是对象的Amount属性 但是为了观察对象被删除的情况 我希望能够显示更有意义的字符串 如显示人员的名称 显示账目的名称及支付人
因此需要修改模型中对象默认字符串的定义 双击数据模块中bmMoney 激活Bold UML Editor 选中Person对象 设定Default string rep为name 表示默认的AsString属性为人员的名称 见下图示意
同样的 设定AcctItem的Default string rep为payPerson name+ +name 表示AsString由支付人的名称及账目名称构成
再次运行程序 显示效果示意如下
这时 将哈巴狗从人员列表中删除后 界面示意图如下
可以看到账目对象大白菜和化妆品仍然还在 只是支付人信息为空了 看来账目对象确实没有被级联删除 为了实现级联删除 再次打开Bold UML Editor 展开PayAssoc关联 选中Pay 然后设定Delete action为Cascade 表示使用级联删除 见下图示意
再次运行程序 输入人员信息及人员账目信息后 再删除人员 会发现这回将绑定的账目信息也一同删除了
总结
lishixinzhi/Article/program/Delphi/201311/24783
关于选课系统的设计 周 虹
摘要:随着课程改革的不断深入,学校规模不断扩大、课程项目不断增多,为了解决学生选课管理上的复杂的人工 *** 作,减轻重复工作,故设计了选课系统。学校规模的扩大使得学校对每年新生入学、毕业生离校及本校各种分流机制造成的学生信息产生变动,如学籍变动、个人信息修改。为了适应课程的改革,学校在每个学期都要开设一定的课程提供给学生,让学生根据自己的情况来选择,根据学生选择结果给出课程表。本校根据教学实际,为了使教师有效地管理学生信息,设计学生信息管理系统,由此形成学生成绩管理系统,本文就此设计思路进行阐述。
关键词:选课系统 学生信息管理系统 数据流图 DFD图 E-R图 SC图 IPO图 Delphi软件
随着学校规模的不断扩大,专业、班级、学生的数量急剧增加,有关学生选课的各种信息量也成倍增长,而目前许多高校的学生选课管理仍停留在复杂的人工 *** 作上,重复工作较多,工作量大,效率低,因此,迫切需要开发基于互联网的课程信息管理系统来提高管理工作的效率。基于互联网的学生选课管理系统,在学生选课的规范管理、科学统计和快速查询方面具有较大的实用意义。它提高了信息的开放性,大大地改善了学生、教师对其最新信息查询的准确性。
一、选课系统的任务概述
1 目标
选课系统开发的目标是实现学生选课信息关系的系统化、规范化和自动化。
2 系统技术
学生选课系统要求具有信息处理的开发性,方便教师上传学生成绩、学生上网选课和查询选课信息及成绩等,因此本系统设计为基于>>
以上就是关于关于DELPHI动态数据库全部的内容,包括:关于DELPHI动态数据库、请教,用Delphi开发WebService数据库系统、Delphi 开发数据库控件的方法[1]等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)