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

ADO.NET:通向未來之橋

2013-11-13 10:27:12  來源: .NET編程 

  在Web跨入編程時代之前對於大多數IT管理者和顧問來說數據訪問只是一個相對而言的問題所有要用到的數據都必須自己准備好人們主要關心的問題是選擇性能/價格比最好的數據庫服務器系統涉及的所有模塊必須和服務器兼容客戶機/服務器應用是這種兩層模型最典型的范例
  
  隨著Web交互性的日益提高和應用的日益廣泛對於第三層——中間層的需求也越來越突出中間層是一個邏輯層數據訪問組件通常就在這一層上數據訪問組件是唯一有必要了解數據庫細節的代碼同時准備更換或者升級數據庫服務器時數據訪問組件也是第一個需要修改的地方
  
  接下來三層系統模型發展成了Windows DNA——現在稱為Microsoft NET服務器系統Microsoft利用一個統一的模型進行數據訪問這個模型注重的是內容而不是數據格式和存儲媒介它的具體表達方式建立在UDA(Universal Data Access通用數據訪問)的基礎之上而UDA正是激勵OLE DB體系發展的深層理念為了提供一種通過VB和ASP COM組件方便地無縫地訪問OLE DB功能的途徑Microsoft設計了ADOADO 是用來支持OLE DB的第一個版本在幾年之內ADO發展到了版本增加和擴展了XML支持使得經過擴展的ADO對象模型能夠匹配所有OLE DB改進功能(例如對於OLE DB新增的Row和Stream對象ADO 提供了類似的ADO配套功能)
  
  ADO 的核心功能超越了OLE DB
  
  在多層系統中隨著中間層組件的出現如何為表現層提供最新數據這一問題也隨之出現表現層怎樣訪問數據?連接怎樣打開?或者我們是否應該維護一份脫機記錄(即一些斷開連接之後仍舊能夠在表現層使用的數據庫記錄)?ADO 以及它的更高版本同時提供了對服務器端游標和脫機記錄集的支持(脫機記錄集是一種COM對象它可以跨越網絡串行化客戶可以下載它然後脫機使用)
  
  服務器端游標代表著一個緊密結合的保持連接的環境在這個環境中我們總是維持著各個層之間的有效通道只有結束時才拆除連接與此相反脫機記錄集是一個有狀態的對象我們可以把它作為一個整體處理且不必維持連接脫機記錄集使用客戶端的靜態游標能夠提供一個數據源的快照對於那些只有讀取要求且需要在各個系統層之間移動數據的應用程序來說脫機記錄集是很理想的今天大多數Web應用程序要求在各個層之間傳輸數據為了獲取這些數據我們經常使用快速的只能向前游標用XML編碼數據然後通過網絡發送數據避免了在Web服務器上維持會話狀態信息在分布式環境中數據庫連接是一種關鍵性的資源以脫機方式工作保證了高可伸縮性
  
  然而Web是一把雙刃劍Web讓我們連接到任何類型的聯機服務而且能夠與它們進行交互但是Web也要求一定程度的互操作性因為操作所涉及的各個服務可能運行在不同的軟件和硬件平台上我們可以通過利用開放的標准以及那些不注重私有權的技術——甚至是象COM+這類廣泛應用的私有技術跨越不同的平台
  
  今天基於Windows的Web數據訪問應用程序利用了ADO豐富的方便的編程接口然而ADO對象天生地定位在Windows平台上ADO基於COM的本性使得記錄集很難在一個分布式異種平台構成的環境中使用另外即使目標平台可能允許我們使用ADO記錄集它也不具備最有效的機制ADONET的DataSet和DataReader更有效而且如果沒有ADONET有些時候我們還可以借助XML或純文本獲得高效率
  
  為了在Web環境下傳輸數據Microsoft對ADO記錄集進行了優化但COM類型轉換仍舊是一個必不可少的步驟因為COM的數據類型不可能總是匹配ADO記錄集的數據類型(例如String類型必須轉換成BSTR類型)由此許多人把XML當成了粘合各個層的萬能膠水——不管涉及到了哪些平台通常的做法是先提取一個記錄集把它保存為XML格式然後傳輸結果數據流讓接收者從這個XML數據流重新構造出記錄集供以後使用隨著對協同工作能力和可伸縮性要求的提高ADO不再是最理想的答案因為它不是建立在XML的基礎上——但ADONET是
  
  ADO在Web環境中的不足
  
  NET框架創立了一種取代COM和COM+的新組件模型NET的提出是Microsoft成熟的組件技術的新戰略雖然幾個關鍵性的COM特色不再在NET中出現但在某些方面NET與COM編程仍舊很相似因此COM程序員將能夠方便地轉向NET開發ADONET是Microsoft特別為NET框架設計的數據訪問層它在很大程度上利用了NET的優勢
  
  為什麼NET必須用一個新的數據訪問層來替代現有的廣泛應用的數據訪問接口比如ADO?現代Web應用系統必須具備客戶機/服務器應用和桌面應用的交互能力Microsoft設計NET的目標正是為了迎接設計現代Web應用系統的挑戰同時NET也利用了各種Web協議廣泛的強大的連接能力和協同操作能力
  
  在非Windows平台上ADO記錄集不能直接使用從而使得協同操作能力受到了限制為了突破這個限制我們要把記錄集轉換成XML格式然後傳輸轉換得到的XML記錄集在ADONET中把數據轉換成XML以及通過網絡傳輸的操作得到了簡化和優化另外ADO對象模型中的每一個地方都體現了以數據庫為中心的思想ADO把數據看成是一組來自數據源的記錄而不是把數據看成一些獨立的信息在ADO中如果脫離了數據提供者用來保存和描述數據的結構數據將不能獨立存在
  
  ADONET數據集和ADO記錄集
  
  ADONET是從Web的角度對ADO進行檢討和改進Microsoft對ADONET的設計嚴格地體現了其名字的含義ADO再加上NETADONET自動連接網絡致力於讓Web數據訪問變得更加簡單和高效兩個功能使得這方面的增強成為可能脫機記錄集以及與生俱來的對XML的支持由於采用了脫機記錄集方案ADONET自然也就不再支持服務器端游標ADONET天生就把記錄數據保存為XML文檔把模式(Schema)和數據視為分離的可替換的元素
  
  如果你認為ADO早就提供了這些功能它們並沒有什麼創新意義那麼ADONET還提供了其他許多新的功能ADONET能夠使用連接的或者非連接的(脫機的)記錄集具體由用戶選擇的游標類型和游標位置決定ADO記錄集的本地存儲格式是ADTG文件格式(Advanced Data TableGram高級數據表圖)ADTG是一種Microsoft私有的二進制存儲模式代表著記錄集在內存中的映像XML是可替換使用的確定的詳細輸出格式在ADONET中我們可以斷開一個記錄集集合的連接通過一個默認(但允許更改)的XML模式再現記錄集集合
  
  在ADONET對象模型中DataSet(數據集)是最重要的對象一般地一個DataSet對象就是一個記錄集的集合ADONET框架提供了記錄集的所有數據庫功能排序分頁過濾視圖關系索引和主鍵
  
  DataSet對象代表了一個在內存中的有著豐富功能的數據緩沖區DataSet對象也通過表組織數據這些表與原始的數據源之間不存在連接我們可以添加表表可以通過讀取本地或遠程XML文件獲得或者也可以從任何可訪問的系統資源(包括內存和其他附屬設備在內)讀取我們可以排序索引過濾數據表象處理ADO的Recordset一樣導航數據表
  
  我們可以通過命令用數據集合填充DataSet對象如果用NET集合的形式為DataSet對象提供數據表(具有集合功能的NET數據類型是ICollection)同一個DataSet對象能夠服務來自多個連接的多個請求ADONET的DataSet對象比ADO的Recordset更一般化與ADO的Recordset不同它是對數據源的一種抽象然而DataSet對象保留了一個在內存中工作的數據存儲器它沒有完全淘汰記錄集功能如果我們只需要一次性地滾動記錄集然後生成某種輸出那麼我們應該使用DataReader對象NET的DataReader對象類似於只能向前只讀的記錄集但它是一個高度專用化的對象所以無論在體積和開銷上它都要比記錄集小事實上記錄集能夠執行許多不同的任務是一個相當臃腫的對象與ADO的Recordset相比DataReader不包含進行家務管理的代碼除了實現功能所必需的代碼之外它不包含任何其他代碼
  
  把多個表作為一個整體管理以及允許建立這些表之間的關系這是ADONET的新功能我們可以用XML形式持久化或傳輸任何DataSet對象而且無需付出任何額外的代價因為DataSet對象本身就是按照XML格式構造因此除非要修改底層模式否則我們無需為了獲得一個XML流而去轉換DataSet對象的任意一個部分
  
  ADONET對象詳解
  
  ADO和ADONET有著兩個截然不同的對象模型ADO定位在基於Windows 和NT的服務器平台ADONET定位在支持NET的平台Microsoft預期在年末推出第一個NET OS——Windows XP(原來的代碼名字為Whistler)不過它的後繼產品(代碼名字為Blackcomb)更有可能提供一個全功能的NET OS
  
  如果要遷移代碼我們可以把現有的ADO代碼導入到NET應用之中從而節省在編寫代碼方面的投入然而如果不做重大的設計調整同樣的代碼幾乎不可能移植到ADONETADO和ADONET的對象模型不一樣兩者在不同的設計指導思想下完成
  
  ADONET只用來構造基於NET服務器的Web應用ADONET是NET應用程序的數據訪問API因此只有把服務器升級到NET之後你才可以考慮ADONET在同一個應用程序中讓ADO和ADONET協同運作是沒有什麼意義的雖然你可以同時使用這兩者(至少從設計的角度來看)但這並不是一種好的選擇
  
  ADONET的對象主要包括DataSetDataTableDataColumnDataRow和DataRelation這些對象的主要特點說明如下
  
  ▲ DataSet這個對象是一個集合對象它可以包含任意數量的數
From:http://tw.wingwit.com/Article/program/net/201311/13674.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.