服務器程序TestServer除了具備遠程訪問對象的能力外,它最主要的作用就是獲取實際的Access數據庫文件路徑,並且設置遠程對象的數據庫連接字符串。我們必須添加遠程對象以及遠程處理和網絡通訊協議等的類庫的引用。在服務器程序啟動初始,需要創建遠程對象的實例以及注冊通信端口,然後調用RemotingConfiguration.RegisterWellKnownServiceType 方法,MSDN中關於該方法的描述是這樣的:通過使用給定的參數初始化 WellKnownServiceTypeEntry 的新實例,將服務端上的對象 Type 注冊為已知類型,所有知道已注冊已知對象的 URI 的客戶都可以獲取該對象的代理。所謂URI即統一資源標識符 (Uniform Resource IdentifIEr)。代碼如下:
……
remotableObject = new RemoteObject.CRemoteAccess();
TcpChannel channel = new TcpChannel(8080);
ChannelServices.RegisterChannel(channel);
RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteObject.CRemoteAccess), "RithiaTestAccessServer", WellKnownObjectMode.Singleton);
……
當選擇了要進行存取的Access數據庫文件後,我們需要調用遠程對象的SetRemoteAccessConnString方法,該方法將保存在本次與服務器程序連接期間連接該Access數據庫文件的連接字符串,代碼如下:
……
ProviderStr = ProviderStrPart + txtAccessMdbFileName.Text + ";Jet OLEDB:Database PassWord=" + txtAccessPassWord.Text;
……
remotableObject.SetRemoteAccessConnString(ProviderStr);
……
(3)最後我們創建用於連接和請求服務的客戶端程序,它會通過調用服務器程序TestServer已經注冊的遠程對象來獲取相關數據集,並將編輯過的數據保存回實際的數據庫文件。在“TestRemoteAccess”解決方案中新建一個Windows窗體項目名為:“TestClIEnt”,從工具箱中拖拽下幾個組件,界面如下所示:
客戶端程序需要知道服務器程序所運行在的計算機名稱或IP地址以及偵聽的端口號,然後創建遠程對象的實例,並且創建DataTable以便接收返回的數據,代碼如下:
……
string RemoteURL;
Host = txtHost.Text;
Port = txtPort.Text;
RemoteURL = "tcp://" + Host + ":" + Port + "/RithiaTestAccessServer";
try
{
TcpChannel chan = new TcpChannel();
ChannelServices.RegisterChannel(chan);
remoteObject = (RemoteObject.CRemoteAccess)Activator.GetObject(typeof(RemoteObject.CRemoteAccess), RemoteURL);
RemoteDataTable = new DataTable();
button3.Enabled = false;
}
catch (Exception E)
{
MessageBox.Show(E.Message.ToString());
}
finally
{
}
……
客戶端程序根據服務程序所偵聽的信道是TCP還是HTTP來注冊相應的信道和端口號,並且組合成遠程對象的Url,即Url= 信道://主機名:端口號/對象的Uri,然後創建遠程對象的實例,就像使用本地對象一樣可以對其進行存取,我們可以調用遠程對象的GetUserTable方法獲取指定查詢腳本的結果集,代碼如下:
……
RemoteDataTable = remoteObject.GetUserTable(txtSQL.Text, "Test");
dataGridVIEw1.DataSource = RemoteDataTable;
……
保存結果集時僅需簡單調用SaveData方法即可,代碼如下:
……
remoteObject.SaveData(RemoteDataTable);
……
三、 結果
該程序成功地在Visual Studio .Net 2005及Windows XP SP2下調試運行通過。