当前位置:系统之家 > 技术开发教程 > 详细页面

第14章 容易数据库应用的创建及MASTAPP介绍(3)

第14章 容易数据库应用的创建及MASTAPP介绍(3)

更新时间:2022-08-27 文章作者:未知 信息来源:网络 阅读次数:

利用GotoNearest方法执行不精确查找
  窗体中的“不精确查找”按钮的事件处理过程代码如下:

  procedure TForm1.Button1Click(Sender: TObject);

  begin

  with table1 do

  begin

  IndexFieldNames:='Company';

  setkey;

  FieldByName('Company').AsString:=Edit1.text;

  GotoNearest;

  label3.caption:=FieldByName('Company').AsString;

  end;

  end;

   读者可以利用 FindNearest 方法执行上面的不精确查找, 具体使用方法可以参看Findkey方法的使用。

  在上面的例子中要设置table1的IndexFieldNames属性为Company。

  GotoNearest方法进行不精确查找

  14.6 修改数据库中的记录 

   我们掌握了字段对象的概念和如何查找数据库中的记录之后,下面我便可以很方便地修改数据库中现存的记录了,一般来说,在程序中修改数据库中的记录包括下面这些步骤:

  1、在数据库中找到要修改的记录,并将记录指针移至该记录。

  2、调用Edit方法将与数据库表相连的TTable部件设置成编辑状态。

  3、修改一个或多个字段。

  4、调用post方法将修改后的记录写入数据库。

   以上这几个步骤只是概述性的,具体实现时还有很多细节需要留心,我们通过一个例子来演示上面的全过程,以便让读者进一步地了解和掌握修改记录的方法。

   例14.6 我们为四个按钮分别编写了事件处理过程,用来遍历数据库中的记录并对每个客户记录的Company字段进行修改,在程序对记录进行更新操作时窗口中的控件都是无效的,在这个例子中我们还编写了一个简单的异常代码块用来确保在更新过程中出现异常时使控件恢复正常操作。 

  修改数据库记录

  14.6.1 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方法,程序将会陷入无穷的死循环。 

  

  14.6.2 实现异常保护的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语句是实现异常保护。

   有了上述这些概念,我们便可以提供这个例子的一些程序代码,它涉及了所有这些内容。

  程序清单:修改数据库中的记录 

  unit Unit26;

  interface 

  uses

  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls, Grids, DBGrids, ExtCtrls, DB, DBTables, Buttons; 

  type

  TForm1 = class(TForm)

  DataSource1: TDataSource;

  customerTable: TTable;

  Panel1: TPanel;

  DBGrid1: TDBGrid;

  Panel2: TPanel;

  UpperCaseFirstAddBtn: TButton;

  UpperCaseSecondAddBtn: TButton;

  MixedCaseFirstAddBtn: TButton;

  MixedCaseSecondAddBtn: TButton;

  BitBtn1: TBitBtn;

  procedure ForceCase(TargetField:String;ToUpper:Boolean);

  procedure UpperCaseFirstAddBtnClick(Sender: TObject);

  procedure MixedCaseFirstAddBtnClick(Sender: TObject);

  procedure UpperCaseSecondAddBtnClick(Sender: TObject);

  procedure MixedCaseSecondAddBtnClick(Sender: TObject);

  procedure FormCreate(Sender: TObject);

  private

  { Private declarations }

  public

  { Public declarations }

  end; 

  var

  Form1: TForm1; 

  implementation

  const

  upper=true;

  Mixed=False; 

  {$R *.DFM}

  Function IsUpper(ch:char):Boolean;

  begin

  If (ch>='A')and(ch<='z')then>

  IsUpper:=true

  else

  IsUpper:=False;

  end;

  procedure TForm1.ForceCase(TargetField:String;ToUpper:Boolean);

  var

  WorkBuffer:string;

  i:Integer;

  begin

  with customerTable do

  begin

  DisableControls;

  TRY

  First; {将记录指针移到第一条记录处 }

  While not EOF do

  begin

  WorkBuffer:=FieldByName(TargetField).AsString;

  If ToUpper then

  for i:=1 to Length(WorkBuffer)do

  WorkBuffer[i]:=UpCase(WorkBuffer[i])

  else

  begin

  for i:=1 to Length(WorkBuffer) do

  If IsUpper(WorkBuffer[i]) then

  WorkBuffer[i]:=chr(ord(WorkBuffer[i])+32);

  WorkBuffer[1]:=UpCase(WorkBuffer[1])

  end;

  Edit;

  FieldByName(TargetField).AsString:=WorkBuffer;

  post;

  Next;

  end;

  Finally

  enableControls;

  end;

  end;

  end; 

  procedure TForm1.UpperCaseFirstAddBtnClick(Sender: TObject);

  begin

  ForceCase('Addr1',Upper);

  end; 

  procedure TForm1.MixedCaseFirstAddBtnClick(Sender: TObject);

  begin

  ForceCase('Addr1',Mixed);

  end;

  

  procedure TForm1.UpperCaseSecondAddBtnClick(Sender: TObject);

  begin

  ForceCase('Addr2',Upper);

  end;

  

  procedure TForm1.MixedCaseSecondAddBtnClick(Sender: TObject);

  begin

  ForceCase('Addr2',Mixed);

  end;

  

  procedure TForm1.FormCreate(Sender: TObject);

  begin

  customerTable.open;

  end; 

  end. 

[1] [2]  下一页

温馨提示:喜欢本站的话,请收藏一下本站!

本类教程下载

系统下载排行