一、數據庫別名(Alias)的地位
Delphi內建的數據庫引擎BDE(Borland Database Engine),提供了強大的數庫處理功能,BDE是Delphi數據庫功能的核心部分。
以只有單機使用的本地數據庫為例,Delphi程序可以直接通過BDE來控制數據庫數據的存取。這種存取控制是以配置好BDE參數為前提的,具體的來說是正確設置了數據庫的別名(Alias),Delphi的最常用的數據庫訪問組件TTable,其屬性DataBaseName即為已經定義的數據庫別名,在沒有定義數據庫別名的情況下,是不能訪問具體的數據庫表格的。因此,在建立數據庫表格時,必須有兩個過程:一是通過BDE檢測相應的數據庫別名是否存在,假如不存在,則應首先建立相應的數據庫別名;二是檢測該數據庫別名(即DataBaseName)中是否存在需要建立的數據庫表格,假如不存在,才建立之。這樣,才能保護原有表格的數據不丟失。
二、session組件: Delphi數據庫程序與BDE的接口
Delphi自動為數據庫應用程序提供了一個Session組件,這個Session組件是應用程序與BDE接口的要害。下面是Session組件關於BDE接口的幾個過程的原型說明。
1.GetAliasNames(list:Tstrings);將當前BDE配置中的所有數據庫別名的名稱存放到List字符串列表中。
2.AddStandardAlias(const Name, Path, DefaultDriver: string);增加一個標準類型的數據庫別名。例如增加一個名為Cntssamp,缺省數據庫驅動程序為PARADOX、存放路徑為c:/delphp11的別名:
Session.AddStandardAlias(Cntssamp,c:/delphp11,Paradox);
3.GetTableNames(const DatabaseName, Pattern: string; Extensions,SystemTables: Boolean; List: TStrings);可將指定數據庫別名中所有表格的名稱存放到List字符串列表中。
4.SaveConfigFile; 將BDE配置存盤。
另外,用List.IndexOf(指定串)的值判定字符串列表中是否有需要的字符串,來決定是否應建立新的數據庫別名和數據庫表格。
三、一個實例
在Form1.FormCreate事件中寫入如下代碼,程序啟動時,將自動檢測是否存在數據庫別名Cntssamp,假如沒有則建立之;自動檢測別名Cntssamp中是否存在表格TSK(圖書庫),假如沒有則自動建立表格TSK。
PRocedure TForm1.FormCreate(Sender: TObjec
var
ap:TStringList; {字符串列表變量}
answer:Integer;
begin
ap:=TStringlist.Create;
Session.GetAliasNames(ap); {取得別名列表}
if (ap.IndexOf(Cntssamp)=-1) then {判定別名是否存在}
begin
answer:=application.MessageBox(別名Cntssamp不存在,現在創建嗎?,BDE信息窗口,mb—OKCancel);{增加一個名為Cngzsamp的數據庫別名}
if answer=IDCANCEL then
begin
ap.Free;
Exit;
end;
Session.AddStandardAlias(Cntssamp,c:/delphp11,Paradox);
Session.SaveConfigFile; {BDE配置文件存盤}
end ;
ap.Clear; {取得別名Cngzsamp中的所有表格名稱列表}
Session.GetTableNames(Cntssamp,,False,False,ap);
if (ap.IndexOf(TSK)=-1) then {判定表格是否存在}
begin
answer:=Application.MessageBox(別名Cntssamp中不存在表格TSK,現在創建嗎?,表格信息窗口,mb—OKCancel);
if answer=IDCANCEL then
ap.Free;
Exit;
end;
with table1 do
begin
Active:=false;
DatabaseName:=Cntssamp; {數據庫別名}
TableName:=TSK; {表格名}
TableType:=ttParadox; {數據庫類型}
with FieldDefs do
begin {增加字段}
Clear;
Add(SH,ftString,30,False); {書號String(30)}
Add(SM,ftString,30,False); {書名String(30)}
Add(CBS,ftString,20,False); {出版社String(20)}
Add(CBRQ,ftDate,0,False); {出版日期Date}
Add(YS,ftInteger,0,False); {頁數Integer}
end;
with IndexDefs do
begin {增加索引}
Clear; {按書號字段建立主索引}
Add(SHSY,SH,[Primary,ixUnique]);
end;
CreateTable; {創建表格}
end;
end ;
ap.free; {釋放變量ap}
end;