利用GotoNearest方法执行不精确查找
窗体中的不精确查找按钮的事件处理过程代码如下
procedure TFormButtonClick(Sender: TObject)
begin
with table do
begin
IndexFieldNames:=Company;
setkey;
FieldByName(Company)AsString:=Edittext;
GotoNearest;
labelcaption:=FieldByName(Company)AsString;
end;
end;
读者可以利用 FindNearest 方法执行上面的不精确查找 具体使用方法可以参看Findkey方法的使用
在上面的例子中要设置table的IndexFieldNames属性为Company
GotoNearest方法进行不精确查找
修改数据库中的记录
我们掌握了字段对象的概念和如何查找数据库中的记录之后下面我便可以很方便地修改数据库中现存的记录了一般来说在程序中修改数据库中的记录包括下面这些步骤
在数据库中找到要修改的记录并将记录指针移至该记录
调用Edit方法将与数据库表相连的TTable部件设置成编辑状态
修改一个或多个字段
调用post方法将修改后的记录写入数据库
以上这几个步骤只是概述性的具体实现时还有很多细节需要留心我们通过一个例子来演示上面的全过程以便让读者进一步地了解和掌握修改记录的方法
例 我们为四个按钮分别编写了事件处理过程用来遍历数据库中的记录并对每个客户记录的Company字段进行修改在程序对记录进行更新操作时窗口中的控件都是无效的在这个例子中我们还编写了一个简单的异常代码块用来确保在更新过程中出现异常时使控件恢复正常操作
修改数据库记录
Edit方法Post方法
为了能让用户通过程序修改数据库表中的记录TTable部件必须要处在编辑状态下在大多数情况下数据库表都是以浏览(只读方式)方式打开的也就是说它的每一个字段可以被读取介不能被编辑修改调用Edit 方法能够将 TTable 部件置成编辑状态 当TTable部件处于编辑状态后我们才可以通过程序修改当前记录指针所指向的记录但这样修改后的记录不会立即被写入到磁盘上的实际数据库表中要想保存对记录的修改必须要调用Post方法Post方法才真正将我们对记录的修改写入实际的数据库表中
一般来说用来扫描整个数据库表并修改每个记录的某一个字段的程序如下所示
with Table Do
begin
DisableControls;{在修改记录的过程中使其它部件无效}
First; {将记录指针指向第一条记录}
while not EOF do
begin
<读取记录的一个字段值到一个变量中>
<做适当的修改>
Edit; {将TTable部件置成编辑状态}
<将修改后的字段值写回到其对应的字段>
post; {将修改后的记录写回数据库}
next; {修改下一条记录}
end;
enablecontrols; {恢复其它部件的功能}
end;
程序都是对TTable部件进行操作因此使用With语句来防止错误的扩散是很有意义的在这里要注意Disablecontrols方法和EnableControls方法的使用DisableControls方法是在程序修改TTable部件中的记录时切断TTable部件与数据访问部件TDatasource 部件的联系否则在对TTable中的每一修改之后TDataSource 部件都会更新窗体中所有数据浏览部件的显示内容这样会急剧减慢处理过程而且浪费时间EnableControls方法是与DisableControle方法执行相反的操作它是用来恢复TTable部件与TDatasource部件的联系并促使所有的数据浏览部件更新显示
调用First方法是将记录指针移到数据库表中的第一条记录确保程序从表中的第一条记录开始进行修改调用Next方法是将记录指针从当前的记录移到下一条记录这样保证了从表中的第一条记录开始逐条记录进行修改直到修改完最后一条记录如果不调用Next方法程序将会陷入无穷的死循环
实现异常保护的TRY…FINALLY语句
上面的程序存在着潜在的危险在实际应用过程中可能因为某些原因使得对数据库表的更新不能进行下去如当程序试图执行Post方法将修改后的记录写回磁盘时而又因为某种原因磁盘没有准备好这时便出现了异常当出现异常时应用程序会暂停下来并且会弹出一对话框显示有关的错误信息在用户单击错误信息对话框之后程序将继续执行到某一个地方去而这个地方常常不是用户所能预料到的在我们的程序中 在执行Post方法之前窗体中所有的部件与TTable部件都已失去联系因此这种异常将导致窗体中显示的数据和数据库无关
Object Pascal中的Try…Finally语句为我们解决上述异常问题提供了一个解决方法在Delphi中仍然采用了这一语句用来处理异常问题实际上Try…Finally 语句是把两组语句组合在一起语句的Try部分包含了可能产生异常的程序代码Finally部分包含了即使发生了异常也必须执行的一条或多条语句在本例中 Finally 部分只包含了EnableControls方法调用这一条语句我们将前面的代码改写并组合进Try…Finally 语句
with Table Do
begin
DisableControls;{在修改记录的过程中使其它部件无效}
Try;
First; {将记录指针指向第一条记录}
while not EOF do
begin
<读取记录的一个字段值到一个变量中>
<做适当的修改>
Edit; {将TTable部件置成编辑状态}
<将修改后的字段值写回到其对应的字段>
post; {将修改后的记录写回数据库}
next; {修改下一条记录}
end;
enablecontrols;
Finally;{出现异常时执行下面的程序}
enablecontrols; {恢复其它部件的功能}
end; {结束Try…Finally语句}
end;
在保留字Try和Finally之间的代码跟前面的代码是一样的它们用于在记录之间移动记录指针并处理对记录的修改这一段代码可能会出现异常当异常发生时我们想保证执行EnableControls以便窗体中各控件恢复与 TTable 部件的联系 因此我们必须将EnableControls语句放在Finally和结束语句End之间
在这里要特别注意请读者们不要混淆了Try…Finally语句和Try…Except 语句如果真正想在发生异常时采取相应的处理就要使用Try…Except语句Try… Finally语句只是用来处理当异常出现时使应用程序执行Finally部分的语句使程序继续执行下去Try…Except语句是实现异常处理Try…Finally语句是实现异常保护
有了上述这些概念我们便可以提供这个例子的一些程序代码它涉及了所有这些内容
[] [] [] []