數(shù)據(jù)輸入是開發(fā)數(shù)據(jù)庫程序的必然環(huán)節(jié)。在Client/Server結(jié)構(gòu)中,客戶端可能要輸入一批數(shù)據(jù)后,再向服務(wù)器的后臺數(shù)據(jù)庫提交,這就需要在本地(客戶端)建立臨時數(shù)據(jù)表來存儲用戶輸入的數(shù)據(jù),待提交后,清除本地數(shù)據(jù)表。這種方法的好處是:提高輸入效率,減小網(wǎng)絡(luò)負(fù)擔(dān)。
由于用戶一次輸入的數(shù)據(jù)量一般情況下較小(不會超過幾百條記錄),所以臨時表可以建立在內(nèi)存中,這樣處理速度較快。臨時表創(chuàng)建有如下兩種方法:
1.使用查詢控件創(chuàng)建臨時表 第1步:在窗體上放入查詢控件(TQuery),并設(shè)置好所連接的數(shù)據(jù)表。 第2步:添加如下語句: TQuery. CachedUpdates=True; TQuery. RequestLive=True。 第3步:在原有的SQL語句后加入一條Where子語句,要求加入這條Where子語句后SQL查詢結(jié)果為空。 例如: SELECT Biolife."Species No", Category, Common_Name, Biolife."Species Name", Biolife."Length (cm)", Length_In, Notes, Graphic FROM "biolife.db" Biolife where Biolife.Category=′A′ and Biolife.Category=′B′ 這樣臨時表就建立好了。 2.使用代碼創(chuàng)建臨時表 函數(shù)代碼如下: function CreateTableInMemory(const AFieldDefs:TFieldDefs): TDataSet; var TempTable:TClientDataSet; begin TempTable:=nil; Result:=nil; if AFieldDefs〈〉nil then begin try TempTable:=TClientDataSet.Create(Application); TempTable.FieldDefs.Assign(AFieldDefs); TempTable.CreateDataSet; Result:=(TempTable as TDataSet); Except if TempTable〈〉nil then TempTable.Free; Result:=nil; raise; end end end; 在程序中按如下方法調(diào)用: procedure TForm1.Button1Click(Sender: TObject); var ADataSet:TDataSet; begin ADataSet:=TDataSet.Create(Self); with ADataSet.FieldDefs do begin Add(′Name′,ftString,30,False); Add(′Value′,ftInteger,0,False); end; with DataSource1 do begin DataSet:=CreateTableInMemory(ADataSet.FieldDefs); DataSet.Open; end; ADataSet.Free; end; 這樣,臨時表就創(chuàng)建完成。 方法1使用簡單,但由于利用了查詢控件,清空數(shù)據(jù)時需要查詢服務(wù)器后臺數(shù)據(jù)庫,所以速度稍慢,而且不適用于臨時表中各個字段由幾個數(shù)據(jù)表的字段拼湊而成的情況。方法2適用范圍廣、速度快,但需要編寫代碼。
|