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

使用 C# 與 ADO.NET 實現分布式數據庫查詢系統

     編輯:關於C語言

前言

隨著資料庫技術、電腦網路與數位通訊的飛速發展,分布式資料庫系統因其資料分散儲存與分散處理的特性,備受關注。然而,其開發複雜度較高,在一定程度上制約了推廣應用。本文提出在 .NET 環境下,結合 C# 語言與 ADO.NET 資料存取模型,搭配 .NET Remoting 遠端處理框架,開發分布式資料庫查詢系統,可大幅簡化開發流程。

一、分布式資料庫系統概述

分布式資料庫系統在邏輯上是統一的,物理上卻是分散的。相較於集中式資料庫,具備以下主要優勢:

  • 解決組織分散與資料關聯需求:適合跨地域、跨部門的資料共享場景。
  • 負載均衡:負載分散於各處理節點,避免單點瓶頸。
  • 高可靠性:資料多副本分佈於不同站點,單點故障不致癱瘓整體系統。
  • 良好擴充性:新增自主組織單位時,對現有架構影響最小。

但分布式系統也引入資料一致性、遠端資料傳輸、通訊開銷等難題。微軟 .NET 框架提供的 C# 與 ADO.NET,配合 .NET Remoting,能有效降低開發難度。

二、.NET 遠端處理框架與 ADO.NET

開發分布式資料庫系統需解決兩大核心問題:站點間資料通訊、資料庫操作與管理。C# 結合 ADO.NET 可高效、可靠地應對。

2.1 .NET 遠端處理框架

實現遠端資料與命令傳遞主要有三種方式:

  1. 訊息/報文 + Socket 程式設計:將資料序列化為流,透過 Socket 發送。實作繁瑣,不易維護。
  2. Web Service:各站點提供查詢服務。但僅支援單站點查詢,無法實現多站點聯合查詢。
  3. .NET Remoting:封裝遠端呼叫細節,服務端經簡單設定即可發布本地物件為遠端物件,客戶端如呼叫本地物件般透明存取。訊息封裝、通道傳輸均由框架處理,極大簡化開發。

遠程處理過程示意圖

圖 1 遠端處理流程

流程:伺服端建立服務類實例 → Remoting 建立代理物件並回傳引用 → 客戶端呼叫方法 → 基礎設施檢查型別、透過通道發送 → 伺服端監聽通道接收、轉發給 Remoting 系統 → 查找/建立目標物件並執行 → 回應封裝為訊息經通道返回 → 客戶端代理將結果回傳給呼叫者。

2.2 ADO.NET

ADO.NET 以 XML 為核心,採用離線資料架構。資料源資料快取至 DataSet 物件,使用者無需鎖定資料源,資料以 XML 格式保存,極適合分散式環境。

2.2.1 ADO.NET 管理資料一致性

分布式系統中常面臨多用戶並發存取。ADO.NET 採用樂觀並發控制:資料列僅在實際更新資料庫時才鎖定,而悲觀鎖定則從讀取到更新全程鎖定。樂觀策略大幅降低鎖定時間,提升並發回應能力。

此外,DataSet 為每筆修改記錄維護原始版本與更新版本。寫回資料庫前,先比對資料集中原始版本與資料庫當前版本;若匹配則更新,否則拋出並發衝突錯誤,有效保障一致性。

三、實戰案例:家電連鎖店分布式查詢系統

3.1 系統設計

3.1.1 系統架構

系統結構圖

圖 2 系統架構圖

總部與各分店各配置一台固定 IP 伺服器,內部電腦透過集線器連接伺服器,總部與分店伺服器經通訊網路互聯。

3.1.2 實作步驟

  1. 資料庫設計:採用 SQL Server。各分店建立銷售、庫存資料庫;總部建立員工、總庫存、信用卡客戶、供應商等資料庫。
  2. 建立資料庫服務動態連結庫:封裝遠端物件發布/獲取、本地/異地資料表查詢、遠端建立/刪除資料表、資料表連接與合併等核心服務與函數,供各分店呼叫。
  3. 開發客戶端查詢介面:依業務需求設計前端操作介面。

3.2 關鍵技術實現

3.2.1 遠端物件發布與獲取

系統啟動首要任務:發布本地遠端物件、獲取其他站點發布的遠端物件。發布步驟:設定網路埠 → 建立並註冊通道 → 發布伺服端啟動物件。其他站點透過 IP 與埠號即可獲取。

// 遠端物件發布
TcpChannel MyChannel = new TcpChannel(Int32.Parse(port));
ChannelServices.RegisterChannel(MyChannel);
RemotingConfiguration.RegisterWellKnownServiceType(typeof(DbServer), "STORE", WellKnownObjectMode.Singleton);

// 遠端物件獲取
try {
    myDbServer = (DbServer)Activator.GetObject(typeof(DbServer), "tcp://" + ip + ":" + p + "/STORE");
}
catch (NullReferenceException nullExp) {
    MessageBox.Show("指定的 URL 地址不可到達 " + nullExp.Message);
}
catch (RemotingException remExp) {
    MessageBox.Show("指定獲得的對象定義不對 " + remExp.Message);
}

3.2.2 資料庫存取

透過 ADO.NET 連接資料庫,將資料載入 DataSet,可在離線狀態下操作資料表,且 DataSet 本身可遠端傳遞,極利於分布式開發。

string SqlConn = "Initial Catalog=Store;Data Source=Localhost;Userid=sa;PassWord=;";
SqlConnection Conn = new SqlConnection(SqlConn);
Conn.Open();

try {
    DataSet ds = new DataSet();
    DataTable dt = new DataTable("Result");
    SqlDataAdapter adapter = new SqlDataAdapter();
    SqlCommand MySQLDataSetCmd = new SqlCommand(CmdString, Conn);
    adapter.SelectCommand = MySQLDataSetCmd;
    adapter.Fill(dt);
    ds.Tables.Add(dt);
}
finally {
    Conn.Close();
}

3.2.3 查詢類型與聯合查詢實例

分布式查詢分三類:本地查詢(同集中式)、遠端查詢(獲取遠端物件後呼叫查詢函數)、聯合查詢(最複雜,涉及多站點資料查詢、遠端建表、傳遞、連接、合併)。

案例:第二連鎖店需查詢鄰近第三、四店中「北京供應商供應的空調庫存」以便調貨。步驟:

  1. 獲取總部、第三、四店遠端物件。
  2. 在總部建立暫存表 t1,存放北京供應商資訊(分店僅有供應商名稱,詳細地址僅總部掌握),並將 t1 複製至第三、四店。
  3. 分別將 t1 與兩店庫存表連接,產生結果集 t2、t3 並傳回第二店。
  4. 合併 t2、t3,以 DataGrid 顯示。

上述過程涵蓋跨站點資料表複製、傳遞、連接等操作,相關函數(遠端建表、表連接、合併)均封裝於 DLL 中,便於複用。

四、結語

C# 的 .NET Remoting 技術有效解決跨站點資料通訊;ADO.NET 使資料庫操作更高效、可靠。兩者結合,攻克分布式資料庫系統開發的核心難點,大幅減輕工作量,並提升系統可靠性與安全性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved