⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 037.htm

📁 Delphi基础知识讲座
💻 HTM
📖 第 1 页 / 共 2 页
字号:
<HTML><HEAD><meta http-equiv="Content-Type" content="text/html; charset=GB2312"><TITLE>-->DELPHI基础教程-->第十五章 数据访问部件的应用及编程(二)</TITLE>
<META NAME="keywords" CONTENT=" DELPHI基础教程 第十五章 数据访问部件的应用及编程(二)">
<META NAME="description" CONTENT=" - DELPHI基础教程 - 第十五章 数据访问部件的应用及编程(二)">

<style>
<!--
#page {position:absolute; z-index:0; left:0px; top:0px}
.tt3 {font: 9pt/12pt "宋体"}
.tt2 {font: 12pt/15pt "宋体"}
a {text-decoration:none}
a:hover {color: blue;text-decoration:underline}
-->
</style>
</HEAD>
<body text="#000000" aLink=#9900ff link=#006699 vLink=#006699 background="bg.gif" leftmargin="3" topmargin="3" marginheight="3" marginwidth="3">

<TR>
<TD CLASS="tt3" VALIGN="top" width="8%"  background="bg.gif"><strong><A HREF="038.htm" ><FONT style="FONT-SIZE: 9pt">后一页</font></A><BR>
<A HREF="036.htm" ><FONT style="FONT-SIZE: 9pt">前一页</font></A><BR>

<A HREF="index.html" ><FONT style="FONT-SIZE: 9pt">回目录</font></A><BR>
<A HREF="../../../../../index.htm"><FONT style="FONT-SIZE: 9pt">回首页</font></A><BR>
</strong>
</TD>
<TD class="tt2" background="bg.gif" width="84%"><center><B><FONT style="FONT-SIZE: 16.5pt" COLOR="#FF6666" FACE="楷体_GB2312">第十五章 数据访问部件的应用及编程(二)</FONT></B></center>
<hr color="#EE9B73" size="1" width="94%">
</font><p>15.3.6 数据集部件的事件 </p>
<p>&nbsp;&nbsp;&nbsp; 数据集部件TTable或TQuery具有很多的事件。为这些事件编写相应的程序代码可以进行有效性验证、计算可计算字段的值、确认对数据库表的多种操作等等。这些事件及其描述如表15.4所示。 </p>
<p>表15.4 数据集部件常用的事件</p>
<p>━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━</p>
<p>事 件 描 述</p>
<p>───────────────────────────────────</p>
<p>BeforeOpen,Afteropen 在数据集部件被打开之前/之后被触发</p>
<p>───────────────────────────────────</p>
<p>BeforeClose,Afterclose 在数据集部件被关闭之前/之后被触发</p>
<p>───────────────────────────────────</p>
<p>BeforeInsert,AfterInsert 在数据集部件进入插入状态之前/之后被触发</p>
<p>───────────────────────────────────</p>
<p>BeforeEdit,AfterEdit 在数据集部件被编辑之前/之后被触发</p>
<p>───────────────────────────────────</p>
<p>BeforePost,AfterPost 在数据集部件投寄被修改的记录之前/之后被触发</p>
<p>───────────────────────────────────</p>
<p>BeforeCancel,AfterCancel 在数据集部件取消前一步操作之前/之后被触发</p>
<p>───────────────────────────────────</p>
<p>BeforeDelete,AfterDelete 在数据集部件删除当前记录之前/之后被触发</p>
<p>───────────────────────────────────</p>
<p>OnNewRecord 当建立一条新记录时被触发</p>
<p>───────────────────────────────────</p>
<p>OnCalcFields 当为表中的计算字段计算字段值时被触发</p>
<p>━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ </p>
<p align="center">15.4 TTable部件及应用 </p>
<p>在前一节里我们介绍了数据集部件TTable 和TQuery
的共同的一些属性和方法。TTable部件是Delphi数据库编程中要经常使用的最重要的部件之一,它是数据库应用程序访问数据库时必须使用的数据集部件之一,在这一节里,我们重点介绍TTable部件特有的属性和方法,TTable部件所有的属性、方法和事件都可以在联机帮助中查到。 </p>
<p>15.4.1 TTabel部件主要的属性 </p>
<p>DatabaseName属性和TableName属性:</p>
<p>DatabaseName属性是说明数据库应用程序所操作的数据库的名字,它可以是由BDE定义的数据库的别名、显式说明的数据库文件所在的磁盘路径或者由TDatabase部件定义的一个数据库名。DatabaseName属性常常是一个由BDE定义的数据库的别名。使用由BDE定义的数据库的别名代替数据库实际所在的路径和名字,好处是当实际的数据库存放的位置发生变化时,只需利用BDE简单地设置一下该数据库的别名,而数据库应用程序无需修改。有关BDE的使用请参看BDE的设置应用。TabelName属性用以说明当前TTable部件所连接的实际的数据库表。这两个属性一般都在设计阶段指定,当然在程序运行过程中也可以设置,但是要修改这两个属性时,
必须要在TTabel的Active属性为False时进行,当TTable的Active属性为True时,这两个属性是不能被修改和设置的。</p>
<p>TableType属性:</p>
<p>该属性说明与TTable部件相连接的数据库表的类型。当TableType属性设置成Default时,该属性所说明的数据库表的类型由数据库文件的扩展名决定。</p>
<p>● 若数据库文件的扩展名为.DB或没有扩展名,表的类型是Paradox表</p>
<p>● 若数据库文件的扩展名为.DBF时,表的类型是dBASE表</p>
<p>● 若数据库文件的扩展名为.TXT时,表的类型是ASCII表 </p>
<p>如果TableType属性不设定为Default,那么与TTable
部件相连的数据库表的类型由TableType中的设置的值决定,不用考虑数据库文件的扩展名。</p>
<p>KeyExclusive属性:</p>
<p>该属性的一个作用是说明在数据库表中查找记录时,将记录移到与查找值相匹配的记录处还是将记录指针移到与查找值相匹配的记录后面一条记录处。
该属性是布尔型变量,当它的值为False时(缺省情况下为False),
将记录指针移到相匹配的记录处,为True时,将记录指针移到相匹配记录的后面一条记录处。该属性另一个作用是在表中指定检索范围时,用来说明是否包括满足过滤条件的边界记录。当KeyExclusive的值为False时,检索范围包括边界记录,否则不包括边界记录,有关详细的操作请参看“限定表中记录的检索范围”。</p>
<p>IndexFields属性和IndexFieldsCount属性:</p>
<p>IndexFields的属性值是数据库表中字段名列表,它包含与TTable部件相连的数据库表中的全部索引字希。IndexFieldsCount属性说明表中索引字段的个数。这两个属性值都是只读的,只有在程序运行过程中可用。</p>
<p>IndexName属性和IndexFieldNames属性:</p>
<p>IndexName属性中存放着在建立数据库表时为数据库表定义的所有辅助索引名,它是一个辅助索引名列表,是只读属性。IndexFieldNames属性指定用于数据库表索引排序的字段名,多个字段名之间用分号隔开。例如对Customer.DB表中的客户记录按邮政编码ZipCode和客户号码CustNo排序时可以设定IndexFieldNames的值为:</p>
<p>ZipCode ; CustNo</p>
<p>在IndexFieldNames属性中指定的字段必须存在于相应的数据库表中,否则会导致错误。IndexName和IndexFieldName是互斥的,每次只能指定其中一个属性的值,不能同时为两个属性都指定属性值。</p>
<p>Exclusive属性:</p>
<p>该属性是一个布尔型属性,它标明是否以共享方式打开数据库表,如果Exclusive的值为True,当打开一个数据库表时,其他用户就不能访问该表了,若Exclusive的值为False,将以共享方式打开一个数据库表。
显然不能将其他用户正在访问的表以互斥方式打开(设定Exclusive的值为True)。对于SQL数据库服务器上的数据库表,当以互斥方式被一个用户打开时,其他用户可以读取该表中的数据,但不能修改表中的数据,当然有些数据库服务器不支持这种方式,这要具体参看有关的数据库服务器的文档。</p>
<p>ReadOnly属性和CanModify属性:</p>
<p>这两个属性都是布尔型属性,ReadOnly属性决定用户是否能够对表中的数据进行读写。ReadOnly为True
时,用户只能读取表中的数据,ReadOnly为False时,用户可以读写表中的数据(假设数据库已授权用户能够读写其中的数据库表)。CanModify属性是一个只读属性,用户不能够修改其属性值,它反映了用户对数据库表拥有的实际特权,当ReadOnly为True时CanModify将自动地被置为False,当ReadOnly为False时,如果数据库允许用户对表进行读写时,CanModify为True,否则CanModify为False。当CanModify为False时,数据库表是只读的,但不能将其置成编辑状态或插入状态;当CanModify属性为True时,虽然数据库表对应的数据集部件可以置成编辑和插入状态,但是这并不意味着用户能够插入和修改表中的数据,因为这还要受到其他因素的限制,如用户对SQL数据库服务器的访问权限等的限制。</p>
<p>TTable部件还有其他一些属性请参看联机帮助</p>
<p> </p>
<p>15.4.2 TTable部件的方法及应用</p>
<p> </p>
<p>15.4.2.1 设定数据库表的使用范围</p>
<p> </p>
<p>在我们实际应用中的数据库表中常常存放着大量的数据信息,其中包含着很多的记录,而我们的应用程序可能只需对其中一部分记录进行操作,因此,为应用程序指定一个使用范围就显得特别重要了,为方便有效地指定数据库表的使用范围Delphi为TTable部件提供了下列方法供用户使用:</p>
<p>● SetRangeStart和EditRangeStart方法</p>
<p>● SetRangeEnd和EditRangeEnd方法</p>
<p>● SetRange([Start Values],[End Values])方法</p>
<p>● ApplyRange方法</p>
<p>● CancelRange方法</p>
<p> </p>
<p>1. SetRangeStart方法</p>
<p>用于指定检索范围的起始记录,调用SetRangeStart方法之后,可以为起始记录的一个或多个字段指定相应的字段值。SetRangeEnd方法用于指定检索范围的结束记录,调用SetRangeEnd方法之后,可以为结束记录的一个或多个字段指定相应的字段值。</p>
<p> </p>
<p>2. SetRange方法</p>
<p>SetRange方法包含了SetRangeStart和SetRangeEnd方法的功能,它可以同时指定检索范围的起始和结束记录,起始记录和结束记录的字段值以数组形式送给SetRange,其基本形式是:</p>
<p>SetRange([起始值],[结束值])</p>
<p> </p>
<p>3. ApplyRange方法</p>
<p>根据SetRangeStart,SetRangeEnd或SetRange方法说明的检索范围的起始和结束记录,具体设定一个检索范围,调用ApplyRange方法之后,
应用程序只能对检索范围内的记录进行有关的操作。</p>
<p> <dir>
<p>4. CancelRange方法</p>
</dir>
<p>CancelRange方法的作用与ApplyRange方法的作用是相反的,这是取消为表设定的检索范围,调用CancelRange方法之后应用程序可以对表中全部记录进行有关的操作。</p>
<p>在这里要注意的是:如果我们使用的是paradox表或dBASE表,在调用SetRangeStart,SetRangeEnd以及SetRange方法时,只能为表中的索引字段或定义的索引指定相应的字段值,以设定检索范围。如果使用SQL数据库服务器中的数据库表,可以为IndexFieldNames属性中指定的字段指定相应的字段值。</p>
<p>例如:假设Table1与Customer.DB表相连,Customer.DB中一个索引字段是CustNo,同时应用窗体中有两个编辑框StartVal和EndVal用于输入起始、结束记录的字段CustNo的值,下面的程序代码便可以为我们设定一个检索范围:</p>
<p> </p>
<p>Tabel1.SetRangeStart; {指定检索范围的起始记录}</p>
<p>Tabel1CustNo.AsString:= StartVal.Text {为起始记录的CustNo字段指定字段值}</p>
<p>Tabel1.SetRangeEnd; {指定检索范围的结束记录}</p>
<p>if EndVal.Text &lt;&gt; ' ' then</p>
<p>Tabel1CustNo.AsString := EndVal.Text; {为结束记录的CustNo 字段指定字段值}</p>
<p>Tabel1.ApplyRange; {根据检索范围的起始、结束记录设定检索范围}</p>
<p> </p>
<p>注意上面的程序代码,在为结束记录的CustNo字段指定字段值时,
首先检查EndVal的值是否为空,如果EndVal的值为空,那么设定的检索范围没有包含一条记录,
因为没有任何记录的字段值小于NIL;如果StartVal的值为空,那么检索范围将从表中的第一条记录开始,因为表中任何记录的字段值都大于空(NIL)。</p>
<p>上述代码可以用SetRange方法改写成:</p>
<p> </p>
<p>If EndVal.Text &lt;&gt;' ' then</p>
<p>Tabel1.SetRane([StartVal.Text].[EndVal.Text]);</p>
<p>Table1.ApplyRange;</p>
<p> </p>
<p>EditRangeStart和EditRangeEnd方法的使用完全类似于SetRangeStart和SetRangeEnd方法,只是调这两个方法是设定一个可编辑的范围。</p>
<p>又如:假设一个表中的一个索引包含两个字段LastName和FirstName,我们为索引中的一个字段或多个字段指定相应的字段值,设定数据库表的使用范围。</p>
<p> </p>
<p>Table1.SetRangeStart;</p>
<p>Table1.FieldByName('LastName').Asstring := 'Smith';</p>
<p>Table1.SetRangeEnd;</p>
<p>Tabel1.ApplyRange;</p>
<p> </p>
<p>上述代码设定的范围包括LastName字段的值大于或等于Smith的所有记录。而下面的代码设定的范围则包括LastName字段的值大于或等于Smith且FirstName字段的值大于或等于'J'的记录。</p>
<p> </p>
<p>Table1.SetRangeStart;</p>
<p>Table1.FieldByName('LastName').Asstring := 'Smith';</p>
<p>Table1.FieldByName('FirstName').Asstring := 'J';</p>
<p>Table1.SetRangeEnd;</p>
<p>Tabel1.ApplyRange;</p>
<p> </p>
<p>15.4.2.2 查找数据库表中的记录</p>
<p> </p>
<p>如果想查找数据库表中的记录,必须想指定查找记录的一些字段的字段值,然后在表中进行检索,检索出与查找值相匹配的记录来。如果我们是在Paradox或dBASE数据库中的表中查找记录,那么查找值所对应的字段必须是表中的关键字段或辅助索引字段。如果查找SQL数据库服务器中的表,那么查找值必须是表的IndexFieldNames属性中指定的字段。</p>
<p>Delphi提供了两种方式在数据库表中查找记录:Goto方式和Find方式。这两种方式十分相似,它们的主要区别在于为查找指定查找值的方法不一样。</p>
<p>使用Goto方式进行数据查找使用的方法有SetKey方法、GotoKey方法和GotoNearest方法。其实际步骤如下:</p>
<p> </p>
<p>①确保要查找的字段是关键字段或辅助索引字段。</p>
<p>②调用SetKey方法把与表对应的TTable部件置成查找状态。</p>
<p>③把查找值赋给相应的字段。</p>
<p>④调用GotoKey方法,并测试它的返回值检验查找是否成功。</p>
<p> </p>
<p>假设Table1对应的表中第一个字段是关键字段,Edit1是应用窗体中的一个编辑框,用户可以通过Edit1输入查找值。下面的代码将通过Goto方式进行查找。</p>
<p> </p>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -