一、Delphi數據庫連接
如上一章所述,以一定的結構格式存儲數據的一個或多個表的集合,稱之為一個數據庫。表內的數據以行和字段的形式表現。當數據庫由兩個或兩個以上的表構成時,這些表通常儲存著分散但相關的數據。MS Access、Interbase或SQL Server使用單個文件表示完整的數據庫(如Access的.mdb文件)。而Paradox和dBase數據庫則定義了不同的文件和索引來表示表和表的關系。描述一個Paradox數據庫所需的全部文件通常被存儲在一個單獨的目錄裡。當然,Delphi在這兩種模式下都能工作。
Delphi能訪問不同類型的數據庫:local(本地)或C/S(客戶機/服務器)(遠程服務器)數據庫。本地數據庫指存放在你的本地驅動器或局域網上。遠程數據庫服務器通常位於遠程計算機上。本地數據庫類型的有Paradox、dBase和MS Access。客戶機/服務器數據庫類型的有MS SQL Server、Interbase和Oracle。
本地數據庫通常被稱為單層數據庫。單層數據庫指一個數據庫中的任何更改都立即發生,如編輯數據、插入或刪除記錄。單層數據庫中,表能容納多少數據以及應用程序能支持多少用戶,是有限的。當數據信息包含的多個表之間存在復雜關系,或客戶數量急劇增長時,你可能需要構建兩層或多層結構的應用程序。客戶端應用程序在本地計算機運行,應用服務器(通過很多協議來為客戶端提供{serves}商業邏輯--可調用{call}的方法{methods})通常在服務器上,數據庫本身可能會在另一台服務器上{提供數據更改服務}。多層架構背後的理念是使用應用服務器來做大部分的工作,而盡量縮小客戶端。這允許我們編寫那些被稱作瘦客戶端的應用程序。
當我們用Delphi編寫一個數據庫應用程序時,我們需要使用一些數據庫引擎來訪問數據庫中的數據。數據庫引擎--允許你專注於需要訪問哪些數據,而非如何訪問它。從第一版開始,Delphi就為開發人員提供了BDE(Borland數據庫引擎);此外,從第五版開始,提供了對微軟ADO數據庫接口的支持。
本課程將主要講解使用MS Access本地數據庫創建單層應用。
二、數據庫引擎
BDE為Borland公司旗下產品(包括Delphi和C Builder)提供了一個通用的數據訪問層,由一系列DLL集合和實用工具構成。BDE的優點在於--所有的數據操作對開發人員來說都是“透明”的; BDE自帶一系列數據庫驅動器,使你的應用程序能與幾種不同類型的數據庫進行交互。這些驅動將高層次的數據庫操作(比如open、post)或業務流(記錄鎖、SQL分布式創建)轉化為具體到某個特定數據庫(Paradox,dBASE,MS Access或任何ODBC數據源)類型的底層指令。BDE API(應用編程接口)包含200多個過程和函數,都可從BDE單元中獲得。幸運的是,我們再也不用直接去調用這些例程了,而是通過使用Data Access面板下VCL的BDE數據訪問組件。要訪問特定數據庫,應用程序只需要知道該數據庫的別名,即可訪問該數據庫中的所有數據。別名在BDE管理器(BDE Administrator)中設置,它指定了驅動器的參數和數據庫的位置。BDE自帶一個數據庫驅動集,能夠訪問多種數據源。標准的BDE驅動集包括Paradox,DBASE,MS Access,ASCII文本。同時,BDE能通過ODBC管理器使用ODBC的驅動。
使用BDE訪問數據庫的Delphi應用程序,需要同時發布BDE。因此,進行應用程序部署時,必須使用InstallShield Express或其他Borland認證的安裝程序。BDE作為數據庫引擎有其優點和缺點。但是,在此我不打算討論,你什麼時候應該使用BDE(相比於其他引擎),以及為什麼使用它,而不是其他的非BDE技術。
既然本課程是討論ADO/MSACCESS的,那麼剩余部分將側重於非BDE數據庫引擎的訪問方法。
如《Delphi中引入ADO》所述,ADO是一組COM組件(DLLs){COM -- Component Object Model組件對象模型組件},它允許你像訪問電子郵件和文件系統一樣訪問數據庫。ADO組件構建的應用程序不需要BDE。使用ADO訪問數據庫,你需要有ADO/OLE DB庫{OLE -- Object Linking and Embedding對象鏈接和嵌入}。若使用的是Windows操作系統,其所需文件已存在於系統中。最好使用從微軟官方網站獲得的MDAC最新版本。MDAC是使Universal Data Access(通用數據訪問)起作用的關鍵技術,包括ActiveX Data Objects(ADO)、OLE DB和Open Database Connectivity(ODBC)。在這裡沒有必要過多的討論OLE DB和ADO,讓我們轉移到更實際的問題上。
三、ADO對象(ADO Objects)
ADO編程模型基於若干ADO對象構建,這些對象提供多種訪問各類數據源的方法--連接數據源、查詢和更新記錄集、報告錯誤等。Delphi通過幾個封裝好的VCL組件來訪問這些對象。讓我們來看看與ADO一起工作的對象有哪些:
Connection(連接)對象,通過連接字符串與數據源連接。在BDE/Delphi中,連接對象由數據庫組件和會話(Session)組件的組成;
Command(命令)對象,使我們能夠操作數據源。它描繪了一個命令(也稱為查詢或語句),對數據庫中的數據進行增加、刪除、查詢或更新處理;
Recordset(記錄集)對象,是查詢(Query)命令的結果。你可以將它視為一個Delphi表(Table)或查詢組件,其 返回的每一行都包含多個字段(Field)對象。
其他幾個在ADO模型中存在的對象有:字段(Field)對象、參數(Parameter)對象和錯誤(Error)對象—在接下來的章節中我們會回過來談到它們。
四、使用ADOExpress連接數據庫
在對ADOExpress集合中的每個組件進行簡要說明前,讓我們首先了解一下如何連接到Access數據庫。當然,將用到我們上章創建好的樣例數據庫—AboutDelphi.mdb。
Delphi主要通過組件面板ADO頁上的ADOExpress組件實現對ADO的支持。在本課程中將使用幾個其他的數據庫組件。眼下,我們將重點放在用ADO能訪問Access數據庫所需的最小組件集上。
運行Delphi,即會建立一個帶有空白窗口的應用程序。
為了能通過ADO訪問Access數據庫的數據,你必須在你的工程中添加至少三個數據感知組件(data aware)。首先是DataControls(數據控制)組件頁的DBGrid —- 用於浏覽從一個表格或通過查詢獲得的記錄。其次是DataAccess(數據訪問)頁的DataSource,用於連接數據集和窗口上的DBGrid組件,從而顯示、導航(navigation)和編輯相關數據集的數據。最後是ADO頁的ADOTable,表示對ADO數據庫檢索後獲得的一個表。將它們拖放進窗口(Form),都使用默認的組件名。窗口如圖所示:
如果你現在運行程序,Grid中將無任何數據顯示 —- 那是因為,我們還沒真正地連到數據庫上。注意另一點:僅僅Grid是可見的,其他兩個是不可視控件(controls-unvisible)。
五、組件間的連接(Link between components)
為了顯示數據庫中的數據,我們必須把三個組件關聯在一起。在對象監視器(Object Inspector)中進行如下設置:DBGrid1.DataSource = DataSource1;
DataSource1.DataSet = ADOTable1 ;
我們現在已經到了最困難的部分 -- 為了真正從數據庫中獲得數據,我們必須建立一個連接字符串(ConnectionString)。這個字符串指出了數據庫的物理存儲位置和訪問方式。當你雙擊AdoTable組件的ConnectionString屬性的...省略號按鈕。
建立一個連接字符串,我們有兩種選擇:使用數據連接文件(.UDL)或手工建立一個連接字符串。現在我們手工建立它,點擊Build按鈕--彈出Data Link Properties(數據連接屬性)對話框。這個對話框有4頁。Provider(提供商)頁允許你指定提供商—這裡選擇Microsoft Jet 4.0 OLE DB Provider。點擊Next進入第二頁:Connection(連接)。點擊...按鈕浏覽並找到我們的數據庫(AboutDelphi.mdb)。可點擊Test Connection(測試連接)按鈕來檢驗是否連接成功 —- 這裡應該是成功的。其它頁暫時不進行設置。最後,點兩次OK,以關閉對話框 —- 連接字符串被存儲在ADOTable組件的ConnectionString屬性中。連接字符串如下所示:Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Database\About\aboutdelphi.mdb;Persist Security Info=False
最後,必須設置通過ADOTable組件所訪問的表的名稱 -- 再次使用Object Inspector:ADOTable1.TableName = Applications ;
若想設計時就看見數據庫中的數據,可將ADOTable的Active(激活)屬性設置為True。
完成以上步驟後,你將能在DBGrid中看到Applications表的一行記錄。運行時,你甚至能改變數據庫的數據。當然,你無法做更多的事 -— 這是我所能想到的最簡單的ADO的例子。