Delphi提供了两种方式在数据库表中查找记录Goto方式和Find方式这两种方式十分相似它们的主要区别在于为查找指定查找值的方法不一样
使用Goto方式进行数据查找使用的方法有SetKey方法GotoKey方法和GotoNearest方法其实际步骤如下
①确保要查找的字段是关键字段或辅助索引字段
②调用SetKey方法把与表对应的TTable部件置成查找状态
③把查找值赋给相应的字段
④调用GotoKey方法并测试它的返回值检验查找是否成功
假设Table对应的表中第一个字段是关键字段Edit是应用窗体中的一个编辑框用户可以通过Edit输入查找值下面的代码将通过Goto方式进行查找
TableSetKey; {将Table置成查找状态}
TableField[]AsString := EditText; {指定查找值}
TableGotoKey; {进行查找}
上面最后一行代码是根据用户指定的查找值在表中执行查找查找的结果有两种也许成功也许失败这是由调用GotoKey方法之后返回的布尔值来决定如果返回True那么查找成功并且记录指针会指向与查找值匹配的记录如果返回Fale那么查找失败记录指针的位置不发生变化下面的代码可以测试调用GotoKey方法之后的返回值告知用户查找是否成功
TableSetKey;
TableField[]AsString:= Smith;
If not TableGotoKey then
ShowMessage(记录没找到)
在这一段代码中如果在表中没有找到第一个字段值为Smith的记录该应用程序会弹出一个对话框告知用户记录没有找到
如果在表中存在多个关键字段或辅助索引中包含多个字段时你在进行查找时只想为第一个字段指定查找值那么必须要设置TTable部件的KeyFieldCount的属性值为如果想为多个字段指定查找值只能为相邻的字段指定查找值例如辅助索引中共有三个字段那么我们只能为第一个字段第一和第二个字段第一和第二以及第三个字段指定查找值而不能为第一和第三个字段指定查找值
GotoNearest方法的使用与GotoKey方法完全一样只是它用于不精确查找它不要求查找结果与查找值精确匹配当表中有与查找值精确匹配的记录时它将记录指针移到该记录处当表中没有与查找值精确匹配的记录时它会查找出与查找值最接近的记录并将记录指针移到该记录处
下面是应用GotoNearest方法的一段代码
TableSetKey;
TableFields[]AsString:= Sm;
TableGotoNearest;
执行上述代码后若表中存在第一个字段值等于Sm的记录时记录指针将移到该记录处若表中不存在第一个字段值等于Sm的记录而存在第一个字段值等于Smith的记录那么记录指针会移到该记录处
如果我们不是以数据库表中的关键字段作为查找字段我们也可以为TTable部件的IndexFieldName属性中的字段或IndexName属性中的字段指定查找值进行数据查找例如假设Customer表中有一个名叫CityIndex的辅助索引我们为CityIndex中的字段指定查找值进行查找时首先设置TTable部件的IndexName属性为CityIndex然后再进行查找下面是具体的程序代码
TableIndexName := CityIndex;
TableOpen;
TableSetKey;
TableFieldByName{City)AsString := EditText;
TableGotoKey;
使用Find方式使用Find方式在数据库中进行数据查找的方法有FindNearest方法和FindKey方法
FindKey方法和FindNearest方法为数据查找提供了一个简单的方法它们将SetKey指定查找值执行查找三个步骤融合在一步里完成它们在指定查找值时是把各字段的查找值组成一个数组传给FindKey或FindNearest下面是使FindKey方法的一个例子
假设Tabel对应的表中的第一个字段是关键字段
TableFindKey([EditText])
如果用GotoKey方法完成这一功能则需要编写下面代码
TableSetKey;
TableFields[]AsStrine := EditText;
TableGotoKey;
FindKey方法和FindNearest方法的区别与GotoKey和GotoNearest方法的区别是一样的
创建主要──明细数据库应用
TTable部件中MasterSource属性和MasterFields属性是用于定义两个数据库表的一对多的关系MasterSource属性指定主表对应的TDataSource部件MasterFields属性指定主表和明细表之间建立联系的字段主表和明细表之间建立一对多关系时可能不只是基于一个字段可能有多个字段如果有多个字段那么在说明MasterFields属性时多个字段之间要用分号隔开如TableMasterFields := OrderNo;CustNo在设计阶段可以使用字段连接设计器(Field Link Designer)为两上表创建一对多的关系在Object Inspector 中双击TTable部件的MasterFields便可以打开Field Link Designer进行一对多关系的创建
Field Link Designer提供了一种可视化的方法来创建主要──明细表之间的一对多关系图中Available Indexes组合框中存放着明细表中的关键字段和索引字段可以选择索引字段进行连接在主表中选择一个用于连接的关键字段然后将其与明细表中相应的关键字段连接单击Add按钮主要──明细表的连接字段将显示在Joined Fields列表框中如
CustNo>CustNo
TDataSource部件及其应用
TDataSource部件是开发数据库应用程序中用到的非常重要的部件它是连接数据集部件TTable或TQuery和数据浏览部件的桥梁TDataSource部件本身十分简单它所拥有的属性事件和方法都比较少在使用该部件时无需作太多的工作它主要是为数据浏览部件服务的如果在应用程序中没有使用数据浏览部件我们也没有必要为应用程序设置TDataSource部件
TDataSource部件的属性
TDataSource部件除了其他部件都拥有的Name属性和Tag属性之外主要有下面几个属性
DataSet属性该属性说明TDataSource部件从中获取数据的数据集的名字它可以是TTable部件的名字也可以是TQuery部件的名字甚至还可以指定其他窗体内的数据集作为该属性的值如在下面的程序中我们指定窗体Form中的table作为窗体Form中的DataSource的DataSet属性值
TFormFormcreate(Sender : Tobject)
Begin
DataSourceDataSet := FormTable;
end;
Enable属性Enable属性可以暂时性地切断TDataSource部件和与之相连的数据集部件的连接这是一个布尔型变量当它的值为False时TDataSource部件和数据集部件的连接被切断且所有与TDataSource部件相连的数据浏览部件中将变为一片空白不显示任何数据信息当Enabled的值变为True时TDataSource部件和数据集部件的连接恢复且与TDataSource部件相连的数据浏览部件恢复显示数据不过要实现上述这些功能一般不使用TDataSource部件的Enabled属性而是调用数据集部件的DisableControls方法和EnableControls 方法因为调用这两个方法可以方便地控制与数据集部件相连的所有TDataSource部件以及与TDataSource部件相连的数据浏览部件
AutoEdit属性这是一个布尔型变量它用于说明是否将与TDataSource部件相连的数据集置于编辑状态当AutoEdit的值为True时应用程序运行时与TDataSource相连的数据集部件自动地被设置成编辑状态当用户在与TDataSource部件相连的数据浏览部件中输入新的值时数据集部件中的记录也随之改变如果AutoEdit的值为False用户想通过数据浏览部件或程序修改数据集中的记录必须要调用数据集部件的Edit方法将其置为编辑状态之后才能够进行
[] [] [] []