14.7 插入和刪除記錄
雖然我們使用DBD或者在應用程序窗體中用TDBNavigator可以插入、刪除表中的記錄,但是任何重要的數據庫應用程序都是根據最終用戶的命令完成此類操作的。同樣,如果我們掌握了字段對象及其用法,修改數據庫中的記錄,插入和刪除記錄將變得非常容易。
要想刪除表中的某一條記錄,首先將記錄指針移到該記錄處,然後調用delete方法,這樣,當前指針所在的記錄就會被刪除,而且我們在進行刪除操作時,不必將TTable部件設置成編輯狀態。當前指針所在的記錄被刪除之後,被刪除記錄下面的所有記錄都向前移動,記錄指針自動移到緊挨著被刪除的記錄的下一條記錄。在刪除記錄的過程中沒有提醒用戶是否真的想刪除當前記錄的信息確認框,因此在進行此項操作時要倍加小心,如果是開發應用程序,最好的辦法是提供一個確認信息框確保用戶不會意外刪除記錄。
插入一條記錄也很簡單,Delphi為用戶提供兩種方法用來插入記錄到現存數據庫表中,一種方法是在當前記錄指針所在的記錄處插入記錄;另一種方法是在數據庫表的尾部插入記錄。這兩種方法是分別調用Insert方法和Append方法實現的。但是無論是調用Insert方法還是調用Append方法在具有索引的數據庫表中插入記錄,增加到索引表中的記錄都將按照索引順序寫入到數據庫表中,也就是說對於索引表,調用Insert和Append方法的效果是一樣的。事實上,Append方法只適用於那些沒有索引的表,這種沒有索引的表並不十分有用因而通常不創建這種表。幾乎任何情況下我們都是用Insert方法來插入記錄。
用戶在插入記錄時一般可以采用兩種方式插入:逐步插入即首先建立一條空記錄,然後再填充記錄的各個字段,最後再將記錄寫回到磁盤,共分三個獨立的操作步驟;而使用InsertRecord方法便可以一次將插入記錄的操作完成。
14.7.1 逐步插入方法
逐步插入方法分為三個明確的步驟:先調用TTable部件的Insert方法在TTable中創建一條新的空記錄,然後填充該記錄的各個字段,最後調用post方法把新記錄寫到磁盤上的實際數據庫文件中,在填充並傳送記錄以前,考慮插入記錄到表中的什麼位置是毫無意義的,假設插入的表是有索引的,在調用post方法時,Delphi會自動地把插入的新記錄按照索引順序插入到表中的正確位置。如果插入的表中沒有索引,那麼新記錄將插入到當前指針所在記錄的後面。
因此,采用逐步插入方法插入記錄的程序代碼一般如下形式:
With Table do
begin
Insert; {插入一條空白記錄}
<填充該記錄的各個字段>
post; {將插入的記錄寫回到磁盤文件}
end;
對於沒有索引的數據庫表,可以用Append方法替代Insert方法把新記錄插入到表的尾部。
14.7.2 調用InsertRecord插入記錄
對於簡單的應用程序,Delphi允許用戶用一條語句插入一個新記錄,而且這個新記錄可以帶有任意多個新字段值。InsertRecord方法把新記錄中字段的賦值語句和psot方法調用組合進一條語句中。
InsertRecord方法把記錄的各個字段值組合成一個字段值數組作為它的唯一參數。在字段值數組中,可以為插入的記錄的每個字段提供一個字段值,或從最左一列開始依次為任意多個字段賦值。也就是說用戶可以從表的最左邊一列起, 把多個列的值同時傳遞給InsertRecord,直到所有字段都被賦值。用戶也可以省略後面的字段,InsertRecord會用空值填充這些沒有賦值的字段。用戶還可以對那些明確希望用空值填充的字段傳遞保留字NIL來標明該字段為空。
如我們希望在Customer.DB表中插入一條記錄,可以用下面的代碼來實現:
InsertRecord(['2000',NIL,NIL,NIL]);
在上面的程序代碼中,我們只填充了四個字段:CustNo、Company、Add1 、 Add2 。InsertRecord會自動將其它字段賦以空值。
例14.7 在這個例子中,我們在CustNo.DB表中插入和刪除記錄,都是在程序中完成這類操作的,而不再是使用DBD或數據浏覽部件完成。
插入/刪除記錄
程序清單:
unit tt;
interface
uses
SysUtils, Windows, Messages, Classes, Graphics, Controls,
StdCtrls, Forms, DBCtrls, DB, DBGrids, Buttons, DBTables, Grids,
ExtCtrls,Mask,Dialogs;
type
TForm1 = class(TForm)
DBGrid1: TDBGrid;
DBNavigator: TDBNavigator;
Panel1: TPanel;
DataSource1: TDataSource;
Panel2: TPanel;
customerTable: TTable;
BitBtn1: TBitBtn;
Label1: TLabel;
Label2: TLabel;
BitBtn2: TBitBtn;
BitBtn3: TBitBtn;
CustNoEdit: TEdit;
CompEdit: TEdit;
procedure FormCreate(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure BitBtn3Click(Sender: TObject);
procedure FormActivate(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
customerTable.Open;
end;
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
If (Length(CustNoEdit.text)=0)and
(Length(CompEdit.text)=0)
then
MessageDlg('沒有輸入新記錄的字段值!',mtError,[mbCancel],0)
else
with customerTable do
begin
IndexFieldNames:='CustNo';
If FindKey([CustNoEdit.text]) then
MessageDlg('已經存在這條記錄!',mtError,[mbCancel],0)
else
InsertRecord([StrToInt(CustNoEdit.text),CompEdit.text,nil]);
CustNoEdit.text:=' ';
CompEdit.text:=' ';
end;
end;
procedure TForm1.BitBtn3Click(Sender: TObject);
begin
If (Length(CustNoEdit.text)=0)and
(Length(CompEdit.text)=0)
then
MessageDlg('沒有輸入刪除的記錄的字段值!',mtError,[mbCancel],0)
else
with customerTable do
begin
IndexFieldNames:='CustNo';
If FindKey([CustNoEdit.text]) then
begin
If MessageDlg('你確定要刪除這條記錄嗎?',mtConfirmation,
[mbYes,mbno],0)=mrYes then Delete;
end
else
MessageDlg('沒有你要刪除的記錄!',mtError,[mbCancel],0);
CustNoEdit.text:=' ';
CompEdit.text:=' ';
end;
end;
procedure TForm1.FormActivate(Sender: TObject);
begin
CustNoEdit.setfocus;
end;
end.