用Delphi编写小型数据库.docx
《用Delphi编写小型数据库.docx》由会员分享,可在线阅读,更多相关《用Delphi编写小型数据库.docx(19页珍藏版)》请在冰豆网上搜索。
用Delphi编写小型数据库
用Delphi编写小型数据库
用Delphi编写小型数据库
(一)——建立数据库
Delphi是目前最流行的编程工具之一,它在开发数据库应用程序方面有着众多的优越性,提供了强大的开发基于客户/服务器模式数据库应用程序的能力。
在数据库访问方面,配有BorlandDatabaseEngine(BDE),可通过SQLLinks、ODBC等技术访问多种数据库,也可以利用ADO来访问各种数据库。
在应用程序客户端开发方面,Delphi提供了大量的用于数据库应用开发的各种组件,可以极大地提高开发效率。
在学习Delphi数据库编程之前,我们应该对数据库有一定的认识。
一、认识数据库
1.数据(Data)
数据库是存放数据的仓库,数据的种类很多,如数字、文字(商家的订单信息、供应商信息等)、图形、图像。
2.数据库(Database)
数据库是长期存放在计算机上的,能够识别的,有组织、可共享、具有一定安全性的数据集合。
在数据库中,一般都采用关系模型,通过表格来实现。
3.数据库管理系统(DataBaseManagementSystem)
数据库管理系统是位于用户软件和操作系统之间的数据库管理软件,常见的数据库管理系统有Oracle、MicrosoftSQLServer、Sybase、Informix等。
4.数据库系统(DataBaseSystem)
数据库系统的构成见图1:
图1数据库系统构成图
实际开发中,数据库系统常分为两类:
桌面型数据库系统和网络型数据库系统。
桌面型数据库系统指只在本机运行、不与其他计算机交换数据的数据库系统,用于小型的信息管理;网络型数据库系统指能够通过网络进行数据共享的数据库系统,多人可以通过多台计算机对数据库进行操作,可以通过数据库对用户的权限进行管理。
目前,网络型数据库系统的应用前景越来越广泛。
有关数据库的术语由于篇幅关系没做深入讲解,有兴趣的读者可以参考相关书籍。
下面我们以MicrosoftSQLServer2000为例,讲解建立一个数据库的详细过程。
MicrosoftSQLServer2000安装完成后,依次点击“开始→程序→MicrosoftSQLServer→企业管理器”,启动企业管理器程序,SQLServer企业管理器(EnterpriseManager)是SQLServer软件的一个组成部分,它给用户提供了一个集成的管理控制台来集中管理多个服务器。
在Windows进程中的名字叫mmc.exe。
企业管理器的界面如图2,我们对数据库的大部分操作都在这个程序中执行。
图2SQLServer企业管理器的界面
二、创建一个新的数据库
1.在企业管理器中,点击菜单“操作”,选择“新建数据库”,在弹出的对话框中,需要确定新建的数据库的名称和存放的路径。
新建的数据库的名称为test,存放的路径为D盘。
注意:
修改了数据文件的路径后,最好手动把日志文件的路径也修改到相同目录下,确定后,新建的数据库就创建了。
在D盘下可以找到test_Data.MDF和test_Log.LDF两个文件,在企业管理器树中也能找到test数据库了。
2.数据库创建后,我们就根据实际需要创建表了。
右键点击企业管理器树中的“表”后,在弹出的菜单中选择“新建表”,在弹出的对话框中对表的结构进行详细设计。
定义四个字段,分别表示姓名、年龄、性别、住址。
注意定义字段时要考虑数据类型、长度是否合法,如果把姓名定义为数字型或者把年龄的长度设置为1,将来数据就会出现意想不到的情况。
当表设计完成后点击“保存”按钮,输入表名PersonInfo,对表的设计就初步完成了。
重复上述操作可以建立多个表。
建立数据库以及建立表相对来说比较简单,按部就班就能完成。
不过在实际做项目过程中,在建立表之前最好根据需求考虑完善后再进行。
如果到项目编码中期再更改表结构,会让人心烦意乱的。
三、值得注意的概念
1.存储过程
存储过程是SQL语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理。
存储过程存储在数据库内,可由应用程序通过一个调用执行,而且允许用户声明变量、有条件执行,它还拥有强大的编程功能。
存储过程相当于存放在数据库中的函数,当应用程序调用存储过程时,将被数据库管理系统调用并执行,然后将执行结果返回给应用程序。
存储过程可包含程序流、逻辑以及对数据库的查询。
它可以接收参数、输出参数、返回单个或多个结果集以及返回值。
2.触发器
触发器是一种特殊类型的存储过程,当使用一种或多种数据修改操作在指定表中对数据进行修改时,触发器会生效,触发器可以查询其它表,而且可以包含复杂的SQL语句。
它们主要用于强制复杂的业务规则或要求。
3.事务性(Transaction)
事务是指不可分割的一组操作集合,集合的操作要么全部完成,要么全部取消,是一个不可分割的工作单位。
4.在设计表时需要注意以下几点
1)主关键字(PrimaryKey)
主关键字又叫主键,是唯一能确定表的一行(一条记录)的一个或多个字段,比如上面我们定义的PersonInfo表中,name字段就可以设定为主关键字,在设计表的窗体中,选中name这一行,点击“钥匙”按钮后就把name设置为主关键字了,这样每一条记录的name的信息就不能相同了。
主关键字的功能有:
建立索引,利于快速查找和排序;分辨记录;保证引用的完整性。
2)索引(Index)
建立索引是为了提高数据库的查找和排序速度。
关键字是一个特殊的索引。
索引使数据库程序无须对整个表进行扫描就可以在其中找到所需要的数据。
用于索引的字段不需要唯一,但唯一的字段的索引能获得更高的效率。
3)外部关键字(FroeignKey)
外部关键字又称外键,用于建立和加强两个表数据之间链接的一个或多个字段。
将保存表中主键值的一列或多列添加到另一个表中,可创建两个表之间的连接。
这一列或多列就成为第二个表的外键。
外键也是一种约束条件,约束的主要目的是控制存储在外键表中的数据,还可以控制对主键表中数据的修改。
下面举例说明,比如我们定义了两张表,表PersonInfo的name字段定义为主关键字,其中name列的数据是唯一的,也就是名字不可重复,数据见图3:
图3PersonInfo表
表wage存放员工每个月的工资,所以名字可以重复,数据见图4:
图4wage表
如果把表PersonInfo中的第四条记录“曾虹云”删除,那么表wage中的前三条记录就显得孤立了,既然员工“曾虹云”的基本信息都没有了,怎么会保留每个月的薪水呢?
外部关键字防止了这种情况的出现,我们对表wage进行如下设计:
在表wage的设计窗口中点击按钮“管理索引/键…”,在弹出的对话框中点击“关系”标签页,点击“新建”按钮,分别在主键表中选择name和在外键表中选择name,这样我们就设置了一个外键,把PersonInfo和Wage两张表做了关联,当Wage表中有“曾虹云”的记录时,表PersonInfo是不允许删除“曾虹云”这条记录的,这样就保证了数据引用的完整性。
用Delphi编写小型数据库
(二)——数据库编程的基本操作
2007-05-1710:
49:
01| 分类:
电脑资料 | 标签:
delphi编程 |字号 订阅
上一期我们讲解了数据库的基础知识,本期我们主要讲解Delphi数据库编程的基本操作,这一般遵循图1的模式:
图1数据库应用程序的构成
启动Delphi,选择主菜单的“Flie→New→DataModule”,就能创建一个数据模块,数据模块相当于一个容器,用于放置数据库的组件,这些数据库相关组件均为不可见组件,如ADODataSet、ADOConnection、DataSource等。
用数据模块的好处是:
1.从直观来讲,这些不可见组件不用放在窗体上,简化了窗体的设计。
2.可以对数据库不可视组件进行统一管理,共享其中相同的内容。
我们这里举例很简单,直接把不可视控件放在主窗体上,就不再讲数据模块了。
下面我们通过一个实例学习使用AD
O组件来访问数据库。
一、新建项目
启动Delphi,新建一个项目,选择ADO组件面板,在窗体上添加ADOConnection1和ADODataSet1;选择DataAccess组件面板,在窗体上添加DataSource1;选择DataControls组件面板,添加DBGrid1。
二、设置ADOConnection
ADO组件一般都包含一个被用于连接的属性,即ConnectionString属性,利用此属性可以指定一个到ADO数据存储及其属性的连接。
在窗体上选中ADOConnection1,在ObjectInpector上双击这个组件的ConnectionString属性,弹出窗体的ADO连接对话框。
选择Build按钮,在弹出的对话框中选择“MicrosoftOLEDBProviderforSQLServer”选项,单击“下一步”按钮,出现数据链接属性对话框。
1.选择或输入服务器名称:
可以在此输入IP地址,也可以点击下拉列表,以显示当前系统可以访问的SQLServer数据库的列表,选择其中的一个,单击“刷新”按钮,可获得最新的SQLServer数据服务器列表。
此例中点击下拉列表,选择上期我们建立的test数据库的列表。
2.输入登录服务器的信息:
选择“使用指定的用户名称和密码”,然后输入用户名称和密码。
并选中“允许保存密码”复选框。
3.在服务器上选择数据库:
如果登录用户名和密码正确,点击下拉列表就会出现数据库的列表,否则显示报错信息。
4.点击“测试连接”按钮测试输入的登录信息是否正确。
设置完毕后点击“确定”按钮返回到主窗体。
小技巧:
ADOConnection1的LoginPrompt属性用于控制如何处理SQL数据库的安全性问题。
如设置为True,当应用程序试图建立数据库连接时屏幕上将出现标准Delphi注册对话框,用户必须输入正确的用户名和口令。
为了设计方便需要把ADOConnection1的LoginPrompt的属性设置为False,这样在配置其他的ADODataSet组件时不必每次都输入用户名和密码了。
三、配置数据集ADODataSet
Delphi数据库开发的很重要的特征之一是,Delphi可以在程序设计时让我们对数据进行处理,在开始处理表的数据之前,程序必须首先打开数据集,每个ADO数据集都可通过它自己的ConnectionString属性或一个ADOConnection组件(和它的ConnectionString)访问数据库的数据。
在主窗体上选择ADODataSet1,设置其Connection属性:
点击其下拉按钮,选择ADOConnection1,然后双击“CommandText”,在弹出的对话框中选择PersonInfo表,并点击*号,也可以直接在SQL中输入“select*fromPersonInfo”,这样我们就配置了一个数据集。
四、配置数据源
配置数据源只需要设置DataSet属性,点击下拉按钮,选择ADODataSet1。
五、配置表格
配置表格需要设置DataSource属性,点击下拉按钮,选择DataSource1。
这时,再选中ADODataSet1,并把其Active属性设置为True,如果配置正常,将会在表格中显示数据库的PersonInfo表的数据,如图2。
图2程序主窗体
六、操作数据
1.增加记录
使用Insert方法可以插入一条记录,使用Append方法在数据集的最后添加一条记录。
双击“增加一条记录”按钮,进入代码编辑器,输入代码:
procedureTForm1.Button1Click(Sender:
TObject);
begin
ADODataSet1.Active:
=true;//打开数据集
ADODataSet1.Insert;//调用Insert方法
ADODataSet1.FieldByName('name').AsString:
=Edit1.Text;//把Edit1的值赋给插入的记录的name字段
ADODataSet1.FieldByName('age').AsString:
=Edit2.Text;
ADODataSet1.FieldByName('sex').AsString:
=Edit3.Text;
ADODataSet1.FieldByName('address').AsString:
=Edit4.Text;
ADODataSet1.Post;//将数据集中修改的内容写回到数据库中
ADODataSet1.Active:
=false;//关闭数据集
ADODataSet1.Active:
=true;//打开数据集,观看效果
end;
2.编辑记录
鼠标选择表格里的一条记录,Edit输入框显示所选的记录,然后进行修改后,点击“编辑一条记录”按钮,把修改后的记录写到数据库中。
首先设置DBGrid,用鼠标点击表格的记录时,自动选中所点击的一行,方法是设置DBGrid的Option属性的dgRowSelect为True。
然后在DBGrid的OnCellClick事件中写如下代码:
procedureTForm1.DBGrid1CellClick(Column:
TColumn);
begin
Edit1.Text:
=ADODataSet1.FieldByName('name').AsString;//把选择的记录中的姓名显示在Edit1中
Edit2.Text:
=ADODataSet1.FieldByName('age').AsString;
Edit3.Text:
=ADODataSet1.FieldByName('sex').AsString;
Edit4.Text:
=ADODataSet1.FieldByName('address').AsString;
end;
然后根据需要对字段进行修改,最后在“编辑一条记录”按钮中写如下代码:
procedureTForm1.Button2Click(Sender:
TObject);
begin
ADODataSet1.Active:
=true;
ADODataSet1.Edit;//进入编辑模式
ADODataSet1.FieldByName('name').AsString:
=Edit1.Text;
ADODataSet1.FieldByName('age').AsString:
=Edit2.Text;
ADODataSet1.FieldByName('sex').AsString:
=Edit3.Text;
ADODataSet1.FieldByName('address').AsString:
=Edit4.Text;
ADODataSet1.Post;
ADODataSet1.Active:
=false;
ADODataSet1.Active:
=true;
end;
注意:
这里修改的是当前指针所指向的记录,如果修改后再点击一次“编辑一条记录”按钮,程序就会报错,原因是没有定位到某一条记录。
如果要指定修改某条记录,可以使用下面提供的方法:
First:
定位到第一条记录
Last:
定位到最后一条记录
Next:
定位到下一条记录
Prior:
定位到上一条记录
MoveBy(n):
如果n为正数,下移n条记录;如果n为负数,则上移n条记录
3.删除记录
和编辑记录一样,需要先定位,找到需要删除的记录后,才能对所选中的记录进行删除操作。
在删除记录中写如下代码:
procedureTForm1.Button3Click(Sender:
TObject);
begin
ADODataSet1.Active:
=true;
ADODataSet1.Delete;
end;
4.查询记录
在实际的项目中,一般都需要给用户提供一个查询,比如用户在Edit5中输入姓名后,点击“查询姓名”按钮,系统在数据库中进行查找。
如果找到,表格就自动定位到这条记录,否则给出提示信息:
双击“查询姓名”按钮,进入代码编辑器:
var
i:
integer;//定义一个整型变量用于循环
Tmpname:
string;//定义一个内部变量,用于赋值
begin
ADODataSet1.Active:
=false;//关闭数据集
ADODataSet1.Active:
=true;//打开数据集,目的是更新数据集,使显示的数据是最新的
ADODataSet1.First;//定位到第一条记录
fori:
=0toADODataSet1.RecordCount-1do//从第一条记录开始到最后一条记录做循环
begin
//把当前记录的name的值赋给内部变量Tmpname
Tmpname:
=ADODataSet1.FieldByName('name').AsString;
//去掉字符串中的空
Tmpname:
=Trim(Tmpname);
//如果数据库中记录的name值与查询的值一致则在Edit中显示相关字段的值,并退出这段代码块
iftrim(Edit5.Text)=Tmpnamethen
begin
Edit1.Text:
=ADODataSet1.FieldByName('name').AsString;
Edit2.Text:
=ADODataSet1.FieldByName('age').AsString;
Edit3.Text:
=ADODataSet1.FieldByName('sex').AsString;
Edit4.Text:
=ADODataSet1.FieldByName('address').AsString;
exit;
end;
ADODataSet1.Next;
end;
//如果没有查询到,给出提示信息
MessageDlg('数据库中没有这个姓名!
',mtError,[mbOk],0);
end;
本章讲解了如何使用ADO对数据库进行简单的操作。
在本章学习结束后,读者应该对操作数据库有一定的认识,并能通过ADO创建连接,能编写增加记录、删除记录、查询记录、修改记录的代码。
用Delphi编写小型数据库(三)——项目的制作流程
2007-05-1710:
46:
53| 分类:
电脑资料 | 标签:
delphi编程 |字号 订阅
本章将通过一个项目制作过程的讲解来加深读者对数据库编程的认识。
我们以攀钢热轧板厂纵切机组二级系统的上料程序为例,讲解如何进行项目的制作。
攀钢热轧板厂纵切机组是一条生产钢卷的生产线,整个生产流程见图1:
图1
吊车把钢卷吊到入口步进梁上(总共有6个卷位,每个卷位可以放置一个钢卷),然后由现场操作人员开动步进梁设备,通过上料小车把钢卷送到开卷机上进行生产。
生产完成后由卷取机把钢卷卷好,通过卸料小车把钢卷送到出口步进梁,现场操作人员开动步进梁到称重位置的电子秤称重后,把钢卷送到库房。
整个生产由一级系统(PLC)控制,二级系统不参与控制,但需要对整个生产流程的数据做记录并统计分析和备份,二级系统主要实现的功能有:
1.接收计划,生产计划由三级系统下发,二级系统只要把生产计划接收下来;2.吊销计划;3.产品跟踪,现场生产的钢卷信息要实时反映到二级系统,指导现场操作人员生产;4.生成并上传给三级系统实绩,也就是把生产完成的卷的相应信息保存下来并做标签打印;5.计划和实绩的查询功能。
根据实际需要,二级系统由两个独立的应用程序构成:
上料程序和主程序。
由于篇幅的关系,这里只讲解上料程序的制作流程和逻辑思路。
上料程序的界面如图2:
图2
上料程序的功能:
1.上料操作
提供给操作人员一个界面,操作人员在接到生产计划后,把待生产的钢卷用吊车吊放到入口步进梁的卷位上,然后在画面中把实物所对应的信息从数据库的计划表中写到跟踪表中。
比如把一个钢卷号为“400”吊到入口步进梁的1号卷位后,在程序中做如下操作:
根据轧制明细表,选择计划号“212067”后显示此计划下所有的合同号,点击合同号“J000000022”,显示此计划、此合同下的钢卷号,点击这个钢卷号,点击“上料”按钮,再点击“1号卷位”,系统就把此钢卷的信息(计划号、钢卷号)写到跟踪表中了。
2.卸料操作
由于操作失误或者某种原因,把刚才入口步进梁1号卷位的钢卷“400”上到2号卷位,提供给操作人员一个“卸卷”按钮,当点击它后,就把跟踪表中的相关信息清除了,就可以重新执行上料操作了。
3.钢卷前进
当开动步进梁前进,由于步进梁是整体前进的,需要把跟踪表中的信息做相应修改,点击“钢卷前进”按钮,就把5号卷位的信息写到6号卷位,4号卷位的信息写到5号卷位……1号卷位的信息写到2号卷位,同时1号卷位的信息清空。
实际上,钢卷前进后,由工业HMI系统把数据库的信号表的某个字段值改变,通过扫描这个值的变化,修改跟踪表实现钢卷自动前进功能。
如果实际设备动作后由于某种原因导致信号表相应字段的值没有发生变化,就需要手动点击“钢卷前进”按钮了。
一、设计数据库
使用MicrosoftSQLServer2000,建立一个数据库,这里需要使用4张表:
1.接口表TB_SplitCutPlan,三级系统下发计划的方式是直接写数据到此表中,当数据库检测到此表有数据后把所有数据插入到计划表中,并删除此表中的全部数据;方法是使用触发器,只有两句SQL语句:
insertintol2_splitcutplanselect*fromtb_splitcutplan
deletefromtb_splitcutplan
2.计划表L2_SplitCutPlan,存放待生产钢卷的详细信息,由于钢卷号是唯一的,因此把钢卷号字段HOT_COIL_NO设置为主键。
计划表和接口表的设计一模一样,把接口表复制后改名为计划表就可以了。
3.信号表Signal,当钢卷信息到了跟踪表的开卷机时,需要通知三级系统此卷上了生产线,也就是说需要把信号表中某个字段的值置1,由主程序去扫描这个值是否为1,当为1时把跟踪表的开卷机的钢卷信息写到三级系统的相关表中。
4.跟踪表L2_SplitCutMatTrack,存储钢卷信息,保持物流和信息流一致性。
二、程序编码难点
1.程序界面中,计划号、合同号、钢卷号等三个供操作人员进行选择的列表框为ListBox控件,随着数据量的增大,计划号在ListBox中必须按时间倒序排列,也就是三级系统最后下发的计划,其计划号是排列在ListBox的最顶部的,这样操作人员一眼就能找到最近需要生产的计划号。
当然,为了让程序