用Delphi 開(kāi)發(fā)數(shù)據(jù)庫(kù)程序經(jīng)驗(yàn)三則
發(fā)布時(shí)間:2008-08-15 閱讀數(shù): 次 來(lái)源:網(wǎng)樂(lè)原科技
1.建立臨時(shí)表
數(shù)據(jù)輸入是開(kāi)發(fā)數(shù)據(jù)庫(kù)程序的必然環(huán)節(jié)。在Client/Server結(jié)構(gòu)中,客戶端可能要輸入一批數(shù)據(jù)后,再向服務(wù)器的后臺(tái)數(shù)據(jù)庫(kù)提交,這就需要在本地(客戶端)建立臨時(shí)數(shù)據(jù)表來(lái)存儲(chǔ)用戶輸入的數(shù)據(jù),待提交后,清除本地表數(shù)據(jù)。這種方法的好處是:提高輸入效率,減小網(wǎng)絡(luò)負(fù)擔(dān)。
由于用戶一次輸入的數(shù)據(jù)量一般情況下較?。ú粫?huì)超過(guò)幾百條記錄),所以臨時(shí)表可以建立在內(nèi)存中,這樣處理速度較快。
方法1:使用查詢控件(TQuery)
第1步:在窗體上放上查詢控件(TQuery),設(shè)置好所連接的數(shù)據(jù)表。
第2步:使TQuery. CachedUpdates=True;
TQuery. RequestLive=True
第3步:在原有的SQL語(yǔ)句后加入一條Where子語(yǔ)句,要求加入這條Where子語(yǔ)句后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′
這樣臨時(shí)表就建立完成了。
方法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;
在程序中按如下方法使用:
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;
臨時(shí)表創(chuàng)建完成。
方法1使用簡(jiǎn)單,但由于利用查詢控件,清空數(shù)據(jù)時(shí)需要查詢服務(wù)器后臺(tái)數(shù)據(jù)庫(kù),所以速度稍慢,而且不適用于臨時(shí)表中各個(gè)字段由數(shù)個(gè)數(shù)據(jù)表的字段拼湊而成的情況。方法2適用范圍廣、速度快,但需要編寫代碼。(代碼中TFieldDefs的使用方法十分簡(jiǎn)單,見(jiàn)Delphi的聯(lián)機(jī)幫助)。
2.配置數(shù)據(jù)引擎(BDE、SQL Link)
有關(guān)數(shù)據(jù)庫(kù)程序分發(fā)時(shí),需要攜帶數(shù)據(jù)引擎(BDE、SQL Link),并且在客戶端安裝完程序后還需要配置數(shù)據(jù)引擎,如用戶名(username)、密碼(Password)等等。如果手工配置的話,工作量比較大(根據(jù)客戶機(jī)數(shù)量而定)。而InstallShield For Delphi又好像沒(méi)有這方面的選項(xiàng),其實(shí)InstallShield For Delphi可以做到,在生成安裝程序的目錄里有一個(gè)*.iwz的文本文件,只要在[IDAPI Alias]片段中手工加入即可。 例如:
[IDAPI Alias]
usesname=SYSDBA
password=masterkey
安裝程序后數(shù)據(jù)引擎自動(dòng)配置完畢。
3.在InterBase數(shù)據(jù)庫(kù)中使用函數(shù)
程序員可能在用InterBase作為后臺(tái)數(shù)據(jù)庫(kù)時(shí),會(huì)為其提供的函數(shù)過(guò)少而感到不方便(只有四個(gè)),無(wú)法方便地編寫出復(fù)雜的存儲(chǔ)過(guò)程。InterBase本身無(wú)法編寫函數(shù),但它可以使用外部函數(shù)(調(diào)用DLL中的函數(shù))。下例中說(shuō)明如何在InterBase 中聲明SUBSTR函數(shù)。
DECLARE EXTERNAL FUNCTION SUBSTR
CSTRING(80), SMALLINT, SMALLINT
RETURNS CSTRING(80)
ENTRY_POINT ″IB_UDF_substr″ MODULE_NAME ″ib_udf″
其中:MODULE_NAME為DLL的名稱,ENTRY_POINT為函數(shù)名。
聲明后便可以使用,例如:
select SUBSTR(country)
from country
本例使用的是Delphi安裝時(shí)自帶的IBLocal數(shù)據(jù)庫(kù)。用戶也可以自己編寫函數(shù)來(lái)擴(kuò)充InterBase。