查看文章 |
多层数据库开发(八)---:访 问 表 格
2008-09-03 17:34
第八章 访 问 表 格 这一章介绍怎样在数据库应用程序中使用TTable构件。TTable的上级是TDBDataSet,而TDBDataSet是从TBDEDataSet继承下来的,TBDEDataSet又是从TDataSet继承下来的。因此,如果对第六章的内容完全掌握了的话,您应该对TTable构件不感到陌生。 8.1 使用TTable构件的一般步骤 TTable构件可以访问数据库表格中的每一行和每一列。TTable构件既可以访问本地的数据库如Paradox、dBASE、Access、FoxPro,也可以访问ODBC数据库,还可以访问远程数据库如InterBase、Sybase和SQL Server。 既可以显示和编辑表格的所有行和所有列,也可以选择一定范围内的行,或者用过滤技术检索出其中一部分行,可以搜索记录,复制、换名或删除一个表格。 一个TTable构件往往只访问一个表格,不过,如果需要的话,一个TTable构件也可以访问几个表格。 8.1.1 设置TTable构件 下面是使用和设置TTable构件的一般步骤,有些应用程序可能还需要其他步骤。 第一步是把一个TTable构件放到窗体或数据模块上,设置它的Name属性指定构件的名称,不能与同一个应用程序中的其他构件同名。 第二步是设置DatabaseName属性指定要访问的数据库。 第三步是设置TableName属性指定要访问的表。 第四步是把一个TDataSource构件放到窗体或数据模块上,设置它的DataSet属性指定TTable构件 第五步是把一个数据控件如TDBGrid放到窗体上,设置它的DataSource属性指定TDataSource构件。 最后,把TTable构件的Active属性设为True。 8.1.2 指定要访问的数据库 DatabaseName属性用于指定要访问的数据库。对于Paradox和dBASE来说,DatabaseName属性可以设为BDE别名或表的路径。对于SQL数据库来说,DatabaseName属性必须设为BDE别名。 用BDE别名指定数据库的好处是,只要修改别名的定义,就可以访问不同的数据库,而应用程序不必作任何修改。要修改别名的定义,就要用到SQLExplorer。 在修改DatabaseName属性之前,先要把Active属性设为False。 如果用TDatabase构件来管理与数据库的连接,可以把DatabaseName属性设为应用程序专用的别名。 8.1.3 指定要访问的表 TableName属性用于指定要访问的表。在设置TableName属性之前,首先要把Active属性设为False,并且设置DatabaseName属性指定要访问的数据库。 既可以在设计期指定要访问的表,也可以在运行期指定要访问的表,程序示例如下: With OrderOrCustTable Do Begin Active := False; If TableName = 'CUSTOMER.DB' then TableName := 'ORDERS.DB' ElseTableName := 'CUSTOMER.DB'; Active := True; End; 8.1.4 指定表格的类型 如果要访问的数据库是Paradox、dBASE、FoxPro或用逗号隔开的ASCII文本文件,必须设置TableType 属性指定表格的类型。 默认情况下,TableType属性设为ttDefault,BDE将根据文件扩展名来区分表格的类型。扩展名为.DB就认为是Paradox,扩展名为.DBF就认为是dBASE,扩展名为.TXT就认为是ASCII文本,没有扩展名就认为是Paradox。 如果需要确切地指定表格的类型,就必须设置TableType属性,设为ttDefault表示让BDE来判断表格的类型,设为ttParadox表示是Paradox,设为ttDBase表示是dBASE,设为ttFoxPro表示是FoxPro,设为ttASCII表示是ASCII文本。 8.1.5 打开和关闭一个表 要显示和编辑表格中的数据,首先要打开这个表格。要打开一个表格有两种方式,一是把Active属性设为True,二是调用Open。表格打开后,数据集就进入dsBrowse状态。 如果不再需要显示和编辑表格中的数据,或者要修改TTable构件的某些属性如DatabaseName、TableName和TableType,此时就要关闭表格。 要关闭表格也有两种方式,一是把Active属性设为False,二是调用Close函数。表格关闭后,将使数据集进入dsInactive状态。 8.1.6 控制对表格的读写 当一个表格打开后,应用程序需要取得对它读和写的访问权,这就要用到TTable构件的三个属性:CanModify、ReadOnly和Exclusive。 CanModify是一个只读的属性,当一个表格打开后,可以通过这个属性来判断表格的数据是否修改。如果CanModify属性返回False,应用程序就不能修改表格的数据。 如果CanModify属性返回True,应用程序可以修改表格的数据。 如果ReadOnly属性设为False,用户就可以编辑表格的数据。如果要限制用户只能查看数据,不能修改数据,就得把ReadOnly属性设为True。 Exclusive属性用于设置应用程序是否能独占表格。如果要独占对表格的访问权,就在打开表格之前把Exclusive属性设为True,其他应用程序就既不能读也不能写这个表格。 Exclusive属性一般只适用于Paradox、dBASE或FoxPro等本地数据库,对于SQL数据库来说,有的服务器不支持表格级的锁定,有的服务器虽然支持锁定,但其他应用程序仍然可以读表格的数据。 8.2 在表格中搜索记录 要在表格中搜索记录有几种方式,我们推荐调用Locate函数和Lookup函数,这两个函数可以在任何表格中基于任何类型的字段来搜索记录,不管表格是否建立了索引。 Locate函数用于在表格中搜索一条符合特定条件的记录,如果找到的话,就使该记录成为当前记录。 Lookup函数与Locate 函数的区别是,如果找到匹配的记录后,当前记录不变。事实上,Locate函数和Lookup函数并不仅适用于TTable构件,它还适用于其他数据集构件。 8.2.1 基于索引中的字段搜索 记录除了Lookup函数与Locate 函数外,TTable构件还保留了Goto系列和Find系列的方法,这些方法可以基于索引中的字段搜索匹配的记录,并使找到的记录成为当前记录。在Delphi 4中,索引中的字段称为关键字段。 与Locate不同的是,GotoKey、GotoNearest要求表格必须已建立了索引,并且只能基于关键字段搜索记录,而Locate则没有这个要求。下面列出了Goto系列和Find系列中的6种方法: .EditKey使数据集进入dsSetKey状态,程序就可以指定关键字段的值。 .FindKey综合了SetKey和GotoKey两个方法。 .FindNearest综合了SetKey和GotoNearest两个方法。 .GotoKey基于关键字段搜索特定的记录,并使找到的记录成为当前记录。 .GotoNearest类似于GotoKey,但只要近似匹配即可(适合于字符串类型的字段)。 .SetKey使数据集进入dsSetKey状态,程序就可以指定关键字段的值。与EditKey不同的是,如果SetKey没有调用成功,原先的键值被清掉。 其中,GotoKey和FindKey是返回布尔值的函数,如果调用成功,就返回True,并使找到的记录成为当前记录。如果没有找到匹配的记录,这两个函数就返回False。 GotoNearestand和FindNearest分别类似于GotoKey和FindKey,不同的是,如果它们没有找到精确匹配的记录,就查找近似匹配的记录。 8.2.2 Goto系列 使用Goto系列的方法来搜索和定位记录,一般是这么几个步骤: 第一步是设置IndexName属性指定要使用的索引(对SQL数据库来说,需要设置IndexFieldNames属性)。当然,如果使用表格本身的主索引,可以不设置这个属性。 第二步是打开表格。 第三步是调用SetKey使数据集进入dsSetKey状态。 第四步是通过Fields属性或FieldByName函数指定关键字段的值。 第五步是调用GotoKey或GotoNearest查找匹配的记录。 下面的例子实际演示了上述5个步骤: Procedure TSearchDemo.SearchExactClick(Sender: TObject); Begin Table1.SetKey; Table1.Fields[0].AsString := Edit1.Text; If not Table1.GotoKey then ShowMessage('Record not found'); End; 上述例子演示的是GotoKey,其实GotoNearest也是差不多的,程序示例如下: Table1.SetKey; Table1.Fields[0].AsString := 'Sm'; Table1.GotoNearest; 8.2.3 Find系列使用 Find系列的方法来搜索和定位记录,一般是这么几个步骤: 第一步是设置IndexName属性指定要使用的索引(对SQL数据库来说,需要设置IndexFieldNames属性)。当然,如果您使用表格本身的主索引,可以不设置这个属性。 第二步是打开表格。 第三步是调用FindKey或FindNearest函数查找匹配的记录。这两个方法都要传递一个KeyValues参数,用于指定关键字段的值。其中,FindNearest只适合于字符串类型的字段。 8.2.4 KeyExclusive属性和KeyFieldCount属性 调用GotoNearest、FindNearest等函数时,如果KeyExclusive属性设为False,匹配的记录将成为当前记录(如果找到的话); 如果KeyExclusive属性设为True,匹配的记录的下一条记录成为当前记录。 如果一个索引中有多个字段,而您只想基于其中部分字段进行搜索,就要设置KeyFieldCount属性指定关键字段的个数。例如,假设索引中有三个关键字段,而您只想基于其中第一个字段进行搜索,就把KeyFieldCount属性设为1。 如果把KeyFieldCount属性设为2,表示基于前面2个字段进行搜索。如果把KeyFieldCount属性设为3,表示基于前面3个字段进行搜索。但是,如果要基于第一个和第三个字段进行搜索,KeyFieldCount属性无能为力。 8.2.5 基于副索引进行搜索 如果不想基于主索引而想基于副索引进行搜索,就要通过IndexName属性指定索引名称。在设置IndexName属性之前,首先要关闭表格。程序示例如下: Table1.Close; Table1.IndexName := 'CityIndex'; Table1.Open; Table1.SetKey; Table1['City'] := Edit1.Text; Table1.GotoNearest; 对于SQL表来说,可以直接用IndexFieldNames属性指定索引中的字段。对于Paradox和dBASE表来说,必须事先建立索引,而且只能基于 |
最近读者: