熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> ASP編程 >> 正文

.NET Remoting 實現分布式數據庫查詢

2013-11-15 12:51:28  來源: ASP編程 

  開始動手之前你需要了解NET Remoting 技術的基本理論熟悉分布式數據庫原理熟練掌握ADONET並熟悉VSNET的開發環境下面僅就這幾個方面做些簡單的介紹
  
  Remoting一種分布式處理方式也可將它看作是DCOM的一種升級它改善了很多功能並極好的融合到Net平台下NET Remoting 提供了一種允許對象通過應用程序域與另一對象進行交互的框架
  
  在Remoting中是通過通道(channel)來實現兩個應用程序域之間對象的通信的
  
  首先客戶端通過Remoting訪問通道以獲得服務端對象再通過代理解析為客戶端對象這就提供一種可能性即以服務的方式來發布服務器對象遠程對象代碼可以運行在服務器上(如服務器激活的對象和客戶端激活的對象)然後客戶端再通過Remoting連接服務器獲得該服務對象並通過序列化在客戶端運行
  
  在Remoting中對於要傳遞的對象設計者除了需要了解通道的類型和端口號之外無需再了解數據包的格式但必須注意的是客戶端在獲取服務器端對象時並不是獲得實際的服務端對象而是獲得它的引用這既保證了客戶端和服務器端有關對象的松散耦合同時也優化了通信的性能
  
  分布式數據庫系統
  
  就其本質而言分布式數據庫系統的數據在邏輯上是統一的而在物理上卻是分散的與集中式數據庫相比它有如下主要優點
  
  · 解決組織機構分散而數據需要相互聯系的問題
  
  · 均衡負載負載在各處理機間分擔可避免臨界瓶頸
  
  · 可靠性高數據分布在不同場地且存有多個副本即使個別場地發生故障不致引起整個系統的癱瘓
  
  · 可擴充性好當需要增加新的相對自主的組織單位時可在對當前機構影響最小的情況下進行擴充
  
  ADONET
  
  分布式數據庫系統雖然有諸多優點但它同時也帶來了許多新問題數據一致性問題數據遠程傳遞的實現通信開銷的降低等這使得分布式數據庫系統的開發變得較為復雜幸運的是微軟的NET開發環境為我們提供了C#開發語言和ADONET數據訪問模型結合兩者來開發分布式數據庫系統能夠大大簡化開發工作
  
  ADONET以XML為核心Net數據庫應用程序的解決方案它使用離線數據結構數據源中的數據被緩存到數據集(DataSet)對象中用戶無須鎖定數據源數據以XML格式保存在分布式數據庫系統中很可能出現多個用戶同時訪問和修改數據的情況因此對於分布式數據庫系統數據一致性是不可或缺的ADONET通過使用樂觀一致性方案來控制數據一致性(實際上DataSet對象被設計成支持使用樂觀一致性控制機制)即數據行只有在數據庫中真正被更新時才會被鎖定而在悲觀一致性方案中數據行在從被提取出來到在數據庫中更
  
  新這段時間內一直被鎖定因此使用ADONET能夠在更少的時間內響應數量巨大的用戶
  
  另外在分布式數據庫系統中還會經常遇到當用戶修改自從提取出來以來已經被修改的行時違反一致性原則對此問題ADONET也作了很好地解決即使用DataSet對象為每一條修改過的記錄維護兩個版本原始版本和更新版本在更新的記錄被寫回數據庫之前先要把數據集中記錄的原始版本與數據庫中的當前版本進行比較如果兩個版本匹配就在數據庫中更新記錄否則就會出現違反一致性原則的錯誤
  
  下面開始程序實現
  
  章 系統總體結構
  
   總體結構圖
  
  系統實現需要部署服務器端的遠程對象(即一個DbServerLibrarydll)服務器端要注冊通道和該遠程對象客戶端要實現一個本地查詢的服務器同時根據SQL解析的結果向各個服務器發送命令並將結果顯示在客戶端界面服務器端可以接受並顯示相應的命令
  
   關鍵組件結構圖
  
  系統結構中關鍵的組件有遠程對象和本地服務器實現的功能基本一致下面以遠程對象為例說明組件的實現遠程對象在服務器端解決方案下的庫文件中聲明通過服務器端進行注冊客戶端通過TCP通道與服務器端遠程對象通信實現數據集的查詢和傳輸主要的數據成員有SqlConnection(SQL Server數據庫的連接對象) SqlCommand (SQL命令對象)SqlDataAdapter(數據適配器填充數據集)組件——DbServerLibrary:
  
   章 數據字典結構
  
  因時間倉促未實現數據字典所有實驗要求的SQL經過解析後直接通過代碼判斷向相應場地發送命令
  
   章 代碼結構
  
  代碼分為三部分遠程對象服務器端代碼和客戶端代碼
  
  其中遠程對象部署在各個服務器端客戶端除了實現查詢命令的解析和傳送外外還有一個本地服務器進行相應的本地查詢
  
  遠程對象代碼
  
  using System;
  
  using SystemRuntimeSerialization;
  
  using SystemData;
  
  using SystemDataSqlClient;
  
  using SystemWindowsForms;
  
  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;
  
  MessageBoxShow(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(sqlConnState == ConnectionStateClosed)
  
  {
  
  sqlConnOpen();
  
  }
  
  try
  
  {
  
  sqlComm = new SqlCommand();
  
  sqlCommConnection = sqlConn;
  
  sqlCommCommandText = clientSql;
  
  sqlCommCommandType = CommandTypeText;
  
  sqlAdapter = new SqlDataAdapter();
  
  sqlAdapterSelectCommand = sqlComm;
  
  sqlAdapterFill(ds);
  
  }
  
  catch(SqlException ex)
  
  {
  
  MessageBoxShow(exMessage);
  
  }
  
  return ds;
  
  }
  public int ExecuteSql()  //執行insert和delete
  
  {
  
  int affectedNumber;
  
  if (sqlComm != null)
  
  {
  
  sqlComm = null;
  
  }
  
  if(sqlConnState == ConnectionStateClosed)
  
  {
  
  sqlConnOpen();
  
  }
  
  try
  
  {
  
  sqlComm = new SqlCommand();
  
  sqlCommConnection = sqlConn;
  
  sqlCommCommandType = CommandTypeText;
  
  sqlCommCommandText = clientSql;
  
  affectedNumber = sqlCommExecuteNonQuery();
  
  return affectedNumber;
  
  }
  
  catch(SqlException ex)
  
  {
  
  MessageBoxShow(exMessage);
  
  return ;
  
  }
  
  }
  
  }
  
  }
  
  服務器端代碼
  
  private void frmSupplierServer_Load(object sender SystemEventArgs e)
  
  {
  
  TcpChannel chan = new TcpChannel();
  
  ChannelServicesRegisterChannel(chan);
  
  //注冊提供服務的遠程對象     RemotingConfigurationRegisterWellKnownServiceType(typeof(DbServerLibraryDbServer)                DbServerWellKnownObjectModeSingleton);
  
  }
  
  客戶端代碼
  
  解析SQLSqlParsecs
  
  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
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.