使用MIDAS訪問遠程Access數據庫
Allen Tao(http://blog.csdn.Net/allentao/)
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的容器中,供由客戶端進行連接。
有如下步驟:
1. 建立Application。其Form取名為FormServer,Project名為PrJServer;
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 ADO name ADOConnection1 連接Access文件
ConnectionString Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.\data\my.mdb;Persist Security Info=False
ADOQuery ADO 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的默認端口。為此要在服務器端的防火牆上開放該端口