版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第5章 连接数据库,本章学习要点 l理解Delphi的数据集控件的基本概念和术语 l了解Delphi数据集的基本属性和方法 l学习Delphi数据集的浏览 l掌握Delphi基于ADO的数据库连接方法,2020/7/5,2,5.1数据集控件,在Delphi中访问数据的基本单元是数据集对象,数据集是以行和列的形式组织起来的数据的集合;其中,每一列具有相同的数据类型,而每行是由各列指定类型的数据组成的。 为了更好地理解数据集的概念,现将几个与数据集相关的概念和术语说明如下: 数据集 一个分离的数据记录的集合。其中,每个记录包含多个字段。各个字段可以是不同数据类型(如整数、字符串、十进制数和图像等)
2、的数据。数据集由VCL的TDataSet表示。 表 一种特殊类型的数据集。表一般是一个实际存储在磁盘上、包含有数据记录的文件。VCL的TTable类中封装了它的各种功能。 查询 也是一种特殊类型的数据集。它可以被看作是执行了特殊命令后所产生的“内存表”,这些命令一般是对物理表或表集的操作。在VCL中由TQuery类来处理查询。,2020/7/5,3,数据库:指磁盘中的一个目录(在处理如Paradox、dBASES文件这样的非服务器数据的情况下),或是一个SQL数据库(当使用SQL服务器时)。在一个数据库中可以包含多个表。在VCL有一个TDataBase类。 索引 用于数据库表排序的规则。所谓基
3、于特定字段建立索引是指利用该字段的值作为表的排序依据。在TTable中包含了一些对索引进行操作的方法和属性。 如果应用程序没有使用了TDatabase控件,则系统根据数据集控件DatabaseName属性创建一个临时的数据库。它们按照用途可分为三类: 图5-1 数据集控件之间的继承关系,2020/7/5,4,第一类是用于BDE体系结构的数据集控件,包括TNestedTable、TTable、TQuery、TStoredProc,以及用于数据库决策的TDecisionquery控件; 第二类是ADO体系结构的数据集控件,包括TADODataSet、TADOTable、TADOQuery和TADO
4、StoredProc; 第三类是平面文件体系结构的客户端数据集控件,包括TClientDataSet。 数据集控件之间的继承关系如图5-1所示。 5.1.1 数据集的属性 数据集的属性很多,最常用的有状态(State)属性、书签(Bookmark)属性和过滤方面的属性(例如FilterOptions、Filtered和Filter等)。下面将介绍它们的含义和用法。,2020/7/5,5,1状态属性 有时候,需要知道一个数据库表当前为编辑模式还是添加模式,或是否处于活动状态,这些信息都可以通过查看TDataSet的State属性来获取。State属性的类型为TDataSetState,该类型的取
5、值可以是表5-1中所列的任意一种。 表5-1 数据集的的属性取值及含义,2020/7/5,6,2020/7/5,7,数据集的State属性是只读属性,在程序中可以读取State属性值,但不能设置State属性。 当一个应用程序打开一个数据集的时候,数据集的State属性默认地被设为dsBrowse,及数据集处于浏览状态。要使数据集进入其它的状态,就要调用相应的方法。 2书签属性 书签就是在数据集的某个位置做的一个标记,它的作用是以后可以快速方便地回到书签的所在位置。数据集提供了许多的属性和方法用于管理书签。 数据集的Bookmark属性值代表的是当前记录的书签,可以通过设置Bookmark属性
6、值来指定当前书签。 FreeBookmark:删除一个书签。当书签不用的时候,调用FreeBookmark方法删除分配给某个书签的资源。,2020/7/5,8,3过滤属性 一个数据库应用程序往往只对数据集的部分记录感兴趣,例如,可能只需要对一个学生成绩表中成绩高于90分的学生感兴趣。这种情况下,可以用过滤技术把符合特定条件的记录过滤出来。不过,对于一个字段很多的数据集或者过滤条件较为复杂来说,最好还是使用查询控件来进行过滤。 要对数据集进行过滤,一般需要以下3个步骤: 首先要指定过滤条件: 然后设置FilterOptions属性的有关选项。根据具体需要而定,也可以没有; 最后把Filtered
7、属性设为True。 以后如果不要进行过滤,只要把Filtered属性设为False即可。 (1)设置过滤条件与OnFilterRecord事件 指定过滤条件有两种方式: 一是设置Filter属性; 二是在处理OnFilterRecord事件的句柄中给出过滤条件。,2020/7/5,9,Dataset1.Filter:=State=MA; 也可以让用户来动态地指定过滤条件,如: Dataset1.Filter:=Edit1.Text; 甚至还可以把上述两行代码结合起来: Dataset1.Filter:=State=+Edit1.Text; 设置了过滤条件后,只要把Filtered属性设为Tru
8、e,过滤即有效。 (2)设置过滤选项 FilterOptions属性用于设置过滤的选项。这个属性是一个集合,可以是空集(默认),也可以取如表5-2所示的值。 表5-2 FilterOptions的取值及含义,2020/7/5,10,5.1.2 数据集的操作 对数据集的操作有很多,下面介绍一些常用的操作,如打开与关闭数据集、浏览记录、查询记录、搜索特定记录、修改记录、插入新记录、删除记录等。 1开关数据集 在对数据集进行任何操作之前,必须首先将数据集打开。要打开数据集,可以把Active属性设为True即可,例如: MyTable.Active:=True; 注意:在结束对数据集的操作以后,或者
9、是要改变数据集的一些其它的属性,比如修改TTable的TableName前,需要关闭数据集。 关闭数据集有两种方法: 将数据集的Active属性设为False,例如: MyTable.Active:=False; 调用数据集的Close方法,例如: MyTable.Close; 2浏览记录 数据集提供的浏览数据的方法或属性如表5-3所示。 表5-3 数据集浏览记录的方法和属性,2020/7/5,11,2020/7/5,12,(5)MoveBy方法 调用数据集的MoveBy方法使数据集中的另一条相隔指定距离的记录成为当前记录。MoveBy方法需要传递一个参数,指定相隔的行数,正数表示向记录编号增
10、大的方向移动,负数表示向记录编号减小的方向移动。程序代码如下: MyTable.MoveBy(8); (6)Eof属性 Eof是数据集的只读属性。用于判断当前记录是否到了数据集的末尾。如果Eof属性值为True,表示现在已到了数据集的最后一条记录。在遍历数据集的记录时一般需要用到Eof属性。 进行下列任何一个操作,都将会把Eof属性设为True。 打开一个空的数据集; 调用了Last; 调用了Next,而现在已经在数据集的最后一条记录; 调用了SetRange,而范围是无效的。 在其它情况下,Eof属性都将返回False。 在调用数据集的Next方法的循环中,通常要读取EOf属性,以此来判断当
11、前记录是否已处于数据集的最后一条记录,以避免对不存在的记录进行操作。程序代码如下,2020/7/5,13,MyTable.DisableControls; Try MyTable.First; While not MyTable.EOF DO Begin MyTable.Next; End; MyTable.EnableControls; End; 出现异常,也能保证刷新能得到恢复。 (7)Bof属性 Bof也是数据集的只读属性,它的作用和Eof恰好相反。Bof属性用于判断当前记录是否是数据集的第一条记录。如果Bof属性返回True,表示现在已到了数据集的第一条记录。在遍历数据集的记录时一般也
12、需要用到Bof属性。 进行下列任何一个操作,都将会把Bof属性设为True。 打开一个非空的数据集。,2020/7/5,14,调用了First; 调用了Prior,而现在已经在数据集的第一条记录; 在其它情况下,Bof属性都将返回False。 程序代码如下: MyTabte.DisableControls; Try While not MyTable.BOF DO Begin MyTable.Prior; End; Finally Mymable.EnableControls; End; 3编辑数据 要编辑数据集的记录,首先要调用Edit方法进入编辑状态,此时数据集的State属性值将为dsE
13、dit。,2020/7/5,15,注意:如果使用缓存更新技术的话,也就是数据集的CachedUpdates属性值为True时,调用数据集的Post方法只是将修改的数据写到缓存中,并不是直接写到数据集中。这时,需要调用ApplyUpdates方法才能将数据写到数据集中。 如果要取消当前所做的修改,可以按键盘上的Esc键或单击TDBNavigator控件上的Cancel按钮。 4插入记录 要在数据集中插入新的记录,首先要调用Insert或Append方法进入插入状态,此时数据集的State属性值为dslnsert。同样,调用Insert或Append方法并不一定会使数据集进入插入状态,还要取决于C
14、anModify属性的值。 一旦进入了插入状态,用户就可以在数据控件中插入一条新的记录,并输入相应的数据。,2020/7/5,16,5删除记录 调用数据集的Delete方法将删除当前记录,并且使数据集回到浏览状态,也就是说,数据集的State属性值将为dsBrowse。当前记录被删除后,下一条记录就成为当前记录。如果删除的本来就是最后一条记录,则前一条记录就成为当前记录。 6修改记录 除了TDBGrid和TDBNavigator等控件外,大部分数据控件只能工作于数据集的一个或几个字段,而不是整条记录。不过,数据集提供了若干个方法可以直接修改整条记录,这些方法包括: AppendRecord方法
15、:类似于Append,但可以给字段赋值,不需要调用Post。 InsertRecord方法:类似于Insert,但可以给字段赋值,不需要调用Post。 SetFields方法:且当前记录的字段赋值,需要显式地调用Post。 假设一个数据集中有五个字段,分别是Name、Size、Weight、Area和Bmp,可以样对它们赋值:,2020/7/5,17,AnimalsTable.InsertRecord(flatfish,5); 上述程序在数据集中插入了一条新的记录,并且对前两个字段赋了值。如果还要对 Weight和Area字段赋值的话,可以用如下的程序代码。 With AnimalsTable
16、 Do Begin If Locate(Name,flatfish,IoCaselnsensitive) then Begin Edit; SetFields(NIL,NIL,5,5); Post; End; End; 7查询特定的记录 (1)Locate方法 Locate用于在数据集中定位一条特定的记录,并使该记录成为当前记录。Locate方法的语法如下:,2020/7/5,18,function Locate(const KeyFields:string;const KeyValues:Variant;Options:TLocateOptions):Boolean;virtual; 从上面
17、Locate方法的语法可以看出,它需要传递三个参数,第一个是KeyFields参数,用于指定要按哪些字段搜索,第二个是KeyValues参数,用于指定每个要搜索的字段对应的值,第三个是Options参数,用于设置搜索选项。 下面这个例子搜索Name字段的值为“flatfish”的记录: var MyLocate:Boolean; SOpt:TLocatoOptions; Begin SOpt:=IoPartialKey; MyLocate:=AnimalsTable.Locate(Name,flatfish,SOpt); End; (2)Lookup方法 Lookup方法与Locate方法十分
18、相似,也是在数据集中搜索符合条件的记录。不同的是,如果找到匹配的记录,Lookup能返回该记录中若干个字段的值。它的语法如下:,2020/7/5,19,function Lookup(const KeyFields:string;const KeyValues:Variant;const ResultFields:string):Variant;virtual; 从上面Lookup方法的语法里可以看出,它需要传递三个参数,第一个是KeyFidds参数,用于指定要按哪些字段搜索,第二个是KeyValues参数,用于指定每个字段相应的值,第三个是ResultFields参数,用于指定要返回哪些字段
19、的值。 下面这个例子是在AnimalsTable中搜索Name字段的值为“flatfish”的记录,并返回Name、Weight、Area等字段的值。 var LkResults:Variant; Begin With AnimalsTabe Do LkResults:=Lookup(Name,flatfish,Name;Weight;Area); End;,2020/7/5,20,5.1.3 数据集的事件 TDataSet的事件主要分为三大类,一类是Before系列,另一类是After系列,还有就是On系列。具体的事件及含义如表5-4所示。 表5-4 数据集的事件及含义,2020/7/5,2
20、1,1Before系列 Before系列的事件常常用来中止操作。 2After系列 After系列的事件是发生在操作完成以后,一般用来在状态栏上通知用户一些情况。如果在删除记录后需要在状态栏里向用户提示删除状态的信息,可以调用如下的程序代码: ProcedureTForml.TablelAfterDelete(DataSet:TDataSet); Begin StatusBarl.SimpleText:=Format(有%d条记录,DataSet.RecordCount); End; 3On系列 OnCalcFields事件主要用于给出“计算字段”的值。OnCalcFields事件的发生要取决
21、于 AutoCalcFields属性的值。 如果AutoCalcFields属性设为True,则下列任何一种情况都会触发OnCalcFields事件。 数据集被打开时;,2020/7/5,22,在数据控件中,输入焦点从一条记录移到另一条记录; 在数据控件中,输入焦点从一个字段移到另一个字段; 当前记录被修改或从数据库中检索了一条记录。 不过,即使AutoCalcFields属性设为False,当数据集中的任意一个非计算字段的值发生变化时都会触发OnCalcFields事件。 5.1.4 数据集的派生类 由图5-1可以看出,数据集的派生类可以分为三大类:第一类是BDE体系结构的数据集控件;第二类
22、是ADO体系结构的数据集控件;第三类是客户端数据集控件。下面分别介绍一下这三种控件。 1BDE数据集 BDE数据集,也就是TBDEDataSet类是从TDataSet继承而来的,它提供了通过BDE(BorlandDatabaseEngine)访问数据的能力。,2020/7/5,23,从BDE数据集派生的有TNestedTable类和TDBDataSet类两大类。而从TDBDataSet1类又派生了TTable、TQuery和TStoredProc。这一节主要介绍BDE数据集,读者应当对前面介绍的TDataSet已经有了比较深刻的认识。 和TDataSet一样,TBDEDataSet也是虚拟的和
23、抽象的,也就是说它的许多属性、方法和事件是虚拟或抽象的。除非要建立自定义的数据集,否则,一般不需要直接用到TBDEDataSet。 TBDEDataSet重载了TDataSet中涉及记录导航、索引和书签的方法,增加了一些处理BLOB字段、缓存更新的属性、方法和事件。 (1)CacheBlobs属性 (2)缓存更新 BDEDataSet提供了缓存更新的技术。所谓缓存更新,就是应用程序从数据库中检索到的数据,在本地缓存中建立一个副本。如果用户对数据进行修改;那么数据的修改也只是反映在缓存中。以后可以调用BDE数据集的ApplyUpdate方法一次性地把所有的修改提交到数据集中。 从缓存更新技术的处
24、理机制中可以看出,缓存更新技术可以明显地提高应用程序的性能。而且,只要在还没有调用ApplyUpdates之前,可以方便地取消修改。,2020/7/5,24,BDE数据集中有关缓存更新的属性、方法和事件如表5-5所示。 表5-5 BDE数据集中有关缓存更新的属性、方法和事件,2020/7/5,25,(3)TDBDataSet派生类 TDBDataSet类是从TBDEDataSet继承而来的,它提供了对数据库连接和会话期管理的能力。 TBDataSet类中增加了若干个属性和方法用于管理数据库连接和BDE会话期,如表5-6所示。 表5-6 TDBDataSet类增加的属性和方法,2020/7/5,
25、26,这里详细介绍一下DatabaseName属性和SessionName属性。 如果应用程序要访问远程数据库服务器如Sybase、Oracle或InterBase,应当用TDatabase控件来连接数据库,此时,应当将DatabaseName属性指定为要连接的数据库,可以设为TDatabase控件的名称。如果在应用程序中没有显式地使用TDatabase控件,那么DatabaseName属性应当设为BDE别名。对于Paradox和dBASE表来说,可以设为表所存放的路径。 SessionName属性用于指定一个BDE会话期对象。如果应用程序没有显式地使用TSession控件,则不必设置这个属性
26、。如果应用程序显式地使用了多个TSession控件,应当设置SessionName属性来指定是其中的哪一个。 (4)TNestedTable派生类 TNestedTable直接从TBDEDataSet类派生而来,用于访问嵌套数据表中的数据。TNestedTable类继承了TBDEDataSet类的所有属性、方法和事件,只增加了一个Create方法,用于创建嵌套数据表。,2020/7/5,27,2ADO数据集 ADO数据集,即TCustomADODataSet类,是由TDataSet类派生而来的,提供了通过ADO控件访问数据库的能力。ADO数据集派生了TADODataSet类、TADOTable
27、类、TADOQuery类、TADOStoredProc类、TADOCommand类和TADOConnection类。 TCustomADODataSet重载了TDataSet中涉及记录索引和书签的一些属性、方法和事件,另外,它本身也增加了一些属性、方法和事件。 (1)ADO数据库连接 TCustomADODataSet增加了几个用于连接数据库的属性,如表5-7所示。 表5-7 TCustomADODataSet增加的用于连接数据库的属性,2020/7/5,28,用户可以利用Connection属性和ConnectionString属性来连接数据库。如果要用Connection属性来连接数据库的
28、话,需要先用ADOConnection属性建立与数据库的连接,然后将ADO数据集的Connection属性指定为ADOConnection控件的名称,如: MyADOTable.Connection:=MyADOConnection 如果是用ConnectionString属性连接数据库的话,通过设置ConnectionString来指明将ADO连接控件与数据集相连的必要信息,也就是连接字符串。在连接字符串中需包括远程数据库服务器的名称和OLEDB提供者等信息,如: ADOConnectionlConnectionString:=Provider=ProviderRef;RemoteServe
29、r=ServerRef; ADO的ConnectionString的属性值支持下列四种参数设置Provider,FileName,Remote Provider,RemoteServer。其它的参数设置(例如用户的身份和密码)将不被ADO处理而只简单地被传输。,2020/7/5,29,CursorLocation属性指定用于连接的指针是位于客户端还是服务器端。在默认情况下是位于客户端,即其值为clUserClient。此时指针比较灵活,所有数据的存取和操作都在本地进行,一些不被数据库服务器正常支持的操作也可以执行,如排序和过滤等操作。 (2)ADO命令处理 TCustomADODataSet比
30、TDataSet增加了一些属性来处理对数据库的操作命令,如表5-8所示。 表5-8 ADO数据集处理数据库操作命令的属性,2020/7/5,30,CommandText属性用来说明要使用ADO操作控件执行的命令内容。CommandText属性值是文本形式的命令,例如SQL语句、一个数据表格名或者是一个存储过程名。 在程序中设置CommandText属性的形式如下: ADOCommandlCommandText:=DROP TABLE Animals 如果操作中包含了一些参数(例如在执行SQL语句或者一个存储过程时的情况),我们可以通过Parameters属性值来设定。 CommandType属
31、性用来说明在CommandText中所声明操作的类型。 CommandType的属性值应该与CommandText中所说明操作相一致,,2020/7/5,31,CommandType的默认值为cmdUnknown,因为cmdUnknown可以适用于所有操作。在CommandType中显式地指明操作的类型可以提高应用程序的运行速度,但如果将操作的类型置为cmdUnknown,ADO必须先判断操作的类型,这样就会减慢运行的速度。 (3)ADO缓存更新 ADO数据集同样也提供了缓存更新技术,就是将ADO数据集中的数据在本地缓存建立副本,数据的改动只反映在缓存中而不向数据集提交。如果要将数据的改动提交
32、到数据集中,可以调用UpdateBatch方法。 ADO数据集中用于缓存更新的属性、方法和事件如表5-9所示。 表5-9 ADO数据集中用于缓存更新的属性、方法和事件,2020/7/5,32,ADO数据集的UpdateBatch方法的语法如下: Procedure UpdateBatch(AffectRecords:TaffectRecords=arALL); 在上面的语法中,参数AffectRecords的取值有4种情况,如表5-10所示。 表5-10 UpdateBatch方法的AffectRecords参数的取值情况,2020/7/5,33,ADO数据集使用缓存更新技术时,首先使用ADO
33、Connection控件的BeginTrans方法,再使用ADO数据集的UpdateBatch方法。例如: MyADOConnectionBeginTrans; MyADOTableUpdatcBatch; 3客户端数据集 与BDE数据集一样,客户端数据集(TClientDataSet)也是由TDataSet派生而来的,用于平面文件体系结构的数据库应用程序,不过,它最主要的用途是用于多层体系结构的客户端。 TClientDataSet类是从TDataSet类派生而来的,支持诸如编辑、搜索、浏览、纠错和过滤等功能。由于客户端数据集在内存中建立了数据的本地副本,因而操作执行速度很快。同时由于客户端
34、数据集控件不直接连接数据库,因此客户端数据库应用程序必须提供获取数据的机制。客户端数据集有两种方式获取数据: 在单层体系结构中,从平面文件中存取数据,独立实现数据集功能,此时不需要BDE数据库引擎; TClientDataSet类增加了从数据库读取数据建立数据副本及管理的属性、方法和事件,如表5-11所示。,2020/7/5,34,表5-11 TCHentDataSet增加的用于建立和管理副本的属性、方法和事件,2020/7/5,35,5.1.5 SLMIS中数据集的浏览实例 下面利用已学过的数据集中用于浏览数据的方法和属性,创建一个小程序,其运行后的窗体如5-2所示。 图5-2 数据集浏览窗
35、口,2020/7/5,36,程序源代码摘要如下: procedure TFrmManagerSearchPSD.RefreshClick(Sender: TObject); begin if ADOQuery1.Active then ADOQuery1.Close; DataSource1.Enabled:=false; ADOQuery1.Open; DataSource1.Enabled:=true; end; procedure TFrmManagerSearchPSD.FormCreate(Sender: TObject); begin ADOQuery1.Open; DataSou
36、rce1.Enabled:=true; end; procedure TFrmManagerSearchPSD.quitClick(Sender: TObject); begin FrmManagerSearchPSD.Close; end;,2020/7/5,37,procedure TFrmManagerSearchPSD.FormClose(Sender: TObject; var Action: TCloseAction); begin FrmManagerSearchPSD.Release; end; procedure TFrmManagerSearchPSD.BitBtn2Cli
37、ck(Sender: TObject); begin if ADOQuery1.Active then ADOQuery1.First; end; procedure TFrmManagerSearchPSD.BitBtn4Click(Sender: TObject); begin if ADOQuery1.Active then if not ADOQuery1.Bof then ADOQuery1.Prior; end; procedure TFrmManagerSearchPSD.BitBtn3Click(Sender: TObject); begin if ADOQuery1.Acti
38、ve then if not ADOQuery1.Eof then ADOQuery1.Next; end; procedure TFrmManagerSearchPSD.BitBtn5Click(Sender: TObject); begin,2020/7/5,38,if ADOQuery1.Active then ADOQuery1.Last; end; end.,2020/7/5,39,5.2 ADO数据库连接,ADO是从Delphi5开始新增加的功能,Delphi通过微软的ADO存取各种类型的数据库,是目前越来越流行的存取数据库的方式,使用ADO就可以无需再使用BDE了。 5.2.1
39、基于ADO的体系结构 下面首先介绍一下ADO的来历。Universal Data Access (UDA)是微软公司推出的对数据库操作的一个策略,提供了快速访问各种数据库的能力,UDA提供了一种不受限制的能力,通过易用的API接口访问各种数据源(需要与其兼容的驱动程序),类似Delphi的BDE,这项技术能在一个程序中从多种的数据源中轻易的访问到数据。UDA用Microsoft Data Access Components(MDAC)来实现,而MDAC则包括Active Data Objects(ADO),Open Database Connectivity(ODBC)与OLE DB。ADO是
40、MDAC的应用程序设计接口,OLE DB则是系统级的接口,定义了一套COM接口,提供了从关联数据库及文件系统的数据访问能力,ODBC为了向后兼容也包含在MDAC中,ODBC将会被OLE DB替代,因此就目前来说,如果可以直接通过OLE DB操作的数据库就不要使用ODBC了,目前OLE DB可直接用于Microsoft Access,Microsoft SQL以及Oracle等。,2020/7/5,40,对于读者来说只要能认识到:ADO是微软提供的可以访问数据库的一种接口方式就可以了。 基于ADO的应用程序可以是单层或多层的,其情况取决于使用的数据库系统。例如,使用ADO访问MicrosoftS
41、QLServer的程序总是两层的,因为MicrosoftSQLServer是一个远程数据库系统,数据库系统通常存放在一个远程专用的SQL服务器上。另一方面,使用ADO访问本地数据库(如dBASE或FoxPro)的程序,则总是单层的。 在ADO的应用程序中,数据库是由ADO数据存储(ADO data stores)连接访问的。所以要访问数据库,程序必须首先连接到数据存储。可以用ADO数据集控件,也可共享由TADOConnection控件建立的连接来访河到数据存储。 一旦应用程序连接到数据存储,数据集控件就可以与ADO连接控件关联,并由此访问数据库中的数据表。,2020/7/5,41,基于ADO的
42、应用程序使用Microsoft ADO2.1(或更高版本)和OLEDBprovider与数据库连接访问和更新存储。ADO2.1(或更高版本)需要安装在客户端上。ADO和OLEDB由Microsoft公司安装在Windows中提供。OLEDB连接到数据仓库并对数据进行管理。 OLEDB provider可以是从本地的OLEDB驱动到ODBC驱动的多种类型,这些驱动程序必须安装在客户端上。不同数据库系统的OLE DB驱动程序由数据库系统供应商提供或第三方厂家提供。 有些应用程序使用的数据库需要另外的客户端软件支持,如Microsoft SQL Server或Oracle,则这些软件也必须安装在客户
43、端。客户端软件由数据库系统供应商提供。 5.2.2 连接控制 ADO应用程序常用的方法是使用TADOConnection控件建立与数据库的连接,其它ADO数据集控件和命令控件指向它用以共享该连接 。除此之外,TADOConnection控件还提供了属性和方法来打开和关闭连接,控制连接的动作以及直接访问ADO连接对象。,2020/7/5,42,第二种方法是为程序中的每一个ADO数据集控件和命令控件直接建立与数据库的连接。用第一种方法可以使多个控件共用一个连接,从而便于对连接提供更多更强大的控制,如进行超时控制,事务处理等。所以在有多个ADO控件的情况下,最好使用TADOConnection控件建
44、立连接。 1使用TADOConnection控件建立ADO连接 TADOConnection控件有一个ConnectionString属性,这个属性是多个字符串的集合,之间用分号隔开,它指明了一个ADO数据库连接。指定这个属性就建立了一个ADO连接。 指定ConnectionString属性最简便的方法是使用连接字符串编辑器,点击对象观察器中ConnectionString属性框右边的有省略号按钮将打开如图5-3所示的对话框。 图5-3 设置连接字符串,2020/7/5,43,这个对话框提供了两种方式指定ConnectionString属性,第一种是使用已有的数据链接文件,数据链接文件其实就是
45、存放着连接字符串的扩展名为.udl的文件;第二种方法是使用一个新的连接字符串。下面介绍一下如何创建连接字符串。 单击Build按钮,打开数据连接属性编辑框,如图5-4所示。 在“提供者”选项页中列出了所有的OLE DB提供者,用户可根据要连接的数据库类型选择合适的OLEDB提供者。选择不同的OLEDB提供者,“连接”选项页的样式,选项的设置也会不同。 选择“使用数据源名称”单选框,在下面的下拉框中选择一种数据库类型;如果选择“使用连接字符串”单选框,就要在编辑框内输入连接字符串,可以从udl文件中读取。 在“用户名称”和“密码”框内输入登录数据库时的验证信息,如果此处不设置,程序登录数据库时也
46、会提示输入信息。 在“输入要使用的初始目录”编辑框内给出数据库所在的目录。,2020/7/5,44,图5-4 选择OLE DB提供者 图5-5 选择数据源,2020/7/5,45,为确保连接有效,可以单击【测试连接】按钮,系统将报告连接测试成功或失败的信息。 如果需要,还可以在“高级”选项页中对连接超时和访问权限进行设置。 “所有”选项页显示了此连接的所有属性设置,可以在其中进行编辑修改。 单击【确定】按钮,关闭连接属性编辑框,回到图5-3的对话框。 可以看到设置连接字符串的编辑框里已经有相应的连接字符串;单击OK按钮,结束连接字符串的设置。 当然,也可以在运行期向TADOConnection
47、控件的ConnectionString属性赋值,如下所示: Provider=MSDASQL.1;Persist Security Info=False;User ID=sa;Data Source=dBASE Files 2ADO连接的常用属性和使用方法 有时,可以将TADOConnection控件的ConnectionObject属性直接指向一个已有的ADO连接,用来代替自建连接。不过,这要求用户对ADO与ADO连接非常熟悉,所以一般不推荐使用这种方法。,2020/7/5,46,此外,如果TADOConnection有与之相连的ADO数据集控件和命令控件的话,当数据集控件被激活时,或命令控
48、件中的命令被执行时,TADOConnection控件也将被激活。 激活TADOConnection控件时将触发OnWillConnect事件和OnConnectComplete事件。用户可编写这两个事件句柄的处理代码,来完成特定的功能。 反过来,把Connected属性设为False或调用Close方法将关闭一个TADOConnection控件。此时,将首先触发OnDisconnect事件,接着关闭TADOConnection控件,最后关闭与之相连的ADO数据集控件和命令控件。 在程序运行期,可以通过访问TADOConnection控件的State属性判别控件所处的状态。当State值为stC
49、losed时,表示控件处于关闭状态:State值为stOpen表示控件为打开状态;State值为stConnecting表示控件正在建立连接字符串设定的连接,此时可以用Cancel方法取消建立连接。,2020/7/5,47,5.3客户端与服务器的连接,在建立执行SQL命令前,应用程序必须先和数据库建立连接。 5.3.1 SLMIS系统登录窗体的设计 对多用户数据库程序来说,不同的用户有不同的权限,比如管理员可以无任何限制、有的用户只有查询的权限没有修改的权限、有的用户只可以录入数据但不能查询等等。所以在数据库程序启动时,需要输入用户名和密码后才能进入,程序根据用户名找到用户的权限确定哪些功能可
50、以使用。SLMIS系统登录界面如图5-6所示。 登录窗口的设计可以是多种多样的,但一般应有用户名输入和密码输入两个文本框。考虑到使用该系统的用户需要使用真实姓名,这样输入用户名时比较麻烦,登录窗口启动后自动将所有用户名列出;同时,该系统的用户很多,于是又添加了部门列表框,这样用户就可以首先选择所在部门,此时用户名下拉列表框就只列出所有该部门的用户名。 对于用户修改自己的密码和管理员管理用户这个功能,目前大部分数据库程序都放在了主窗口的菜单中,优点是用户可随时修改自己的密码,管理员可随时管理用户。,2020/7/5,48,在设计登录窗体之前,首先要保证数据库中要有一个用户数据表,数据表的记录应该
51、至少有这么几个字段:用户名、密码、权限,其中密码最好是加密存放的。因为该系统较为庞大,可能有多个用户具有相同的权限,多个用户同属于一个部门,同时该部门可能更名等,于是在SLMIS中一共使用了三个基础表来完成这基于角色一功能。 图5-6 登录窗口 图5-7 数据库连接初始化 除此以外,系统登录前必须与服务器上的数据库连接起来,因此还要检查对应的连接是否已设置完毕。在SLMIS中,如果在注册表中找不到相应的设置,应首先弹出注册窗体让用户填写服务器数据库设置信息,界面如图5-7所示。,2020/7/5,49,5.3.2设置用户权限 由于SLMIS功能模块很多,每一个角色可能有任意功能的组合,系统采用
52、0、1这种方式表示,字段内容由多个0和1组成的字符串构成,1代表有该项权限,0代表没有该项权限,从第一个字符开始对应相应的功能,属于某一个角色的用户就继承该角色的所有权限,这样程序就可判断出用户的权限了。 设置每一个角色的权限界面如图5-8所示。 图5-8 设置角色的权限图 5-9 添加用户,2020/7/5,50,5.3.3 SLMIS系统登录功能的实现代码 系统登录功能共分为两个部分,即系统登录和系统注册。 1系统登录功能 procedure TF_Login.Button1Click(Sender: TObject); var passwd:string; rightid:integer
53、; begin username:=ComboBox1.Text; passwd:=edit1.text; Edit1.Text:=; if (username)and(passwd) then begin ADOQuery2.Close; ADOQuery2.SQL.Clear; ADOQuery2.SQL.Add(select * from USE_USER WHERE C_NAME=:username AND C_PASS=:passwd); ADOQuery2.Parameters.parambyname(username).datatype:=ftstring; ADOQuery2.
54、Parameters.ParamByName(username).Value:=username; ADOQuery2.Parameters.parambyname(passwd).datatype:=ftstring; ADOQuery2.Parameters.ParamByName(passwd).Value:=passwd; ADOQuery2.Open; if NOT ADOQuery2.IsEmpty then begin,2020/7/5,51,ADOQuery2.First; rightid:=ADOQuery2.FieldValuesI_ROLEID; ADOQuery1.Cl
55、ose; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add(select * from USE_ROLE WHERE I_ID=:rightid); ADOQuery1.Parameters.parambyname(rightid).datatype:=ftinteger; ADOQuery1.Parameters.ParamByName(rightid).Value:=rightid; ADOQuery1.Open; if NOT ADOQuery1.IsEmpty then begin ADOQuery1.First; if (ADOQuery2.FieldVa
56、luesI_PASSED=I_Co1) OR (ADOQuery2.FieldValuesI_PASSED=I_Co2) then begin userright:=ADOQuery1.FieldValuesC_POPEDOM; userrole:=ADOQuery1.FieldValuesC_NAME; F_Login.Hide; systemflagid:=WriteLogin(); /填写登录信息 dfm11.Show; end,2020/7/5,52,else begin ComboBox1.SetFocus; exit; end; end; end else begin showme
57、ssage(密码错误!); edit1.Text:=; ComboBox1.SetFocus; exit; end; end else begin showmessage(用户名或密码为空!); edit1.SetFocus; exit; end; end;,2020/7/5,53,procedure TF_Login.ComboBox2Select(Sender: TObject); var depid:integer; name1:string; begin Edit1.Text:=; name1:=trim(ComboBox2.Text); ComboBox1.Items.Clear;
58、ADOQuery2.Close; ADOQuery2.SQL.Clear; ADOQuery2.SQL.Add(select * from USE_DEP WHERE C_DEPARTMENT=:name); ADOQuery2.Parameters.parambyname(name).datatype:=ftstring; ADOQuery2.Parameters.ParamByName(name).Value:=name1; ADOQuery2.Open; if not ADOQuery2.IsEmpty then begin ADOQuery2.First; depid:=ADOQuery2.FieldValuesI_ID; ADOQuery2.Close;,2020/7/5,54,rightid:=ADOQuery2.FieldValuesI_ROLEID; ADOQuery1.Close; DOQuery1.SQL.Clear; ADOQuery1.SQL.Add(select * from USE_ROLE WHERE I_ID=:rightid); ADOQuery1.Parameters.parambyname(rightid).datatype:=ftinteger; ADOQu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/Z 179-2026恒定湿热(含空气的未饱和高压蒸汽)
- 麻纺厂原材料采购实施办法
- 心电监护全流程操作要点
- 数学广角:搭配问题学习任务单2025-2026学年人教版三年级上册数学
- 电焊安全漫画手册讲解
- 某轮胎厂质量控制规范
- 大数据分析与AI
- 2026年城市绿化项目承包与施工合同二篇
- 2026调研相关面试题库及答案
- 2026防火报务员面试题及答案
- 2026年贵州省公需课培训(专业技术人员继续教育)试题及答案
- 煤炭生产经营单位(安全生产管理人员)证考试题库及答案
- 2026年巴城镇公开招聘编外工作人员8人简章笔试题库及一套完整答案详解
- 2026上海市农业广播电视学校公开招聘工作人员笔试参考试题及答案详解
- 2026新教材人教版九年级上册英语暑假预习:Unit1-Unit5词汇详解
- 2026年农商银行面试题及答案
- 保洁员招聘流程与岗位职责规范
- (2026年)医院急性肾功能衰竭患者急救流程课件
- 重组抗破伤风毒素单克隆抗体临床应用专家共识(2026年版)
- (正式版)DB37∕T 5321-2025 《居住建筑装配式内装修技术标准》
- 南京创新投资集团考试题
评论
0/150
提交评论