亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

利用C#遠(yuǎn)程存取Access數(shù)據(jù)庫

系統(tǒng) 2041 0

目前,基于數(shù)據(jù)庫服務(wù)器的桌面管理程序和Web程序已經(jīng)有太多的應(yīng)用了,尤其是網(wǎng)絡(luò)的大量普及,孤立地數(shù)據(jù)庫管理系統(tǒng)無法勝任分布式管理應(yīng)用,但是面對基于Access數(shù)據(jù)庫的現(xiàn)有的桌面應(yīng)用我們也無法完全的摒棄。我們利用.Net 遠(yuǎn)程處理功能將連接和存取Access的行為封裝為一個遠(yuǎn)程對象,供網(wǎng)絡(luò)中其它客戶端通過調(diào)用該遠(yuǎn)程對象來存取實際的Access數(shù)據(jù)庫。我們以 C# 2005 為開發(fā)語言來實現(xiàn)上述功能。

一、 技術(shù)要點

  我們都知道Windows應(yīng)用程序在運行時會啟動一個進程,其總包括若干線程,不同的進程之間通信是開發(fā)分布式應(yīng)用程序所必需的,傳統(tǒng)上,這不僅需要深入了解通信流兩端上進程的對象,而且還要深入了解低級別協(xié)議的宿主、應(yīng)用程序編程接口以及配置工具等。總之,它是一項需要大量專業(yè)知識和經(jīng)驗的復(fù)雜任務(wù)。

  幸好.Net為我們提供了遠(yuǎn)程處理功能,它所提供的通信方法可以快速而方便地完成上述建立通信的任務(wù)。因此,無論是需要快速開發(fā) Web 應(yīng)用程序,還是要花費更多時間生成關(guān)鍵的企業(yè)范圍的應(yīng)用程序,.NET Framework 都會提供支持。通過 .NET 遠(yuǎn)程處理,客戶端應(yīng)用程序可以使用同一臺計算機或其網(wǎng)絡(luò)中其他任何可用的計算機上的其他進程中的對象。

  要使用 .NET 遠(yuǎn)程處理創(chuàng)建可以讓兩個對象跨越應(yīng)用程序直接通信的應(yīng)用程序,只需生成以下對象即可:

  1、 可遠(yuǎn)程處理的對象。

  2、 偵聽對該遠(yuǎn)程對象的請求的應(yīng)用程序即服務(wù)器程序。

  3、 對該遠(yuǎn)程對象發(fā)出請求的客戶端應(yīng)用程序。

  .Net下不同應(yīng)用程序中的對象的通信方式有兩種:一種是跨應(yīng)用程序域邊界傳輸對象副本,一種是使用代理交換消息。MarshalByRefObject 是通過使用代理交換消息來進行通信的對象的基類。當(dāng)跨應(yīng)用程序使用遠(yuǎn)程對象時,對象的基類必須是從 MarshalByRefObject 繼承。

二、 程序?qū)崿F(xiàn)

  (1)我們先在VS的IDE中創(chuàng)建名為“TestRemoteAccess”的新的解決方案來容納前述用來實現(xiàn)遠(yuǎn)程處理的三個項目,首先向解決方案中添加名為“RemoteObject”的類庫,然后將默認(rèn)創(chuàng)建的類名更改為“CRemoteAccess”,并且繼承于“MarshalByRefObject”,代碼如下:

using System;
using System.Collections.Generic;
using System.Text;
namespace RemoteObject
{
 public class CRemoteAccess : MarshalByRefObject
 {}
}

  我們需要在該對象內(nèi)創(chuàng)建用于連接和存取本地Access數(shù)據(jù)庫的所有函數(shù),供服務(wù)端客戶端程序同時調(diào)用。用于連接和存取Access數(shù)據(jù)庫的方法這里不再詳述,參看附件源碼。

  首先所有需要向客戶端公開的函數(shù)其可見性都必須設(shè)為 public。變量m_ConnString需要設(shè)置為public static,目的是當(dāng)客戶端調(diào)用了SetRemoteAccessConnString后將數(shù)據(jù)庫連接字符串保存下來以備在本次連接期間始終能夠訪問,代碼如下:

……
public static string m_ConnString;
……
public void SetRemoteAccessConnString(string Connstr)
{
 m_ConnString = Connstr;
}
……

  成功連接了Access數(shù)據(jù)庫后我們需要返回數(shù)據(jù)集給請求的客戶端進行顯示和編輯,在遠(yuǎn)程對象中我們聲明了幾個相關(guān)函數(shù):

private void LoadData(string SqlStr, string TableName)
public void SaveData(DataTable ClientDataTable)
public DataTable GetUserTable(string SqlStr, string TableName)

  客戶端可以傳遞SQL查詢腳本通過調(diào)用 GetUserTable來獲取相關(guān)數(shù)據(jù)庫表的數(shù)據(jù),并返回一個DataTable,然后可以將該DataTable附值給DataGridView以便將數(shù)據(jù)顯示出來。GetUserTable通過調(diào)用私有的LoadData 函數(shù)來完成對數(shù)據(jù)的獲取。SaveData函數(shù)用于將編輯過的數(shù)據(jù)集保存回本地Access數(shù)據(jù)庫文件,代碼如下:

……
m_connection.Open();
m_adapter.Update(ClientDataTable);
……

  (2)遠(yuǎn)程對象創(chuàng)建完成,我們需要創(chuàng)建用于偵聽該遠(yuǎn)程對象請求的服務(wù)端應(yīng)用程序。在“TestRemoteAccess”解決方案中新建一個Windows窗體項目名為:“TestServer”,從工具箱中拖拽下幾個組件,界面如下所示:

按此在新窗口瀏覽圖片

服務(wù)器程序TestServer除了具備遠(yuǎn)程訪問對象的能力外,它最主要的作用就是獲取實際的Access數(shù)據(jù)庫文件路徑,并且設(shè)置遠(yuǎn)程對象的數(shù)據(jù)庫連接字符串。我們必須添加遠(yuǎn)程對象以及遠(yuǎn)程處理和網(wǎng)絡(luò)通訊協(xié)議等的類庫的引用。在服務(wù)器程序啟動初始,需要創(chuàng)建遠(yuǎn)程對象的實例以及注冊通信端口,然后調(diào)用RemotingConfiguration.RegisterWellKnownServiceType 方法,MSDN中關(guān)于該方法的描述是這樣的:通過使用給定的參數(shù)初始化 WellKnownServiceTypeEntry 的新實例,將服務(wù)端上的對象 Type 注冊為已知類型,所有知道已注冊已知對象的 URI 的客戶都可以獲取該對象的代理。所謂URI即統(tǒng)一資源標(biāo)識符 (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)選擇了要進行存取的Access數(shù)據(jù)庫文件后,我們需要調(diào)用遠(yuǎn)程對象的SetRemoteAccessConnString方法,該方法將保存在本次與服務(wù)器程序連接期間連接該Access數(shù)據(jù)庫文件的連接字符串,代碼如下:

……
ProviderStr = ProviderStrPart + txtAccessMdbFileName.Text + ";Jet OLEDB:Database Password=" + txtAccessPassword.Text;
……
remotableObject.SetRemoteAccessConnString(ProviderStr);
……

  (3)最后我們創(chuàng)建用于連接和請求服務(wù)的客戶端程序,它會通過調(diào)用服務(wù)器程序TestServer已經(jīng)注冊的遠(yuǎn)程對象來獲取相關(guān)數(shù)據(jù)集,并將編輯過的數(shù)據(jù)保存回實際的數(shù)據(jù)庫文件。在“TestRemoteAccess”解決方案中新建一個Windows窗體項目名為:“TestClient”,從工具箱中拖拽下幾個組件,界面如下所示:

按此在新窗口瀏覽圖片

客戶端程序需要知道服務(wù)器程序所運行在的計算機名稱或IP地址以及偵聽的端口號,然后創(chuàng)建遠(yuǎn)程對象的實例,并且創(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來注冊相應(yīng)的信道和端口號,并且組合成遠(yuǎn)程對象的Url,即Url= 信道://主機名:端口號/對象的Uri,然后創(chuàng)建遠(yuǎn)程對象的實例,就像使用本地對象一樣可以對其進行存取,我們可以調(diào)用遠(yuǎn)程對象的GetUserTable方法獲取指定查詢腳本的結(jié)果集,代碼如下:

……
RemoteDataTable = remoteObject.GetUserTable(txtSQL.Text, "Test");
dataGridView1.DataSource = RemoteDataTable;
……

  保存結(jié)果集時僅需簡單調(diào)用SaveData方法即可,代碼如下:

……
remoteObject.SaveData(RemoteDataTable);
……

三、 結(jié)果

  該程序成功地在Visual Studio .Net 2005及Windows XP SP2下調(diào)試運行通過。

利用C#遠(yuǎn)程存取Access數(shù)據(jù)庫


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 九月婷婷天天澡天天添天天爽 | 色接久久 | 久久久成人啪啪免费网站 | 日韩在线免费视频观看 | 国产欧美亚洲精品一区 | 手机看片高清国产日韩片 | 九九网| 四虎永久在线精品免费影视 | 99热在线观看 | 成人欧美一区二区三区视频不卡 | 青草操 | 中文字幕在线一区二区三区 | 最新视频 - 88av| 久久免费久久 | 曰本三级男人吃奶水 | 91在线视频观看 | 一区二区三区美女视频 | 99视频国产精品 | 在线观看国产一区二区三区 | 国产欧美日韩精品一区二区三区 | 婷婷六月天激情 | 免费在线观看福利 | 国产精品久久久久尤物 | 九九爱精品视频 | 久草高清视频 | 久在线观看 | 亚洲免费成人在线 | 高级毛片 | 久久免费精品 | 国产精品伦一区二区三级视频 | 久久天天躁狠狠躁夜夜中文字幕 | 深夜影院在线观看 | 亚洲综合色视频在线观看 | 久久精品免费在线观看 | 欧美啪啪网站 | 天天射天天色天天干 | 免费观看日本特色做爰视频在线 | 日日干天天草 | 欧美性一区二区三区五区 | 国产精品夜夜春夜夜爽久久 | 欧美一级视频免费看 |