使用COM擴充DELPHI資料庫功能 |
|
jackkcg
站務副站長 ![]() ![]() ![]() ![]() ![]() 發表:891 回覆:1050 積分:848 註冊:2002-03-23 發送簡訊給我 |
此為轉貼資料 使用COM擴充DELPHI資料庫功能 Delphi是一個非常優秀的語言和開發環境,具有編譯速度快、面向物件、全面支援Windows API、支援COM和強大的資料庫支援,特別是在Delphi 5中增加了對ADO(Microsoft ActiveX Data Objects)的支援,使得Delphi程式師可以徹底擺脫BDE,縮小軟體分發的體積。但是Delphi的ADO元件不支援ActiveX Data Objects Extensions for Data Definition Language and Security(ADOX、ADO的擴展,用於創建、修改和刪除模式物件,如表格和過程;操作安全物件,可用於維護用戶和組,以及授予和撤消物件的許可權) 和Jet and Replication Objects(JRO,用於對Jet資料庫引擎添加壓縮、同步複製等特徵),這些功能在開發Access資料庫往往比較重要。不過由於ADOX、JRO乃至ADO都是基於COM(Component Object Model,元件物件模型)的,可以調用COM來來實現這些功能。下面我將討論這方面問題,以此?磚引玉,和大家共同研究。
一、關於COM的一些基本概念。
COM物件(COM object)是實現某一特殊功能的二進位碼,包括實現功能的一些方法,這些方法通過COM介面(COM interfaces)被訪問。但是你不能直接訪問COM介面,你可以通過COM類(COM class)來操作COM介面。
二、引用ADOX和JRO。
開發平臺或用戶端需要安裝MDAC 2.1資料庫引擎,你可以從微軟公司http://www.microsoft.com/data下載,也可以在安裝IE5.0中選擇定制安裝"動態資料綁定"選項。
在Delphi IDE中選擇功能表ProjectImport Type Library,出現Import Type Library對話方塊,選擇"Microsoft ADO Ext. 2.x for DDL and Security",將Class Name中TTable改?TADOXTable(因?TTable元件在Delphi中已經存在並註冊);選擇"Microsof Jet and Replication Object 2.x Library"。然後單擊"Install"安裝,便在Delphi的Imports目錄下生成ADOX_TLB.pas和JRO_TLB.pas兩個文件。在Unit文件的Uses中加入ComObj、ADOX_TLB、JRO_TLB,就可以通過COM操作ADOX和JRO物件了。
打開ADOX_TLB.Pas文件,可以看到定義的介面有_Catalog、_Table、_Index等。
建立一個介面物件主要有兩種方法(以建立_Catalog的物件?例):
首先定義Catalog?介面_Catalog的類型。
方法1.通過CreateComObject函數建立實例
Catalog:=CreateComObject(Class_Catalog) as _Catalog;
方法2.通過類來建立實例
Catalog:=CoCatalog.create;其實兩種方法原理是一樣的。在Adox_TLB.pas中,CoCatalog是這樣定義的:
CoCatalog=class
class function Create:_Catalog;
……
class function CoCatalog.Create:_Catalog;
begin
Result:=CreateComObject(CLASS_Catalog) as _Catalog;
end;
建立了介面物件的實例後,就可以通過介面物件的屬性、方法等實現一定的功能。關於ADOX和JRO的物件模型、屬性和方法等,請讀者自己參閱MDAC SDK或Access2000中的幫助文件,這裏就不在重復了。 **********************************************************************
使用COM擴充DELPHI資料庫功能(二)
三、使用ADOX和JRO的例子。
建立一個工程項目,在Form1Uses中加入ComObj、ADOX_TLB、JRO_TLB,添加三個按鈕:btnCreateDB和btnCompactDB,用於實現創建資料庫、創建資料表和壓縮資料庫功能。
1.創建資料庫、資料表和索引。
procedure TForm1.btnCreateDBClick(Sender:TObject);
var
Catalog:_Catalog;//定義?_Catalog的介面類型
Table:_Table;
Index:_Index;
strCon:string;//定義連接字串
begin
Catalog:=CreateComObject(Class-Catalog) as _Catalog;
//建立Catalog實例,也可以用 Catalog:=CoCatalog.Create;
strCon:='Provider=Microsoft.Jet.OleDB.4.0;'
//通過Jet OleDb直接操作Access資料庫
+'Data Source=d:ComTestmyDb.mdb;'
//資料庫位置
+'Jet OLEDB:Engine Type=5;'
//Jet 4.x格式,如?4,則Jet 3.x格式
+'Locale Identifier=0x0804;'
//支援簡體中文(一定要有)
+'Jet OLEDB:Database Password=mypwd';
//加入密碼
Catalog.Create(strCon); //建立資料庫
{建立資料表和索引}
catalog._Set_ActiveConnection(strCon);
//連接到資料庫
with Catalog do
begin //建立資料表
Table:=Create Com Object(Class-Table) as _Table; //建立Table實例
with Table do
begin
Name:='Tel';
Columns.Append('Name',adVarWChar,8);
//資料類型詳見MDAC SDK
Columns.Append('Phone',adVarWchar,20);
Index:=CreateComObject(Class_Index) as _Index; //建立索引
with Index do
begin
Name:='MyIndex';
Columns.Append('Name',adVarWchar,8);
end;
Indexes.Append(Index,EmptyParam);
end;
Tables.Append(Table);
end;
end;
2.通過JRO壓縮資料庫
procedure TForm1.btnCompactDBClick(Sender:TObject);
var
JetEngine:IJetEngine;
strTagCon:string;//目標資料庫連接字串
strSourceCon:string;//源資料庫連接字串
begin
JetEngine:=CoJetEngine.Create;
strSourceCon:=
'Provider=Microsoft.Jet.OleDB.4.0;'
+'Data Source=d:ComTestmyDb.mdb;'
+'Jet OLEDB:Engine Type=5;'
+'Locale Identifier=0x0804;'
+'Jet OLEDB:Database Password=mypwd';
strTagCon:=
'Provider=Microsoft.Jet.OleDB.4.0;'
+'Data Source=d:ComTestmyDb1.mdb;'
+'Jet OLEDB:Engine Type=5;'
+'Locale Identifier=0x0804;'
+'Jet OLEDB:Database Password=mypwd';
//可以以此改變資料庫密碼
JetEngine.Compact Database(str Source Con,str TagCon);
end;
以上在Delphi5.0、ADO2.1下運行通過。
感覺怎?樣?對於VCL元件沒有的,通過COM介面來實現(當然要基於COM的)是非常方便的。利用COM可以擴充Delphi元件不具有的功能,如果你有興趣,還可以自己定制VCL元件讓大家分享,那時別忘了通知我一聲
------
********************************************************** 哈哈&兵燹 最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知 K.表Knowlege 知識,就是本站的標語:Open our mind |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |