490 likes | 690 Vues
Keep on walking. 《Delphi 程序设计 》 工学结合特色精品课程. —— 杨丽敬. 第六章 ADO 数据库编程. 本章要点: ADO 的概念 ADO 对象模型 Delphi 7 支持 ADO 的方式 Delphi 7 中 ADO 组件的属性、方法及其使用. 6.1 ADO 概述. 6.1.1 ADO 的概念
E N D
Keep on walking 《Delphi程序设计》工学结合特色精品课程 ——杨丽敬
第六章ADO数据库编程 • 本章要点: • ADO的概念 • ADO对象模型 • Delphi 7支持ADO的方式 • Delphi 7中ADO组件的属性、方法及其使用
6.1 ADO概述 • 6.1.1 ADO的概念 • ADO(ActiveX Data Object)是Microsoft提供对各种数据库进行访问的高层接口,是DAO/RDO的后继产物,是Microsoft最新的数据访问组件(Microsoft数据访问组件简称MDAC)的一部分 。 • ADO是基于OLE DB之上的面向对象的数据访问模型,OLE DB是Microsoft开发的一种高性能的、基于COM的数据访问技术,其作用是向应用程序提供一个统一的数据访问方法,而不需要考虑数据源的具体格式和存储方式。
rs = Server.CreateObject("ADODB.RecordSet") rs.Open(sqlStr,conn,1,A) 注:A=1表示读取数据;A=3表示新增、修改或删除数据。 在RecordSet组件中,常用的属性和方法有: rs.Fields.Count:RecordSet对象字段数。 rs(i).Name:第i个字段的名称,i为0至rs.Fields.Count-1 rs(i):第i个字段的数据,i为0至rs.Fields.Count-1 rs("字段名"):指定字段的数据。 rs.Record.Count:数据记录总数。 rs.EOF:是否最后一条记录。 rs.MoveFirst:指向第一条记录。 rs.MoveLast:指向最后一条记录。 rs.MovePrev:指向上一条记录。 rs.MoveNext:指向下一条记录。 rs.GetRows:将数据放入数组中。 rs.Properties.Count:ADO的ResultSet或Connection的属性个数。 rs.Properties(item).Name:ADO的ResultSet或Connection的名称。 rs.Properties:ADO的ResultSet或Connection的值。 rs.close():关闭连接。 • 1. 基本对象 • (1)Connection对象。(2)RecordSet对象 • (3)Command对象。(4)Field对象。 • (5)Property对象。(6)Parameter对象 • (7)Error对象。 • 2. 集合对象 • (1)Errors集合对象。 • (2)Parameters对象。 • (3)Fields对象。 • (4)Properties对象。
6.2 TADOConnection组件 • 6.2.1 TADOConnection组件功能说明 • TADOConnection组件用于建立与实际的物理数据库的连接,TADOCommand、TADODataSet、TADOTable、TADOQuery、TADOStoredPro等组件均可以通过它访问和操作数据库。 • 6.2.2 TADOConnection组件的常用属性 • 1. CommandCount属性2. Commands属性 • 3. CommandTimeout属性4. Connected属性
5. ConnectionObject属性6. ConnectionString属性 • 7. ConnectionOption属性8. ConnectionTimeout属性 • 9. CursorLocation属性 10. DataSetCount属性 • 11. DataSets属性12. DefaultDatabase属性 • 13. Errors属性14. InTransaction属性 • 15. KeepConnection属性16. Provider属性 • 17. State属性18. LoginPrompt属性
6.2.3 TADOConnection组件的常用方法 1. Open方法 语法格式如下: procedure Open; overload; procedure Open(const UserID: WideString; const Password: WideString); overload; 2. Close方法 使用格式如下: procedure Close; 3. Execute方法 格式1:
function Execute(const CommandText: WideString; const CommandType: TCommandType = cmdText; • const ExecuteOptions: TExecuteOptions = []): _RecordSet; overload; • 格式2: • procedure Execute(const CommandText: WideString; const CommandType:CommandType; var • RecordsAffected: Integer; ExecuteOptions: TExecuteOptions = [eoExecuteNoRecords]); overload;
7. Cancel方法 • 语法格式如下: • procedure Cancel; • 8. GetProcedureName方法 • 语法格式如下: • procedure GetProcedureNames(List: TStrings); • 9. GetTableNames方法 • 语法格式如下: • procedure GetTableNames(List: TStrings; [SystemTables: Boolean = False]); • 10. GetFieldNames方法 • 语法格式如下: • procedure GetFieldNames(const TableName: String; List: TStrings);
6.2.5 使用TADOConnection建立到数据库的连接 • 1. 通过DSN建立连接 • 2. 通过选择数据库建立到Access数据库的连接 推荐使用数据模块 • 【例6-1】 编写一个显示当前目录下“教学.MDB”的数据库中的表名和字段名的程序。程序的设计界面如图6-14所示,程序的运行界面如图6-15所示。程序运行时把当前目录下的“教学.MDB”数据库中的表名显示在ListBox1列表框中,在ListBox1列表框中单击以选中一个表名时,该表所有的字段名将显示在ListBox2中。
分析:在窗体的OnCreate事件中首先使用ADOConnect1组件与当前目录下的“教学.MDB”建立连接,然后通过调用ADOConnection1的GetTableNames方法以获得“教学.MDB”数据库中的表名字符串列表并赋值给ListBox1的Items属性。在ListBox1中选中一个表时,将发生列表框的OnClick事件,在该事件中调用ADOConnection1组件的GetFieldNames方法并以选中的表名作为参数,得到选中表的字段名字符串列表并赋值给ListBox2的Items属性。 请思考:1.如果是SQL数据库,如何进行连接? 2.如何解决数据库文件的路径问题
6.3 TADOCommand组件 • 6.3.1 TADOCommand组件功能说明 • TADOConnection不但能够与数据库建立连接,还可以通过它的Execute方法执行SQL命令。在ADO中,TADOCommand组件是专门用来创建和执行命令的。 • TADOCommand组件执行在CommandText属性中指定的命令,一个命令可能在一次执行过程中需要某些参数,如果命令包括有关参数,则必须在Parameters属性中指定。可通过调用TADOCommand对象的Execute方法执行命令。 记录集可由数据集组件带回。如: • ADODataSet.RecordSet : = ADOCommand.Execute;
6.3.2 TADOCommand组件的常用属性 • 1. CommandObject属性2. CommandText属性 • 3. CommandTimeout属性 4. Connection属性 • 5. ConnectionString属性6. CommandType属性 • 7. ParamCheck属性 8. Parameters属性 • 9. Prepared属性 10. Properties属性 • 11. State属性
6.3.3 TADOCommand组件的常用方法 • 1. Assign方法 • 语法格式如下: • procedure Assign(Source: TPersistent); override; • 2. Cancel方法 • 语法格式如下: • procedure Cancel; • 3. Execute方法 • 格式1: • function Execute: _Recordset; overload;
格式2: • function Execute(const Parameters: OleVariant): _Recordset; overload; • 格式3: • function Execute(var RecordsAffected: Integer; const Parameters: OleVariant): _RecordSet; overload; 【例6-2】利用TADOCommand组件实现如下操作:把当前目录下的“教学.MDB”数据库中的“教师表”中的“工资”字段值全部改为原来的1.1倍,从而实现加工资的功能。程序的设计界面如图6-16所示。程序执行时,单击【连接到数据库】按钮将建立起到“教学.MDB”数据库的连接,然后单击【增加工资】按钮,将把“教师表”中的“工资字段”值全部修改为原来的1.1倍,单击【退出】按钮将先关闭连接并关闭应用程序。
分析:建立连接采用与例6-1同样的方法。要使TADOCommand执行命令,可先通过设置它的Connection属性值来和一个TADOConnection组件对象联系在一起,然后设置它的CommandType属性为需要的命令类型,再设置它的CommandText属性为要执行的命令文本,最后调用TADOCommand对象的Execute方法执行CommandText中存放的命令。
6.4 TADODataSet组件 • 6.4.1 TADODataSet组件功能说明 • TADODataSet组件是最常用的ADO数据集组件,具有从一个或多个ADO数据表中找到结果数据集的功能。结果数据集可以是直接从数据表中读取的,也可以是通过SQL语句从一个或多个数据表得到的。另外TADODataSet组件还可以用来处理调用TADOCommand对象的Execute方法返回的结果记录集。
6.4.2 TADODataSet组件的常用属性 • 1. RDSConnection属性2. BlockReadSize属性 • 3. CacheSize属性4. CanModify属性 • 5. CursorType属性6. EnableBCD属性 • 7. Filter属性8. Filtered属性 • 9. IndexDefs属性10. IndexFieldCount属性 • 11. IndexFieldNames属性12. IndexFields属性
13. IndexName属性14. LockType属性 • 15. MarshalOptions属性16. MasterFields属性 • 17. MaxRecords属性18. RecNo属性 • 19. RecordCount属性20. Recordset属性 • 21. RecordsetState属性22. RecordSize属性 • 23. RecordStatus属性24. Sort属性 • 25. StoreDefs属性
6.4.3 TADODataSet组件的常用方法 • 1. GetIndexNames方法 • 从表记录集中取得所用可用的索引名列表 • 2. BookmarkValid方法 • 该方法用来测试特定的书签是否合法,书签就是一个记录的标志 • 3.CancelBatch方法 • 使用该方法将取消批更新模式下对记录集的所有挂起的更新 • 4. CancelUpdates方法 • 使用该方法可取消挂起的缓存更新
5. DeleteRecords方法 • 删除记录集中的一个或多个记录 • 6. FilterOnBookmarks方法 • 该方法的作用是过滤记录到某个书签的位置 • 7. IsSequenced方法 • 该方法用来返回底层数据库是否将记录的个数作为记录的序号。 • 8. Locate方法 • 该方法用来根据一个或多个字段的值查找记录,并把查找到的记录设置为当前记录。
9. Lookup方法 • 该方法用来从数据集中查找记录,从查找到的记录中提取某些字段值 • 10.Next方法 • 该方法用来把记录指针移到下一条记录 • 11.Requery方法 • 该方法用来重新执行产生记录集的查询命令以便重新生成记录集 • 12.Seek方法 • 该方法用来根据索引查找记录 • 13. UpdateBatch方法 • 该方法用来把挂起的批更新写到物理数据库中 • 14.UpdateStatus方法 • 该方法用来返回当前记录的更新状态
【例6-3】利用TADODataSet组件编写一个实现对教师表中的数据进行显示、修改和查询的程序。程序设计界面如图6-19所示,程序的运行界面如图6-20所示。程序运行时在网格组件中显示教师表的内容,当在网格组件中单击某条记录时,该记录的若干个字段值将会显示在编辑框中,如图6-20所示。当在编辑框中修改了当前记录的内容后,单击【更新】按钮,修改的结果将保存到数据表中。单击【根据姓名查找】按钮将弹出一个输入对话框,要求用户输入一个姓名,然后根据姓名查找记录。如果找到则给出“找到记录”的提示并把当前记录设为该记录,如果没有找到也给“没有找到”的提示信息,并把当前记录设置为查找前的记录。【例6-3】利用TADODataSet组件编写一个实现对教师表中的数据进行显示、修改和查询的程序。程序设计界面如图6-19所示,程序的运行界面如图6-20所示。程序运行时在网格组件中显示教师表的内容,当在网格组件中单击某条记录时,该记录的若干个字段值将会显示在编辑框中,如图6-20所示。当在编辑框中修改了当前记录的内容后,单击【更新】按钮,修改的结果将保存到数据表中。单击【根据姓名查找】按钮将弹出一个输入对话框,要求用户输入一个姓名,然后根据姓名查找记录。如果找到则给出“找到记录”的提示并把当前记录设为该记录,如果没有找到也给“没有找到”的提示信息,并把当前记录设置为查找前的记录。
分析:本例由于要显示数据库的内容,故应使用能够返回结果记录集的TADODataSet组件。可用一个TADOConnection组件与实际的物理数据库连接起来,用一个TADODataSet组件执行命令从TADOConnection组件连接的数据库中提取记录形成记录集,再用一个TDataSource组件作为TADODataSet组件与数据控制组件连接的桥梁,用一个TDBGrid组件来显示记录集的内容。当记录指针位置发生改变时,要把当前记录的内容显示在编辑框中,本例定义了一个名为DispValue的过程用来实现该功能。另外本例还编写了一个名为SetValue的过程,该过程的作用是利用编辑框中的值修改当前记录的内容。根据姓名查找记录的值,可使用TADODataSet组件的Locate方法。
实验十:数据库的数据显示 • 用学过的ADO组件尝试不同的连接方法 • 把数据显示出来 • 尝试相对路径和计算路径函数的使用 • ADOcommand和ADOdataset的用法
6.6 TADOTable组件 • 6.5.1 TADOTable组件功能说明 • TADOTable组件用于通过一个单个的数据表来获取和操作数据集。TADOTable组件和TTable组件非常类似,许多属性、事件和方法也一样。如果不使用TADOConnection组件,TADOTable组件的ConnectionString属性就需要设定;如果使用TADOConnection组件,那么ConnectionString属性就不需要设定,直接设定其Connection属性使其指向TADOConnection组件即可。
6.5.2 TADOTable组件的常用属性 • 1. MasterSource属性 • 2. ReadOnly属性 • 3. TableDirect属性 • 4. TableName属性 • 6.5.3 TADOTable组件的常用方法 • 语法格式如下: • procedure GetIndexNames(List: TStrings);
6.6 TADOQuery组件 • 6.6.1 TADOQuery组件功能说明 • TADOQuery组件类似于Query组件,可以使用SQL语句在一个和多个数据表中选择字段,而且可以增加和删除数据。在使用该组件之前,必须要建立它到物理数据库之间的连接。如果不使用TADOConnection组件,TADOQuery组件的ConnectionString属性就需要设定;如果使用TADOConnection组件,那么ConnectionString属性就不需要设定,直接设定其Connection属性使其指向TADOConnection组件即可。
6.6.2 TADOQuery组件的常用属性 • 1. SQL属性 • 该属性用来指定利用TADOQuery组件来执行的SQL语句。 • 2. RowsAffected属性 • 该属性用来返回最近一次执行查询操作时影响到的记录数,即被操作的记录数。 • 6.6.3 TADOQuery组件的常用方法TADOQuery组件的常用方法是Open和ExecSQL,这两个方法的作用与TTable组件的同名方法的作用一致。TADOQuery组件的使用方法与TQuery组件也基本一致。
6.7 *TADOStoredPro组件 • TADOStoredProc组件通过ProcedureName属性指定存放在服务器上的一个存储过程,应用程序可以执行这个存储过程。如果TADOStoredProc组件是指向一个TADOConnection组件,为了与存储过程相联系,可以调用TADOConnection组件的GetProcedureNames方法,将数据库中的存储过程名返回,然后再将选中的存储过程名赋给ProcedureName属性。
ADOTable、ADOQuery、ADODataSet、ADOCommand构件之间的比较:ADOTable、ADOQuery、ADODataSet、ADOCommand构件之间的比较:
6.8 ADO综合应用实例 • 【例6-4】编写一个显示选中数据表中的数据或显示SELECT语句执行结果的应用程序,显示的数据来源于当前目录下的“教学.MDB”数据库。程序的设计界面如图6-21所示,程序的运行界面如图6-22所示。程序运行时将在ComboBox1组合框中显示“教学.MDB”中的所有表名,可以通过选择确定在DBGrid组件中显示的是某个表中的数据还是执行某条SELECT语句后的结果。如果用户选择【数据表中的数据】,则可以从ComboBox1组合框中选择一个表名,然后单击“执行命令”按钮,表中的数据将会显示在DBGrid1表格中。如果用户选择【Select语句执行结果】,则可以Memo1组件中输入一条合法的SELECT语句,然后单击【执行命令】按钮,SELECT语句执行的结果将会显示在DBGrid1表格中。
分析:执行SQL语句可使用TADOQuery组件。可先通过TADOConnection组件建立与当前目录下的“教学.MDB”数据库的连接,然后通过设置TADOQuery组件的Connection属性使它能够通过TADOConnection组件访问数据库。通过一个TDataSource组件把TADOQuery组件和TDBGrid组件联系起来,使命令执行的结果集能够显示在TDBGrid组件中。在“执行命令”按钮的单击事件中,首先根据用户的选择及选择的表名或输入的SELECT语句,设置TADOQuery组件SQL属性,然后调用TADOQuery组件的Open方法得到结果集并显示在TDBGrid组件中。
【例6-5】设计一个对“教学.MDB”中的“教师表”进行显示和修改的程序,要求能够对教师表中的数据进行立即更新和批量更新。程序的设计界面如图6-23所示,程序的运行界面如图6-24所示。程序运行时,若选中“立即更新”,在编辑框中修改当前记录的内容,然后单击【更新】按钮,可将修改结果存回到数据库中;若选中【批量更新】,在网格控件中可以修改多处内容,然后如果单击【提交】按钮,则所有的修改均存放到数据库中去,如果单击【撤消】按钮,则所有的【修改】将被撤销。【例6-5】设计一个对“教学.MDB”中的“教师表”进行显示和修改的程序,要求能够对教师表中的数据进行立即更新和批量更新。程序的设计界面如图6-23所示,程序的运行界面如图6-24所示。程序运行时,若选中“立即更新”,在编辑框中修改当前记录的内容,然后单击【更新】按钮,可将修改结果存回到数据库中;若选中【批量更新】,在网格控件中可以修改多处内容,然后如果单击【提交】按钮,则所有的修改均存放到数据库中去,如果单击【撤消】按钮,则所有的【修改】将被撤销。
分析:本例涉及立即更新和批量更新两种操作。当使用立即更新时,只要声明当前记录的工作已经完成,系统将会将更改立刻传送到数据库。当使用批量更新时,系统只是收集对记录集的所有更改,直到声明该记录集的修改工作已经完成,更改后的数据才会全部提交给数据库。在提交给数据库之前,可以撤销刚刚对记录集所做的更改。
小结 • ADO是Micorsoft公司最新的基于OLE DB的数据访问模式,它几乎能够访问目前经常使用的所有格式的数据库。在Delphi 7中,通过ADO组件提供了对ADO的支持,ADO组件中的一部分可以看做对ADO对象模型中的某些对象的封装,然后以可视化的形式使用。ADO组件主要有TADOConnection,TADOCommand,TADODataSet,TADOTable,TADOQuery,TADOStoredProc,TRDSConnection等。TADOConnection组件的主要作用是与数据库建立连接,TADOCommand组件的主要作用是执行不返回结果记录集的SQL命令,TADODataSet组件的作用是形成一个记录集以便访问,TADOTable,TADOQuery和TADOSroredProc功能类似于TTable,TQuery和TStoredProc。本章详细介绍这些组件的属性、方法和事件,对每一种组件都通过实例详细讲解了使用方法。最后通过两个综合实例对本章的内容进行综合,目的是使读者能对使用ADO开发数据库应用程序的方法有一个全面的了解。
感谢聆听! Thanks for your time!