線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2403
推到 Plurk!
推到 Facebook!

使用COM擴充DELPHI資料庫功能

 
jackkcg
站務副站長


發表:891
回覆:1050
積分:848
註冊:2002-03-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-10-26 01:25:55 IP:210.65.xxx.xxx 未訂閱
此為轉貼資料 使用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
系統時間:2024-05-14 23:22:02
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!