1 / 218

Delphi 实用教程

Delphi 实用教程. 第 8 章 数据库编程. 8.1 数据库应用程序的构成 8.1.1 客户机 / 服务器体系结构. 1. 客户机 / 服务器( Client/Server )模型 客户机 / 服务器( C/S )代表了软件实体(如进程、对象)之间相互作用时的一种最典型的模式和相互关系。在这种模式中,服务器实现了某种功能,客户机则以某种方式从服务器处获得这种功能。. 客户机 / 服务器结构. 8.1.1 客户机 / 服务器体系结构. 服务器软件与客户机软件的功能分布见表。. 客户机 / 服务器功能. 8.1.1 客户机 / 服务器体系结构.

percy
Download Presentation

Delphi 实用教程

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Delphi实用教程 第8章 数据库编程 第8章 数据库编程

  2. 8.1数据库应用程序的构成8.1.1 客户机/服务器体系结构 1. 客户机/服务器(Client/Server)模型 客户机/服务器(C/S)代表了软件实体(如进程、对象)之间相互作用时的一种最典型的模式和相互关系。在这种模式中,服务器实现了某种功能,客户机则以某种方式从服务器处获得这种功能。 客户机/服务器结构 第8章 数据库编程

  3. 8.1.1 客户机/服务器体系结构 服务器软件与客户机软件的功能分布见表。 客户机/服务器功能 第8章 数据库编程

  4. 8.1.1 客户机/服务器体系结构 2. SQL Server 2000 与Delphi的完美结合 微软SQL Server 2000作为大型的关系数据库管理系统 (RDBMS)提供了对数据库管理和开发的支持,它是一个基于客户机/服务器(C/S)模式的关系数据库管理系统,其C/S体系结构如图所示。 商业逻辑和向用户提供数据 进行数据库数据操作和管理 第8章 数据库编程

  5. 8.1.2 Delphi数据库应用程序 • 应用程序的组件构成 数据库应用程序在逻辑上通常由两部分构成: ● 是数据库访问链路 ● 是用户界面 数据库应用程序的组件构成 第8章 数据库编程

  6. 8.1.2 Delphi数据库应用程序 (1)用户界面 用户界面用于将数据库中的数据显示出来,并提供一种操作 机制,使用户能够对数据库中的数据进行编辑和浏览操作。(2)数据模块 ●数据模块是Delphi中一个类似窗体(Form)的组件,它相 当于一个容器,用于放置数据库组件,如组件Table、 Query、Database、Session、StoredProc等,这些与数据库 相关组件均为不可视组件。 ●通过数据模块组件来组织数据库组件有二个主要的优点: ◆这些不可视组件不用直接放在窗体上了, 简化了窗体的设计。 ◆可以对数据库相关组件进行统一管理,共享相同的 内容。 ●数据模块体现了Delphi面向对象和组件重用的特性。 ●击主菜单的FileNewData Module命令可添加新的空白数 据模块 。 第8章 数据库编程

  7. 8.1.2 Delphi数据库应用程序 (3)数据源 数据源组件是数据显示组件和数据集组件之间的中介。当使用 数据模块时,数据源组件是数据模块的一部分,通过组件面 板的Data Access页中的组件进行数据源设计。 (4)数据集 数据集是数据库应用程序的核心。数据集组件保存了一系列从 底层的数据库取出的记录。这些记录的数据可以取自一个数据 表、一个数据表的若干个字段、多个数据表的若干字段。可通 过组件面板的BDE、ADO页中的组件进行设计。 第8章 数据库编程

  8. 8.1.2 Delphi数据库应用程序 (5)连接部分 不同类型的数据集采用不同的机制连接底层数据库。常见的 有BDE、ODBC及ADO等几种方式。 数据存取机制 第8章 数据库编程

  9. 8.1.2 Delphi数据库应用程序 2. 数据库应用程序的层次划分 数据库应用程序的体系结构主要由两方面决定: ● 使用的数据库类型(即是本地数据库还是远程数据库) ● 同时访问数据库的用户数以及数据库中需要存储哪些类 型的信息。 (1)单层数据库应用程序 单层数据库应用程序中,应用程序和数据库共享同一个 文件系统,它们使用本地数据库或文件来存取数据。 单层数据库应用程序的结构 第8章 数据库编程

  10. 8.1.2 Delphi数据库应用程序 ( 2)两层数据库应用程序 在两层数据库应用程序中,客户程序提供用户界面, 通过BDE、ADO从远程数据库服务器数获取数据。 BDE方式下的两层数据库应用程序结构 ADO方式下的两层数据库应用程序结构 第8章 数据库编程

  11. 8.1.2 Delphi数据库应用程序 (3)多层数据库应用程序 在多层数据库应用程序中,客户程序、应用服务器和 远程数据库服务器通常分布在不同的机器上。客户程 序主要提供用户界面,它向应用服务器请求数据和申 请更新数据;再由应用服务器向远程数据库服务器请求数据 和申请更新数据。 第8章 数据库编程

  12. 8.1.3数据库应用程序的建立 • Delphi数据库应用程序主要有两种方法: • 直接在窗体中放入数据组件; • 先创建数据模块,再对数据模块进行引用。 下面用两例来说明: 第8章 数据库编程

  13. 1.直接在窗体中放置数据访问组件法 (1)选择主菜单下的FileNewApplication,创建一个应用程序。 (2)从Data Access页上将一个数据源组件DataSource拖放到主窗体 上。数据源组件在组件面板上位置如图所示。 (3)从BDE页上将一个数据表组件Table拖放到主窗体上。数据表 组件在组件面板上位置如图所示。 • 数据源组件 数据源组件在组件面板上的位置 数据表组件在组件面板上的位置 • 数据源组件 第8章 数据库编程

  14. 1.直接在窗体中放置数据访问组件法 (4)从Data Control页上将一个表格显示组件DBGrid和一个数 据浏览组件DBNavigator拖放到主窗体上。DBGrid组件用 于显示数据表中的记录;DBNavigator组件用于对数据表进 行编辑和浏览。两个组件在组件面板的位置。 DBGrid组件 表格、导航组件在组件面板上的位置 DBNavigator组件 第8章 数据库编程

  15. 1.直接在窗体中放置数据访问组件法 (5)按表设置各组件对象的属性。运行后主窗体如图所示。 窗体和组件对象属性表 数据源 数据浏览 数据表 表格显示 程序界面(设置属性值后的状态) 第8章 数据库编程

  16. 2.使用数据模块创建 (1)选择主菜单下的FileNewApplication,创建一个应用程序。 (2)选择主菜单下的FileNewData Module,创建一个数据模块。 (3)向数据模块中添加一个数据源组件DataSource和一个数据表组件 Table,添加了这两个组件后的数据模块。 (4)向主窗体中添加一个表格显示组件DBGrid和一个数据浏览组件 DBNavigator。 第8章 数据库编程

  17. 2.使用数据模块创建 (5)保存数据模块单元为DMUStu,保存主窗体单元为FormMain。 (6)鼠标单击主窗体,选择主菜单下的FileUse Unit命令,选择 数据模块对应的单元文件,在本例中对应的单元文件为 DMUStu,如图所示,单击窗体中的OK按钮,使主窗体的单 元文件能够引用数据模块的单元文件。查看主窗体的单元文 件FormMain代码,会发现在实现部分增加了一条语句:uses DMUStu; 该语句由本步操作过程产生,表明主窗体引用了这 个数据模块。 第8章 数据库编程

  18. 2.使用数据模块创建 (7)按表设置各组件对象的属性。运行程序。 第8章 数据库编程

  19. 8.2数据源组件DataSource • 数据源组件在数据集组件与数据显示/编辑组件之间提供了一个接口,起着两者之间通信的媒介作用。每一个数据显示/编辑组件通过数据源连接上数据集,取得要显示和操纵的数据。同样,数据集组件为了让它的数据被显示和操纵,必须连上数据源组件。另外,数据源组件在连接主/从结构的数据表时,也起着关键的作用。 第8章 数据库编程

  20. 8.2.1数据源组件的属性 1. AutoEdit属性 该属性决定是否允许数据显示/编辑组件修改数据,设置为True 时将允许数据显示/编辑组件修改数据(前提条件是该组件 DataSet属性对应的数据集组件ReadOnly属性设置为False)。 2. DataSet属性 标识该数据源组件正在连接哪一个数据集组件。 下面的代码在运行期改变数据源DS的数据集。 with DS do begin if (DataSet = DSet1) then DataSet := DSet2 else DataSet := DSet3; end; 3. Enabled属性 该属性决定DataSource是否生效。 4. State属性 State是只读属性,表示与该数据源相连接的数据集组件的状态。 第8章 数据库编程

  21. 8.2.2数据源的方法 1. Edit方法 Edit方法使数据源相联系的数据集进入编辑状态,也可通过修 改数据源的AutoEdit属性来实现该功能。 2. IsLinkedTo方法 函数原型:function IsLinkedTo(DataSet: TDataSet): Boolean; 该函数用来判断数据源是否与参数DataSet中指定的数据集相联系。 第8章 数据库编程

  22. 8.2.3数据源的常用事件 1. OnDataChange事件 当数据显示/编辑组件移动指针,或修改了字段中的数据时, 将触发该事件。另外,数据集中的Next或Prior方法也能触 发 OnDataChange事件。 2. OnUpdateData事件 当前的记录被更新时,将触发该事件。该事件在数据集的post 方法之前被调用,一般用于对数据在提交前进行附加的处理和 有效性检查。 3. OnStateChange事件 在数据集的状态改变时,将触发该事件。 第8章 数据库编程

  23. 8.3 数据集组件DataSet • DataSet定义了一些关于数据集的基本属性、方法和事件,在此基础上,派生出Query、Table、StoreProc、ADOTable、ADOQuery、ADOStoreProc等组件。 • 有以下两种方法使用DataSet: • 直接使用Delphi内建的DataSet子类,如Table、Query及StoreProc等。在程序中使用这些对象,就相当于打开了相对应的数据集。 • 通过继承DataSet,实现该类中所有的抽象方法。 第8章 数据库编程

  24. 8.3.1数据集的打开与关闭 • 有两种方法打开数据集: • 在对象观察器设置Active属性为True,或在运行期间用代码设置Active:=True。 • 在应用程序运行期间,调用数据集的open方法。 • 关闭一个数据集也有两种方法: • 在运行期中设置数据集的Active属性为False。 • 在应用程序运行期间,调用数据集的close方法。 第8章 数据库编程

  25. 8.3.2数据集状态及转换 • 数据集状态的属性的取值及含义 : • 数据集的状态转换 : 第8章 数据库编程

  26. 8.3.3数据集的浏览 • 每个活动数据集有一个游标,指向数据集中当前行。当前行是指正在DBEdit、DBLabel、DBMemo等数据显示/编辑组件中所显示的记录或DBGrid中箭头所指的记录。可以通过移动游标来定位记录。 • DataSet定义了BOF、EOF这两个布尔属性来提供有关游标的位置信息。 移动游标的方法 数据集的BOF和EOF 属性说明 第8章 数据库编程

  27. 8.3.3数据集的浏览 当执行了以下操作之一后,数据集的BOF属性为True。 l首次打开数据集。 l调用了First方法。 l调用了Prior方法失败。 而执行了以下操作之一后,数据集的EOF属性为True。 l打开一个空的数据集。 l调用了Last方法。 l调用了Next方法失败。 第8章 数据库编程

  28. 8.3.4对数据集进行增、删、改的操作 • 可以对数据集中的数据进行各种编辑操作,所对应的方法列于表中 with MyDataSet do begin Append; FieldValues[Field1_Name1]:= Field1_NewValue; FieldValues[Field2_Name2]:= Field2_NewValue; Post; end; 对数据集的修改受其CanModify属性影响。当CanModify为True时,表明数据集是可以修改的。另外,如果数据集是Table组件,只有ReadOnly属性为False,才能对其中的数据进行修改。 在数据集的最后添加一条记录 第8章 数据库编程

  29. 8.3.5数据集常用事件 • 数据集常用事件表 第8章 数据库编程

  30. 8.3.5数据集常用事件 • 由表可见,数据集响应的事件大致分为以下几大类: 1. Before+操作名 这一类事件在执行与操作名相应的操作之前被触发。 下面的代码在用户将修改的内容写回数据库中前,利用 BeforePost事件检查输入是否有效。该例检查TDBEdit,若为空 则不写回数据库。// BeforePost事件代码 procedure TForm1.MyDataSetBeforePost(DataSet: TDataSet); begin if DBEdit1.Text = '' then Abort; end; 第8章 数据库编程

  31. 8.3.5数据集常用事件 2. After+操作名 该类事件在与操作名相应的操作完成后被触发,一般可用于报 告操作执行的结果。 当使用first、last、next、prior、moveby 等方法或数据浏览 组件DBNavigator时,在当前记录发生改变之前/之后触发 BeforeScroll事件和AfterScroll事件。 下面的代码利用AfterScroll事件,在状态条上显示当前记录号。 // AfterScroll事件代码 procedure TForm1. MyDataSetAfterScroll(DataSet: TDataSet); begin StatusBar1.panels[0].Text:='Record'+IntToStr(DataSet.RecNo) +‘Of'+IntToStr(DataSet.RecordCount); end; 第8章 数据库编程

  32. 8.3.5数据集常用事件 3. On+事件 该类事件与普通的OnClick事件相似,只是具体的触发条件不 同。如OnCalcFields事件在记录中的数据被修改时或者指针从 一条记录移动到另一条记录的时候被触发,该事件触发后, 将对数据集中的计算字段重新进行计算。 第8章 数据库编程

  33. 8.3.6数据集的字段 • 字段也是一种对象,在数据库编程时用得很多,使用也很灵活。字段对象都派生自TField类,是数据库应用中的基础。 • 字段对象完成如下功能: l改变数据集中的字段值。 l转换字段值的类型。 l对用户输入的数据进行有效性检查。 l定义字段如何显示或编辑。 l根据数据集的OnCalcFields事件,计算字段的值。 • 访问记录中的数据,需要使用数据集的字段对象,如图所示。 第8章 数据库编程

  34. 8.3.6数据集的字段 1. 字段的访问方式 有两种方式可以访问当前记录的字段值。两种方式对于Query、 Table、StoredProc、ADOTable、ADOQuery、ADOStoredProc 等组件都有效,因为这些组件都是从TDataSet继承的。 (1)使用属性Fields[i]访问当前记录,Fields[i]是按照字段的顺序 来访问的。 访问这些属性的方法和处理其它对象一样。 Table1.Fields[0].DisplayLabel:=‘标识符’ (2)使用方法FieldByName按照字段的名字来访问。 对students表中的字段Name的访问: DataSet1.FieldByName(‘Name’).AsString:= Edit1.text; 把字段内的值显示出来: Edit1.text:= DataSet1.FieldByName(‘Name’).AsString; 第8章 数据库编程

  35. 8.3.6数据集的字段 2. 字段的属性 (1)显示控制属性 在数据表中,用户起的字段名一般都很简单、精炼,可以使用 Tfield 的显示控制属性改变字段的显示方式,获得友好的用户 界面。 例如,下列语句将按指定的宽度,显示students表的name字 段的汉字含义。 DBGridl.FieldByName(‘Name’).DisplayLabeL:=’姓名’; DBGridl.FieldByName(‘Name’).DisplayWidth:=8; TField的显示控制属性列于表中。 第8章 数据库编程

  36. 8.3.6数据集的字段 (2)约束条件 约束条件的设置是为了让输入的字段值合法,符合一定的条件。 字段对象可以使用用户自定义的约束条件进行检查。 约束条件相关属性表 第8章 数据库编程

  37. 8.3.6数据集的字段 3. 字段的事件 最常用的字段的事件列于表中。 第8章 数据库编程

  38. 8.3.6数据集的字段 4. 字段的方法 字段的方法列于表中。 第8章 数据库编程

  39. 8.3.6数据集的字段 5. 永久字段 ● 动态字段 数据集中的每一个字段创建一个TField对象,这些生成的 TField对象可以通过代码控制某些属性。它对数据集的适应性 强,而控制它的属性比较麻烦,也不能增加新的计算型显示字段。 ● 永久字段 的选择和设置是在窗体或数据模块设计时完成的。它的字段容易控 制字段属性,也提供了界面以增加计算型字段。 第8章 数据库编程

  40. 8.3.6数据集的字段 ◆使用字段编辑器建立永久字段的步骤是: (1)在窗体上放入Table组件,设置该组件的属性DatabaseName 为student,TableName为students,Name为TabStu, Active为true。 (2)右击窗体上的TabStu,出现如图所示的快捷菜单,选择其中 的Fields Editor(字段编辑器)菜单项,将弹出如图所示 的表字段编辑窗口。 字段编辑器 Table的快捷菜单 字段编辑器的快捷菜单 字段编辑器及快捷菜单 第8章 数据库编程

  41. 8.3.6数据集的字段 (3)右击字段编辑器的空白处,出现快捷菜单,选择其中的Add all fields菜单项,所有字段立即出现在字段编辑器内。 字段列表 第8章 数据库编程

  42. 8.3.6数据集的字段 (4)显示窗体单元的代码,将会发现TForm1类的说明部分增加 了刚才添加的永久性字段。代码片断如下: TForm1 = class(TForm) TabStu: TTable; TabStuStudentid: TStringField; TabStuName: TStringField; TabStuSex: TBooleanField; TabStuBirthday: TDateField; TabStuDepartmentid: TSmallintField; TabStuTotalscore: TFloatField; 永久性字段对象的访问形式: TabStuName.DisplayLabel:='姓名'; TabStuName.DisplayWidth:=8; Edit1.Text:= TabStuName.Value; TabStuName.Value:= Edit1.Text; 第8章 数据库编程

  43. 8.3.6数据集的字段 6. 字段的数据类型 由于各种数据库字段的数据类型不一,所以Delphi必须针对各个字段不同的数据类型,定义出各种不同数据类型的TField组件,这些组件都从TField组件继承下来的,所以它们所拥有的组件特性几乎都相同。 常用字段对象的类型 第8章 数据库编程

  44. 8.3.6数据集的字段 字段类型之间的主要区别在于:它们内部保留的以及它们和数据库表之间传递的数据类型不一样。字段对象还有一些类似于数据转化的属性。 第8章 数据库编程

  45. 8.3.6数据集的字段 一个字段可以用几种数据类型表示,转换规则如表所示。 以下两条赋值语句中的MyDataSet.Field[i]字段用2种类型表示: s:=MyDataSet.Field[i].AsString; //该字段以字符串表示 i: =MyDataSet.Field[i].AsInteger; //该字段以整数表示 注意:从字段对象中读取字段值时要将它赋给数据类型与之相匹配的变量。 常用类型转换规则举例 第8章 数据库编程

  46. 综合数据源、数据集及字段对象的示例 1)主窗体设计 设计时窗体 第8章 数据库编程

  47. 综合数据源、数据集及字段对象的示例 窗体和组件对象属性表 第8章 数据库编程

  48. 综合数据源、数据集及字段对象的示例 窗体和组件对象属性表 第8章 数据库编程

  49. 综合数据源、数据集及字段对象的示例 2)编写程序代码 // 窗体的OnCreate事件处理代码,完成(1)的功能。 procedure TFormObs.FormCreate(Sender: TObject); begin with TabStu do begin // 使用永久字段TabStuStudentid的属性DisplayLabel TabStuStudentid.DisplayLabel:='学号'; TabStuName.DisplayLabel:='姓名'; TabStuSex.DisplayLabel:='性别'; TabStuBirthday.DisplayLabel:='出生年月'; TabStuDepartmentid.DisplayLabel:='所在系编号'; TabStuTotalscore.DisplayLabel:='总分'; end; end; 第8章 数据库编程

  50. 综合数据源、数据集及字段对象的示例 // 永久字段TabStuSex的OnGetText事件处理代码,完成(2)的功能。 procedure TFormObs.TabStuSexGetText(Sender: TField; var Text: String; DisplayText: Boolean); // 参数Sender代表字段对象 begin if Sender.Value then Text:='男' // 若表中的某个记录的Sex字段值为true,则显示为“男” else Text:='女'; // 若记录的Sex字段值为true,则显示为“女” end; // 永久字段TabStuSex的OnSetText事件处理代码。 // 若由于录入错误,需修改性别时,用布尔值写入数据库中。 procedure TFormObs.TabStuSexSetText(Sender: TField; const Text: String); begin if Text='男' then Sender.Value:=true else Sender.Value:=false; end; 第8章 数据库编程

More Related