首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 透過 .NET Remoting 遠端存取 Access 資料庫:分散式架構實作

     編輯:關於C#

背景:將本地 Access 封裝為遠端服務

Access 為檔案型資料庫,不支援多使用者並發遠端連線。利用 .NET Remoting 將連線與存取邏輯封裝為伺服器端物件,客戶端透過 Proxy 呼叫,實現分散式存取。

架構三角色

  1. RemoteObject (遠端物件):繼承 MarshalByRefObject,含實際 Access 連線/查詢/更新方法。
  2. Server (伺服器主機):啟動 TCP Channel、註冊 WellKnown 服務型別 (Singleton)、提供 UI 選擇 .mdb 檔案並設定連線字串。
  3. Client (客戶端):連線伺服器 URL、取得 Proxy、呼叫遠端方法獲取 DataTable 綁定 DataGridView、更新資料。

核心實作細節

1. 遠端物件 (類別庫專案)


public class CRemoteAccess : MarshalByRefObject
{
    public static string ConnString; // 靜態保存連線字串

    public void SetConnectionString(string connStr) => ConnString = connStr;

    private OleDbConnection _conn;
    private OleDbDataAdapter _adapter;
    private DataSet _ds = new DataSet();

    private void LoadData(string sql, string tableName)
    {
        _conn = new OleDbConnection(ConnString);
        _adapter = new OleDbDataAdapter(sql, _conn);
        _ds.Tables.Clear();
        _adapter.Fill(_ds, tableName);
    }

    public DataTable GetTable(string sql, string tableName)
    {
        LoadData(sql, tableName);
        return _ds.Tables[tableName];
    }

    public void SaveData(DataTable dt)
    {
        _conn.Open();
        _adapter.Update(dt); // 批次更新
        _conn.Close();
    }
}

2. 伺服器端 (Windows Forms)

  • UI:選擇 .mdb 檔案、輸入密碼、按鈕啟動服務。
  • 啟動程式碼:

RemotableObject = new RemoteObject.CRemoteAccess();
TcpChannel channel = new TcpChannel(8080);
ChannelServices.RegisterChannel(channel);
RemotingConfiguration.RegisterWellKnownServiceType(
    typeof(RemoteObject.CRemoteAccess), 
    "RithiaTestAccessServer", 
    WellKnownObjectMode.Singleton);

選擇檔案後:
RemotableObject.SetConnectionString(providerStr);

伺服器 UI

3. 客戶端 (Windows Forms)

  • UI:輸入伺服器 IP/Port、SQL 查詢文字框、DataGridView、查詢/儲存按鈕。
  • 連線程式碼:

string url = $"tcp://{host}:{port}/RithiaTestAccessServer";
TcpChannel chan = new TcpChannel();
ChannelServices.RegisterChannel(chan);
_remoteObj = (RemoteObject.CRemoteAccess)Activator.GetObject(
    typeof(RemoteObject.CRemoteAccess), url);
_remoteTable = new DataTable();
  • 查詢:_remoteTable = _remoteObj.GetTable(sql, "Test"); dataGridView1.DataSource = _remoteTable;
  • 儲存:_remoteObj.SaveData(_remoteTable);

客戶端 UI

關鍵技術點

  • MarshalByRefObject:透過 Proxy 交換訊息,物件留在伺服器端。
  • WellKnownObjectMode.Singleton:所有客戶端共用同一個遠端物件實例,適合共享連線。
  • DataTable 序列化傳輸:ADO.NET DataTable 原生支援遠端傳遞。
  • 通道協定:TCP (二進位、效能佳) 或 HTTP (穿透防火牆)。

現代替代方案

.NET Remoting 屬舊技術 (.NET Framework 專屬),新專案建議採用:

  • WCF:統一通訊框架,支援多種繫結與安全性。
  • ASP.NET Core Web API / gRPC:跨平台、高效能、標準化。
  • Entity Framework Core + SQLite/SQL Server:取代 Access 獲得真正的多使用者支援。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved