使用MIDAS訪問遠程access數據庫 
2005-5-3
訪問遠程數據庫常用的辦法是使用大型數據庫自帶的客戶端工具,如SQL Server和
Oracle等都帶有這樣的工具。帶對于Access這樣的小型數據庫,這種方法就無法使用了,因為Access不提供這樣的客戶端工具。但我們可以通過MIDAS實現訪問遠程Access數據庫。
MIDAS是Delphi提出的三層架構的解決方案。我提供的用MIDAS訪問遠程Access數據庫方法的基本思路是在服務器端建立供遠程訪問的數據模塊,而在客戶端通過MIDAS
組件與其建立連接,并在客戶端發送SQL語句給服務器,服務器執行后返回數據集給客戶端。
具體做法為:
服務器端
服務器使用ADO控件訪問Access數據庫,具體是ADOConnection控件建立連接,ADOQuery執行相關操作。使用Data Access的ClientDataSet控件向客戶端返回數據集。并將以上控件放在Remote Data Module的容器中,供由客戶端進行連接。
有如下步驟:
2.         FileàNewàOther…,在彈出的New Items對話框中選擇Multitier頁,在該頁中選擇Remote Data Module,確定;
3.         在彈出的Remote Data Module Wizard對話框中,在coclass一欄中填入AccessServer,Instancing與Threading Model保持默認,即表示不同線程之間互相獨立,確定后即生成一個RemoteDataModule的派生類AccessServer(在ViewàType Library中可以查看該類的詳細信息);
4.         在程序所在的文件夾中新建一個名為data的文件夾,在其下放入一個名為my.mdb的Access數據庫文件,其中有一個名為person的表,該表中只有兩個字段,分別為name和age,都是文本類型;
5.         遠程數據模塊AccessServer上放置各個控件,最終效果如下圖所示:
各控件的相關屬性與作用如下表所示:
| 控件類型 | 所屬頁面 | 屬性 | 值 | 作用 | 
| ADOConnection |  | name | ADOConnection1 | 連接Access文件 | 
| ConnectionString | Provider=Microsoft.Jet.OLEDB.4.0;Data Source=./data/my.mdb;Persist Security Info=False | 
| ADOQuery |  | name | ADOQuery1 | 執行相關查詢操作 | 
| Connection | ADOConnection1 | 
| ClientDataSet | Data Access | name | DataSetProvider1 | 向客戶端提供數據接口 | 
| DataSet | ADOQuery1 | 
| Options. poAllowCommandText | true | 
6.         編譯并運行該服務器程序。運行該程序即注冊了一個MIDAS的服務器,也只有在服務器程序運行的條件下,才能進行下一步的客戶端的程序開發。
客戶端
以DCOM方式與服務器端進行連接,
1.         建立Application。其Form取名為FormClient,Project名為PrjClient;
2.         在Form上放置各個控件,最終效果如下圖所示:
各控件的相關屬性與作用如下表所示:
| 控件類型 | 所屬頁面 | 屬性 | 值 | 作用 | 
| Edit | Stardard | name | txtQuery | 接收查詢語句 | 
| Text | select * from person | 
| Button | Stardard | name | btnQuery |     | 
| DCOMConnection | DataSnap | name | DCOMConnection1 | 通過DCOM方式連接服務器 | 
| ServerName | PrjServer.AccessServer | 
| ClientDataSet | Data Access | name | ClientDataSet1 | 向遠端發出SQL語句,并取得數據集 | 
| RemoteServer | DCOMConnection1 | 
| ProviderName | DataSetProvider1 | 
| DataSource | Data Access | name | DataSource1 | 作為數據呈現控件的數據源 | 
| DataSet | ClientDataSet1 | 
| DBGrid | Data Controls | name | DBGrid1 | 顯示從遠端取回的數據集 | 
| DataSource | DataSource1 | 
說明: 
l         DCOMConnection1的ServerName屬性是由列表中選取的,該列表是所有注冊的MIDAS服務器列表
l         ClientDataSet1的ProviderName屬性指定的是服務器上的一個控件
3.         在Form上雙擊按鈕btnQuery,在其Click處理函數下加入如下一段代碼:
  self.ClientDataSet1.Close;
  self.ClientDataSet1.CommandText:=self.txtQuery.Text;
  self.ClientDataSet1.Open;  
說明:
如果給出的是無返回的SQL語句,最后一句由Open改為Execute。
運行后,效果如下圖所示:
改變客戶端的連接方式
在上面的例子中是用DCOM方式連接服務器,這一般只能在局域網內使用。如果要在廣域網內使用,可以改用Socket方式連接服務器。為此需做如下改動:
1.         在服務器端運行Delphi自帶的scktsrvr.exe程序,該程序在Borland/Delphi7/Bin/文件夾下
2.         在客戶端上用SocketConnection控件替換DCOMConnection控件,有關屬性的改動如下表所示:
| 控件類型 | 所屬頁面 | 屬性 | 值 | 作用 | 
| SocketConnection | DataSnap | name | SocketConnection1 | 通過Socket方式連接服務器 | 
| Address | 127.0.0.1(本機) | 
| ServerName | PrjServer.AccessServer | 
| ClientDataSet | Data Access | RemoteServer | SocketConnection1 | 向遠端發出SQL語句,并取得數據集 | 
注意: 
SocketConnection的默認端口是211,這也是scktsrvr的默認端口。為此要在服務器端的防火墻上開放該端口