傳統分散式資料庫開發面臨跨節點通訊、資料一致性、異構整合等高複雜度挑戰。本文展示在 .NET Framework 環境下,結合 **C#**、**.NET Remoting** 遠端呼叫框架與 **ADO.NET** 離線資料集模型,快速構建支援本地/遠端/聯合查詢的分散式查詢系統,大幅降低開發門檻。

| 層次 | 技術 | 角色 |
|---|---|---|
| 遠端通訊 | .NET Remoting (TcpChannel) | 透明化跨進程/跨機器物件呼叫,隱藏 Socket/序列化細節 | 資料存取 | ADO.NET (SqlConnection, SqlDataAdapter, DataSet) | 離線資料集、XML 序列化、樂觀並發控制、DataTable 遠端傳遞 | 業務邏輯 | C# 類別庫 | 封裝查詢、建表、Join、Merge 等可重用服務 |
// 伺服器端:發佈 DbServer 為 Singleton WellKnown 物件
TcpChannel channel = new TcpChannel(int.Parse(port));
ChannelServices.RegisterChannel(channel);
RemotingConfiguration.RegisterWellKnownServiceType(
typeof(DbServer), "STORE", WellKnownObjectMode.Singleton);
// 用戶端:依 IP:Port 取得透明 Proxy
try {
myDbServer = (DbServer)Activator.GetObject(
typeof(DbServer), "tcp://" + ip + ":" + port + "/STORE");
} catch (RemotingException ex) { /* 物件定義不符 */ }
catch (NullReferenceException ex) { /* URL 不可達 */ }
string connStr = "Initial Catalog=Store;Data Source=localhost;User ID=sa;Password=;";
using (SqlConnection conn = new SqlConnection(connStr)) {
conn.Open();
DataSet ds = new DataSet();
DataTable dt = new DataTable("Result");
SqlDataAdapter adapter = new SqlDataAdapter(cmdText, conn);
adapter.Fill(dt); // 將結果填入 DataTable (離線、可序列化)
ds.Tables.Add(dt);
return ds; // DataSet 可直接跨 Remoting 傳回用戶端
}
優勢:DataSet 內建 Original/Current 版本 支援樂觀並發,更新時自動比對原始值偵測衝突,無需長時間鎖定資料庫資源。
DbServer Proxy,呼叫 Query(sql) 方法,透明執行。t1,存放北京供應商清單 (總部才有地址資訊)。t1 複製至第3、第4店。t1 JOIN 本地庫存表 產生 t2, t3。t2, t3 取回本地,DataTable.Merge() 合併並 DataGrid 顯示。DbServer.dll 供調用。
DataAdapter.Update() 時自動比對 Original 值,衝突拋 DBConcurrencyException。System.EnterpriseServices (COM+) 或 WCF 交易流,Remoting 本身不提供分散式交易協調器 (DTC) 整合。RemotingException, SocketException) 需區分網路暫時性錯誤與邏輯錯誤,實作重試與熔斷。.NET Remoting 為舊世代技術,**新專案請採用**:
C# + .NET Remoting + ADO.NET 在 2000 年代提供了極具生產力的分散式資料庫開發路徑,其核心思想——**遠端透明呼叫 + 離線資料集傳遞 + 樂觀並發**——仍具架構參考價值。理解此演進脈絡,有助於在現代微服務與雲原生架構中做出更合理的技術選型。