14.7 插入和刪除記錄
雖然我們使用DBD或者在應(yīng)用程序窗體中用TDBNavigator可以插入、刪除表中的記錄,但是任何重要的數(shù)據(jù)庫應(yīng)用程序都是根據(jù)最終用戶的命令完成此類操作的。同樣,如果我們掌握了字段對象及其用法,修改數(shù)據(jù)庫中的記錄,插入和刪除記錄將變得非常容易。
要想刪除表中的某一條記錄,首先將記錄指針移到該記錄處,然后調(diào)用delete方法,這樣,當(dāng)前指針?biāo)诘挠涗浘蜁粍h除,而且我們在進(jìn)行刪除操作時,不必將TTable部件設(shè)置成編輯狀態(tài)。當(dāng)前指針?biāo)诘挠涗洷粍h除之后,被刪除記錄下面的所有記錄都向前移動,記錄指針自動移到緊挨著被刪除的記錄的下一條記錄。在刪除記錄的過程中沒有提醒用戶是否真的想刪除當(dāng)前記錄的信息確認(rèn)框,因此在進(jìn)行此項(xiàng)操作時要倍加小心,如果是開發(fā)應(yīng)用程序,最好的辦法是提供一個確認(rèn)信息框確保用戶不會意外刪除記錄。
插入一條記錄也很簡單,Delphi為用戶提供兩種方法用來插入記錄到現(xiàn)存數(shù)據(jù)庫表中,一種方法是在當(dāng)前記錄指針?biāo)诘挠涗浱幉迦胗涗?另一種方法是在數(shù)據(jù)庫表的尾部插入記錄。這兩種方法是分別調(diào)用Insert方法和Append方法實(shí)現(xiàn)的。但是無論是調(diào)用Insert方法還是調(diào)用Append方法在具有索引的數(shù)據(jù)庫表中插入記錄,增加到索引表中的記錄都將按照索引順序?qū)懭氲綌?shù)據(jù)庫表中,也就是說對于索引表,調(diào)用Insert和Append方法的效果是一樣的。事實(shí)上,Append方法只適用于那些沒有索引的表,這種沒有索引的表并不十分有用因而通常不創(chuàng)建這種表。幾乎任何情況下我們都是用Insert方法來插入記錄。
用戶在插入記錄時一般可以采用兩種方式插入:逐步插入即首先建立一條空記錄,然后再填充記錄的各個字段,最后再將記錄寫回到磁盤,共分三個獨(dú)立的操作步驟;而使用InsertRecord方法便可以一次將插入記錄的操作完成。
14.7.1 逐步插入方法
逐步插入方法分為三個明確的步驟:先調(diào)用TTable部件的Insert方法在TTable中創(chuàng)建一條新的空記錄,然后填充該記錄的各個字段,最后調(diào)用post方法把新記錄寫到磁盤上的實(shí)際數(shù)據(jù)庫文件中,在填充并傳送記錄以前,考慮插入記錄到表中的什么位置是毫無意義的,假設(shè)插入的表是有索引的,在調(diào)用post方法時,Delphi會自動地把插入的新記錄按照索引順序插入到表中的正確位置。如果插入的表中沒有索引,那么新記錄將插入到當(dāng)前指針?biāo)谟涗浀暮竺妗?/P>
因此,采用逐步插入方法插入記錄的程序代碼一般如下形式:
With Table do
begin
Insert; {插入一條空白記錄}
<填充該記錄的各個字段>
post; {將插入的記錄寫回到磁盤文件}
end;
對于沒有索引的數(shù)據(jù)庫表,可以用Append方法替代Insert方法把新記錄插入到表的尾部。
14.7.2 調(diào)用InsertRecord插入記錄
對于簡單的應(yīng)用程序,Delphi允許用戶用一條語句插入一個新記錄,而且這個新記錄可以帶有任意多個新字段值。InsertRecord方法把新記錄中字段的賦值語句和psot方法調(diào)用組合進(jìn)一條語句中。
InsertRecord方法把記錄的各個字段值組合成一個字段值數(shù)組作為它的唯一參數(shù)。在字段值數(shù)組中,可以為插入的記錄的每個字段提供一個字段值,或從最左一列開始依次為任意多個字段賦值。也就是說用戶可以從表的最左邊一列起, 把多個列的值同時傳遞給InsertRecord,直到所有字段都被賦值。用戶也可以省略后面的字段,InsertRecord會用空值填充這些沒有賦值的字段。用戶還可以對那些明確希望用空值填充的字段傳遞保留字NIL來標(biāo)明該字段為空。
如我們希望在Customer.DB表中插入一條記錄,可以用下面的代碼來實(shí)現(xiàn):
InsertRecord(['2000',NIL,NIL,NIL]);
在上面的程序代碼中,我們只填充了四個字段:CustNo、Company、Add1 、 Add2 。InsertRecord會自動將其它字段賦以空值。
例14.7 在這個例子中,我們在CustNo.DB表中插入和刪除記錄,都是在程序中完成這類操作的,而不再是使用DBD或數(shù)據(jù)瀏覽部件完成。
插入/刪除記錄
程序清單:
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('已經(jīng)存在這條記錄!',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.
相關(guān)推薦:2010年9月計算機(jī)等級考試試題及答案解析專題北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |