開始動手之前
你需要了解
NET Remoting 技術的基本理論
熟悉分布式數據庫原理
熟練掌握ADO
NET
並熟悉VS
NET的開發環境
下面僅就這幾個方面做些簡單的介紹
Remoting
一種分布式處理方式
也可將它看作是DCOM的一種升級
它改善了很多功能
並極好的融合到
Net平台下
NET Remoting 提供了一種允許對象通過應用程序域與另一對象進行交互的框架
在Remoting中是通過通道(channel)來實現兩個應用程序域之間對象的通信的
首先
客戶端通過Remoting
訪問通道以獲得服務端對象
再通過代理解析為客戶端對象
這就提供一種可能性
即以服務的方式來發布服務器對象
遠程對象代碼可以運行在服務器上(如服務器激活的對象和客戶端激活的對象)
然後客戶端再通過Remoting連接服務器
獲得該服務對象並通過序列化在客戶端運行
在Remoting中
對於要傳遞的對象
設計者除了需要了解通道的類型和端口號之外
無需再了解數據包的格式
但必須注意的是
客戶端在獲取服務器端對象時
並不是獲得實際的服務端對象
而是獲得它的引用
這既保證了客戶端和服務器端有關對象的松散耦合
同時也優化了通信的性能
分布式數據庫系統 就其本質而言
分布式數據庫系統的數據在邏輯上是統一的
而在物理上卻是分散的
與集中式數據庫相比它有如下主要優點
· 解決組織機構分散而數據需要相互聯系的問題
· 均衡負載
負載在各處理機間分擔
可避免臨界瓶頸
· 可靠性高
數據分布在不同場地
且存有多個副本
即使個別場地發生故障
不致引起整個系統的癱瘓
· 可擴充性好
當需要增加新的相對自主的組織單位時
可在對當前機構影響最小的情況下進行擴充
ADONET 分布式數據庫系統雖然有諸多優點
但它同時也帶來了許多新問題
如
數據一致性問題
數據遠程傳遞的實現
通信開銷的降低等
這使得分布式數據庫系統的開發變得較為復雜
幸運的是
微軟的
NET開發環境為我們提供了C#開發語言和ADO
NET數據訪問模型
結合兩者來開發分布式數據庫系統能夠大大簡化開發工作
ADO
NET以XML為核心
是
Net數據庫應用程序的解決方案
它使用離線數據結構
數據源中的數據被緩存到數據集(DataSet)對象中
用戶無須鎖定數據源
數據以XML格式保存
在分布式數據庫系統中
很可能出現多個用戶同時訪問和修改數據的情況
因此
對於分布式數據庫系統
數據一致性是不可或缺的
ADO
NET通過使用樂觀一致性方案來控制數據一致性(實際上DataSet對象被設計成支持使用樂觀一致性控制機制)
即數據行只有在數據庫中真正被更新時才會被鎖定
而在悲觀一致性方案中
數據行在從被提取出來到在數據庫中更
新這段時間內一直被鎖定
因此
使用ADO
NET能夠在更少的時間內響應數量巨大的用戶
另外
在分布式數據庫系統中
還會經常遇到當用戶修改自從提取出來以來已經被修改的行時
違反一致性原則
對此問題ADO
NET也作了很好地解決
即使用DataSet對象為每一條修改過的記錄維護兩個版本
原始版本和更新版本
在更新的記錄被寫回數據庫之前
先要把數據集中記錄的原始版本與數據庫中的當前版本進行比較
如果兩個版本匹配
就在數據庫中更新記錄
否則
就會出現違反一致性原則的錯誤
下面開始程序實現
第章 系統總體結構 總體結構圖
系統實現需要部署服務器端的遠程對象(即一個DbServerLibrary
dll)
服務器端要注冊通道和該遠程對象
客戶端要實現一個本地查詢的服務器
同時根據SQL解析的結果向各個服務器發送命令
並將結果顯示在客戶端界面
服務器端可以接受並顯示相應的命令
關鍵組件結構圖
系統結構中關鍵的組件有遠程對象
和本地服務器
實現的功能基本一致
下面以遠程對象為例
說明組件的實現
遠程對象在服務器端解決方案下的庫文件中聲明
通過服務器端進行注冊
客戶端通過TCP通道與服務器端遠程對象通信
實現數據集的查詢和傳輸
主要的數據成員有
SqlConnection(SQL Server數據庫的連接對象)
SqlCommand (SQL命令對象)
SqlDataAdapter(數據適配器
填充數據集)組件——DbServerLibrary:
第 章 數據字典結構 因時間倉促
未實現數據字典
所有實驗要求的SQL經過解析後
直接通過代碼判斷
向相應場地發送命令
第 章 代碼結構 代碼分為三部分
遠程對象
服務器端代碼和客戶端代碼
其中
遠程對象部署在各個服務器端
客戶端除了實現查詢命令的解析和傳送外外
還有一個本地服務器
進行相應的本地查詢
遠程對象代碼
using System;
using System
Runtime
Serialization;
using System
Data;
using System
Data
SqlClient;
using System
Windows
Forms;
namespace DbServerLibrary
{
[SerializableAttribute] //It is very important for Remoting Data
public class DbServer : MarshalByRefObject
{
private string connStr;
private string clientSql;
public SqlConnection sqlConn;
public SqlCommand sqlComm;
public SqlDataAdapter sqlAdapter;
public void GetClientSql(string sql)
{
if(clientSql != null)
{
clientSql = null;
}
clientSql = sql;
MessageBox
Show(clientSql);
}
public DbServer()
{
//LocalData Initialize
connStr =
Data Source = localhost;Initial Catalog=DDB;User ID=sa;Password=;
;
sqlConn = new SqlConnection(connStr);
}
public DataSet GetDataSet() // 執行select
{
DataSet ds = new DataSet();
if (sqlComm != null)
{
sqlComm = null;
}
if(sqlConn
State == ConnectionState
Closed)
{
sqlConn
Open();
}
try
{
sqlComm = new SqlCommand();
sqlComm
Connection = sqlConn;
sqlComm
CommandText = clientSql;
sqlComm
CommandType = CommandType
Text;
sqlAdapter = new SqlDataAdapter();
sqlAdapter
SelectCommand = sqlComm;
sqlAdapter
Fill(ds);
}
catch(SqlException ex)
{
MessageBox
Show(ex
Message);
}
return ds;
}
public int ExecuteSql() //執行insert和delete
{
int affectedNumber;
if (sqlComm != null)
{
sqlComm = null;
}
if(sqlConn
State == ConnectionState
Closed)
{
sqlConn
Open();
}
try
{
sqlComm = new SqlCommand();
sqlComm
Connection = sqlConn;
sqlComm
CommandType = CommandType
Text;
sqlComm
CommandText = clientSql;
affectedNumber = sqlComm
ExecuteNonQuery();
return affectedNumber;
}
catch(SqlException ex)
{
MessageBox
Show(ex
Message);
return
;
}
}
}
}
服務器端代碼
private void frmSupplierServer_Load(object sender
System
EventArgs e)
{
TcpChannel chan = new TcpChannel(
);
ChannelServices
RegisterChannel(chan);
//注冊提供服務的遠程對象 RemotingConfiguration
RegisterWellKnownServiceType(typeof(DbServerLibrary
DbServer)
DbServer
WellKnownObjectMode
Singleton);
}
客戶端代碼
解析SQL
SqlParse
cs
namespace SupplierClient
{
public class SqlParse
{
//得到sql語句的類型
public string GetSqlType(string sqlText) //type of SQL statements
{
}
//得到select語句要查詢的表名
public string GetSelectTableName(string sqlText)
{
}
//得到select語句中的where子句
public string GetWhereClause(string sqlText)
{
From:http://tw.wingwit.com/Article/program/ASP/201311/21754.html