利用C#遠(yuǎn)程存取Access數(shù)據(jù)庫(kù)
更新時(shí)間:2008年04月06日 22:49:30 作者:
目前,基于數(shù)據(jù)庫(kù)服務(wù)器的桌面管理程序和Web程序已經(jīng)有太多的應(yīng)用了,尤其是網(wǎng)絡(luò)的大量普及,孤立地?cái)?shù)據(jù)庫(kù)管理系統(tǒng)無(wú)法勝任分布式管理應(yīng)用,但是面對(duì)基于Access數(shù)據(jù)庫(kù)的現(xiàn)有的桌面應(yīng)用我們也無(wú)法完全的摒棄。我們利用.Net 遠(yuǎn)程處理功能將連接和存取Access的行為封裝為一個(gè)遠(yuǎn)程對(duì)象,供網(wǎng)絡(luò)中其它客戶端通過(guò)調(diào)用該遠(yuǎn)程對(duì)象來(lái)存取實(shí)際的Access數(shù)據(jù)庫(kù)。我們以 C# 2005 為開發(fā)語(yǔ)言來(lái)實(shí)現(xiàn)上述功能。
一、 技術(shù)要點(diǎn)
我們都知道Windows應(yīng)用程序在運(yùn)行時(shí)會(huì)啟動(dòng)一個(gè)進(jìn)程,其總包括若干線程,不同的進(jìn)程之間通信是開發(fā)分布式應(yīng)用程序所必需的,傳統(tǒng)上,這不僅需要深入了解通信流兩端上進(jìn)程的對(duì)象,而且還要深入了解低級(jí)別協(xié)議的宿主、應(yīng)用程序編程接口以及配置工具等??傊?,它是一項(xiàng)需要大量專業(yè)知識(shí)和經(jīng)驗(yàn)的復(fù)雜任務(wù)。
幸好.Net為我們提供了遠(yuǎn)程處理功能,它所提供的通信方法可以快速而方便地完成上述建立通信的任務(wù)。因此,無(wú)論是需要快速開發(fā) Web 應(yīng)用程序,還是要花費(fèi)更多時(shí)間生成關(guān)鍵的企業(yè)范圍的應(yīng)用程序,.NET Framework 都會(huì)提供支持。通過(guò) .NET 遠(yuǎn)程處理,客戶端應(yīng)用程序可以使用同一臺(tái)計(jì)算機(jī)或其網(wǎng)絡(luò)中其他任何可用的計(jì)算機(jī)上的其他進(jìn)程中的對(duì)象。
要使用 .NET 遠(yuǎn)程處理創(chuàng)建可以讓兩個(gè)對(duì)象跨越應(yīng)用程序直接通信的應(yīng)用程序,只需生成以下對(duì)象即可:
1、 可遠(yuǎn)程處理的對(duì)象。
2、 偵聽對(duì)該遠(yuǎn)程對(duì)象的請(qǐng)求的應(yīng)用程序即服務(wù)器程序。
3、 對(duì)該遠(yuǎn)程對(duì)象發(fā)出請(qǐng)求的客戶端應(yīng)用程序。
.Net下不同應(yīng)用程序中的對(duì)象的通信方式有兩種:一種是跨應(yīng)用程序域邊界傳輸對(duì)象副本,一種是使用代理交換消息。MarshalByRefObject 是通過(guò)使用代理交換消息來(lái)進(jìn)行通信的對(duì)象的基類。當(dāng)跨應(yīng)用程序使用遠(yuǎn)程對(duì)象時(shí),對(duì)象的基類必須是從 MarshalByRefObject 繼承。
二、 程序?qū)崿F(xiàn)
(1)我們先在VS的IDE中創(chuàng)建名為“TestRemoteAccess”的新的解決方案來(lái)容納前述用來(lái)實(shí)現(xiàn)遠(yuǎn)程處理的三個(gè)項(xiàng)目,首先向解決方案中添加名為“RemoteObject”的類庫(kù),然后將默認(rèn)創(chuàng)建的類名更改為“CRemoteAccess”,并且繼承于“MarshalByRefObject”,代碼如下:
using System;
using System.Collections.Generic;
using System.Text;
namespace RemoteObject
{
public class CRemoteAccess : MarshalByRefObject
{}
}
我們需要在該對(duì)象內(nèi)創(chuàng)建用于連接和存取本地Access數(shù)據(jù)庫(kù)的所有函數(shù),供服務(wù)端客戶端程序同時(shí)調(diào)用。用于連接和存取Access數(shù)據(jù)庫(kù)的方法這里不再詳述,參看附件源碼。
首先所有需要向客戶端公開的函數(shù)其可見性都必須設(shè)為 public。變量m_ConnString需要設(shè)置為public static,目的是當(dāng)客戶端調(diào)用了SetRemoteAccessConnString后將數(shù)據(jù)庫(kù)連接字符串保存下來(lái)以備在本次連接期間始終能夠訪問(wèn),代碼如下:
……
public static string m_ConnString;
……
public void SetRemoteAccessConnString(string Connstr)
{
m_ConnString = Connstr;
}
……
成功連接了Access數(shù)據(jù)庫(kù)后我們需要返回?cái)?shù)據(jù)集給請(qǐng)求的客戶端進(jìn)行顯示和編輯,在遠(yuǎn)程對(duì)象中我們聲明了幾個(gè)相關(guān)函數(shù):
private void LoadData(string SqlStr, string TableName)
public void SaveData(DataTable ClientDataTable)
public DataTable GetUserTable(string SqlStr, string TableName)
客戶端可以傳遞SQL查詢腳本通過(guò)調(diào)用 GetUserTable來(lái)獲取相關(guān)數(shù)據(jù)庫(kù)表的數(shù)據(jù),并返回一個(gè)DataTable,然后可以將該DataTable附值給DataGridView以便將數(shù)據(jù)顯示出來(lái)。GetUserTable通過(guò)調(diào)用私有的LoadData 函數(shù)來(lái)完成對(duì)數(shù)據(jù)的獲取。SaveData函數(shù)用于將編輯過(guò)的數(shù)據(jù)集保存回本地Access數(shù)據(jù)庫(kù)文件,代碼如下:
……
m_connection.Open();
m_adapter.Update(ClientDataTable);
……
(2)遠(yuǎn)程對(duì)象創(chuàng)建完成,我們需要?jiǎng)?chuàng)建用于偵聽該遠(yuǎn)程對(duì)象請(qǐng)求的服務(wù)端應(yīng)用程序。在“TestRemoteAccess”解決方案中新建一個(gè)Windows窗體項(xiàng)目名為:“TestServer”,從工具箱中拖拽下幾個(gè)組件,界面如下所示:
服務(wù)器程序TestServer除了具備遠(yuǎn)程訪問(wèn)對(duì)象的能力外,它最主要的作用就是獲取實(shí)際的Access數(shù)據(jù)庫(kù)文件路徑,并且設(shè)置遠(yuǎn)程對(duì)象的數(shù)據(jù)庫(kù)連接字符串。我們必須添加遠(yuǎn)程對(duì)象以及遠(yuǎn)程處理和網(wǎng)絡(luò)通訊協(xié)議等的類庫(kù)的引用。在服務(wù)器程序啟動(dòng)初始,需要?jiǎng)?chuàng)建遠(yuǎn)程對(duì)象的實(shí)例以及注冊(cè)通信端口,然后調(diào)用RemotingConfiguration.RegisterWellKnownServiceType 方法,MSDN中關(guān)于該方法的描述是這樣的:通過(guò)使用給定的參數(shù)初始化 WellKnownServiceTypeEntry 的新實(shí)例,將服務(wù)端上的對(duì)象 Type 注冊(cè)為已知類型,所有知道已注冊(cè)已知對(duì)象的 URI 的客戶都可以獲取該對(duì)象的代理。所謂URI即統(tǒng)一資源標(biāo)識(shí)符 (Uniform Resource Identifier)。代碼如下:
……
remotableObject = new RemoteObject.CRemoteAccess();
TcpChannel channel = new TcpChannel(8080);
ChannelServices.RegisterChannel(channel);
RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteObject.CRemoteAccess), "RithiaTestAccessServer", WellKnownObjectMode.Singleton);
……
當(dāng)選擇了要進(jìn)行存取的Access數(shù)據(jù)庫(kù)文件后,我們需要調(diào)用遠(yuǎn)程對(duì)象的SetRemoteAccessConnString方法,該方法將保存在本次與服務(wù)器程序連接期間連接該Access數(shù)據(jù)庫(kù)文件的連接字符串,代碼如下:
……
ProviderStr = ProviderStrPart + txtAccessMdbFileName.Text + ";Jet OLEDB:Database Password=" + txtAccessPassword.Text;
……
remotableObject.SetRemoteAccessConnString(ProviderStr);
……
?。?)最后我們創(chuàng)建用于連接和請(qǐng)求服務(wù)的客戶端程序,它會(huì)通過(guò)調(diào)用服務(wù)器程序TestServer已經(jīng)注冊(cè)的遠(yuǎn)程對(duì)象來(lái)獲取相關(guān)數(shù)據(jù)集,并將編輯過(guò)的數(shù)據(jù)保存回實(shí)際的數(shù)據(jù)庫(kù)文件。在“TestRemoteAccess”解決方案中新建一個(gè)Windows窗體項(xiàng)目名為:“TestClient”,從工具箱中拖拽下幾個(gè)組件,界面如下所示:
客戶端程序需要知道服務(wù)器程序所運(yùn)行在的計(jì)算機(jī)名稱或IP地址以及偵聽的端口號(hào),然后創(chuàng)建遠(yuǎn)程對(duì)象的實(shí)例,并且創(chuàng)建DataTable以便接收返回的數(shù)據(jù),代碼如下:
……
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
{
}
……
客戶端程序根據(jù)服務(wù)程序所偵聽的信道是TCP還是HTTP來(lái)注冊(cè)相應(yīng)的信道和端口號(hào),并且組合成遠(yuǎn)程對(duì)象的Url,即Url= 信道://主機(jī)名:端口號(hào)/對(duì)象的Uri,然后創(chuàng)建遠(yuǎn)程對(duì)象的實(shí)例,就像使用本地對(duì)象一樣可以對(duì)其進(jìn)行存取,我們可以調(diào)用遠(yuǎn)程對(duì)象的GetUserTable方法獲取指定查詢腳本的結(jié)果集,代碼如下:
……
RemoteDataTable = remoteObject.GetUserTable(txtSQL.Text, "Test");
dataGridView1.DataSource = RemoteDataTable;
……
保存結(jié)果集時(shí)僅需簡(jiǎn)單調(diào)用SaveData方法即可,代碼如下:
……
remoteObject.SaveData(RemoteDataTable);
……
三、 結(jié)果
該程序成功地在Visual Studio .Net 2005及Windows XP SP2下調(diào)試運(yùn)行通過(guò)。
源碼下載:http://d.download.csdn.net/down/401452/q520525745
您可能感興趣的文章:
- C#編程實(shí)現(xiàn)連接ACCESS數(shù)據(jù)庫(kù)實(shí)例詳解
- C#使用ADO.Net部件來(lái)訪問(wèn)Access數(shù)據(jù)庫(kù)的方法
- C#通過(guò)oledb訪問(wèn)access數(shù)據(jù)庫(kù)的方法
- C#動(dòng)態(tài)創(chuàng)建Access數(shù)據(jù)庫(kù)及表的方法
- C#數(shù)據(jù)庫(kù)操作類AccessHelper實(shí)例
- c#連接access數(shù)據(jù)庫(kù)操作類分享
- C# Access數(shù)據(jù)庫(kù)增刪查改的簡(jiǎn)單方法
- c# 連接access數(shù)據(jù)庫(kù)config配置
- C# 操作 access 數(shù)據(jù)庫(kù)的實(shí)例代碼
相關(guān)文章
ASP.NET Core中的Options選項(xiàng)模式
這篇文章介紹了ASP.NET Core中的Options選項(xiàng)模式,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04ASP.NET?Core中Startup類、Configure()方法及中間件詳解
本文詳細(xì)講解了ASP.NET?Core中Startup類、Configure()方法及中間件,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-01-01ASP.NET Core應(yīng)用程序配置文件AppSetting.json
這篇文章介紹了ASP.NET Core應(yīng)用程序配置文件AppSetting.json,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-02-02.Net中Task Parallel Library的基本用法
這篇文章介紹了.Net中Task Parallel Library的基本用法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-10-10C#列出局域網(wǎng)中可用SQL Server服務(wù)器(續(xù))
上一篇文章展示了使用COM對(duì)象如何列出局域網(wǎng)中的 SQL Server服務(wù)器信息,后來(lái)還發(fā)現(xiàn)在.Net中有現(xiàn)成的類可用,而不需要使用不太熟悉的COM對(duì)象了,這樣豈不是更好?下面我把代碼展示給大家:2008-04-04