為 ADO 程式員設計的 ADO.NET (2)

來源:互聯網
上載者:User
ado|程式|程式員|設計 轉換現有代碼
有許多 ASP 頁面使用 ADO 對象來抽取資料。讓我們來討論幾種典型的情況,您在不久的將來移植和改編代碼時可能會遇上這些情形。
如果您有從單個記錄集產生報表的 ASP 頁面, DataReader 對象將是您最好的夥伴。
您瀏覽 DataReader 對象時,它會將結果輸出到頁面。
String strConn, strCmd; 
strConn = "DATABASE=MyAgenda;SERVER=localhost;UID=sa;PWD=;"; 
strCmd = "Select * From Names where ID=" + contactID.Text; 
SQLConnection oCN = new SQLConnection(strConn); 
SQLCommand oCMD = new SQLCommand(strCmd, oCN); 
oCN.Open(); 
SQLDataReader dr; 
oCMD.Execute(out dr); 
while (dr.Read()) 
{ // 使用 dr.GetString(index) 或 
// dr["field name"] 的方法 Response.Write 來輸出資料
} 

您還可以用 HasMoreRows 屬性快速檢查 DataReader 是否為空白。如果您只需要快速探索一系列記錄,沒有比 DataReader 更好更快的對象了。它同樣適用於查詢單個記錄。您不能編輯 DataReader 的內容,但您可以將其內容移入更易於管理的對象,例如 DataTable 或者一個或多個 DataRow 對象。
當您需要處理表和記錄之間的複雜關係時,DataReader 就不再是合適的工具了。在 ADO 中, 最終您需要處理記錄集。您的資料模型連結越多,SQL 命令就越複雜。導航模型仍然是順序的,最後放入緩衝的資料往往多於你所需要的。 DataSetDataRelation 對象是這種表關聯式模式的基礎。
為了管理父/子關係,ADO 還封裝了資料形成引擎。從功能上講,資料形成和 ADO.NET 關係是一樣的。然而,從設計方面來看,它們幾乎沒有什麼共同點。形成記錄集將所有資訊嵌入單個列表對象。ADO.NET 關係是您可以隨時在兩個資料表之間建立的動態連結。為了在執行單個 ADO 命令的過程中建立一個階層記錄集,ADO 要依靠 Shaping OLE DB 服務提供者,並且使用特定的類 SQL 語言。
在 ADO.NET 中,關係中涉及的每個對象總是被看成單獨的個體。關係本身作為對象被公開,並且具有一定的行為規則。例如, DataRelation 對象可以從父行到子行一層層變更。您可以通過將 ForeignKeyConstraint 對象添加到 DataTableConstraints 集合中來進行此操作。 ForeignKeyConstraint 對象表示當刪除或更新數值和行時,對通過外鍵關係相關聯的一組列的約束。如前面提到的,一旦設定好了關係,在它按程式預設終止之前,您不能進行可能破壞該關係的更改。
另外,關係是不可傳遞的。您可以建立兩組不同的關係,例如客戶和訂單、訂單和產品之間的關係。然而,當在訂單中導航以尋找某一位客戶時,您不能從一個訂單跳到與之相關的產品行。您必須另外開啟訂單/產品關係,定位到您需要的訂單,然後才能擷取相關的行。這就是為什麼有時候最好不要通過原來的無格式 SQL JOIN 語句實現一對一關聯性的原因。
需要在 ASP Session 對象中儲存記錄嗎?利用 ADO.NET 和 DataSet 對象,您可以相當安全的操作而不會導致在在 GIT 中儲存 ADO 記錄集可能會導致存取違規(英文)中所討論的問題,也不會有線程相似性的麻煩。 更新資料
更新資料時,Web 應用程式通常使用無格式 SQL 陳述式,或者使用更好的參數化預存程序。然而,當需要使用未串連的資料時,您可能想使用內建服務來更新所有需要修訂的記錄。ADO 提供了批更新機制來實現這個功能。
UpdateBatch 方法用於把儲存在副本緩衝中的 Recordset 更改發送到伺服器,以更新資料來源。它採用開放式鎖定,允許所有掛起的本地更改。它還在單個操作中把所有更改傳送到資料來源。僅當更改提交後資料來源鎖定要更改的記錄時,才會出現開放式鎖定。開放式鎖定使兩個使用者可以同時訪問同一個記錄,但一個使用者輸入的更改很快會被另一使用者所覆蓋。當然,這種方式要求資料來源能夠檢測和防止資料衝突。還要求整個資料來源比較穩定,不會發生頻繁的更改。否則,不難想象協調費用將很快超過替代嚴格鎖定所帶來的節約。事實上,使用 UpdateBatch 方法,在任何更改失敗時都會返回一個錯誤。然後,您可以通過 Errors 集合和 Error 對象來訪問該錯誤。
要理解 ADO.NET 模型為什麼是更新資料的更強大的工具,理解 ADO 中開放式鎖定的工作原理是非常關鍵的。在 ADO 代碼中,您無法控制調用 UpdateBatch 之後所發生的一切。也就是說,更新是在伺服器上通過滾動已更改的行,然後比較原始值和資料來源中對應記錄中的當前值來進行的。當所有的值都一致了,才對錶執行適當的 SQL 陳述式(INSERT、UPDATE 或 DELETE)。
問題在於您不能控制實際應用於更改的 SQL 陳述式。伺服器端的更新代碼並不比您編寫的代碼好,如果您採用非 SQL 提供者,它甚至無法運行。在本節的開頭,我曾講過 Web 應用程式通常通過參數化預存程序來更新資料。然而,如果您使用批更新就不同了。
在 ADO.NET 中,這個模型已經有所擴充。現在它採用更通用的架構,允許您自己指定基本操作命令,例如插入、刪除、更新和選擇等。其用意很明顯:不論何種資料來源,都可以從中抽取資料並提供同樣的支援。在 ADO.NET 中進行批更新,您需要建立 DataSetCommand 對象即 SQLDataSetCommandADODataSetCommand
注意:在 Beta 2 中, DataSetCommand 對象將被稱為 DataAdapter 對象。
擁有 DataSetCommand 對象之後,您便可以調用它的 Update 方法。 DataSetCommand 提供 InsertCommandDeleteCommandUpdateCommandSelectCommand 等屬性。它們都是 Command 對象。但是,除非預設行為無法滿足需要,否則您不必設定它們。這與在 ADO 中一樣。在 Update 過程中,如果沒有設定任何 xxxCommand 屬性,但是存在主鍵資訊,將自動產生 Command 對象。請注意,要使上述過程正確進行,必須為所涉及的資料表設定主鍵。
以下代碼顯示了如何為 DataSet 的 EmployeesList 表設定主鍵:
DataColumn[] keys = new DataColumn[1];
keys[0] = m_oDS.Tables["EmployeesList"].Columns["EmployeeID"]; 
m_oDS.Tables["EmployeesList"].PrimaryKey = keys;

主鍵基本上是 DataColumn 對象的一個數組。
如果您要使用預存程序來更新表,或者採用專用非 SQL 資料提供者,您會經常用到這些命令屬性。 XML 擴充支援
在 ADO 中,XML 只不過是輸入和輸出格式。然而在 ADO.NET 中,XML 是一種資料格式,提供了操作、組織、共用和傳遞資料的手段。任何帶入 DataSet 的資料,無論其來源,都能通過雙面編程模型進行處理。您可以順序交替訪問資訊,或者按行訪問,也可以按照 XML 文件物件模型驅動的非順序、階層路徑進行訪問。
DataSet 將資料和架構作為 XML 文檔進行讀寫。資料和架構都可以通過 HTTP 傳輸,並且能在所有支援 XML 的平台上使用。相同的資料在不同的時候可以通過不同的架構來呈現,這是通過 XSLT 實現的。您可以使用 ReadXmlSchema 方法編寫架構。XML 結構描述包括資料集中的表的說明,以及表的關係和約束。在調用 ReadXmlData 方法填充 DataSet 之前,應該先完成這個步驟。
以下程式碼範例是一個顯示可更新資料表的最簡單的 ASP.NET 頁面。
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.IO" %>
<script runat="server" language="C#">
void Page_Load(Object source, EventArgs e)
{   DataSet data = new DataSet();      
// 載入 XML 資料和架構   
StreamReader sr;   
sr = new StreamReader(Server.MapPath("data.xml"));   
data.ReadXml(sr);   
sr.Close();      
// 添加通過 URL 傳遞的新記錄   
if (Request.QueryString.Count >0)   
{
      DataTable dt = data.Tables[0];
      DataRow dr = dt.NewRow();
      dr["FirstName"] = Request.QueryString["First"];
      dr["LastName"] = Request.QueryString["Last"];
      dt.Rows.Add(dr);
      dt.AcceptChanges();
            StreamWriter sw;
      sw = new StreamWriter(Server.MapPath("data.xml"));
      data.WriteXml(sw);
      sw.Close();
   }
      // 重新整理 UI(由網格組成)
   grid.DataSource = data.Tables[0].DefaultView;
   grid.DataBind();
}
</script>


如圖 2 所示,您可以將新的行添加到表中。然而,它不涉及 SQL Server 或 Access 表。它只是一個 XML 檔案,在處理它的代碼中,沒有使用 XML 節點或 XMLDOM 方法。您可以用相同的直觀資料表介面來讀取和更新 XML 記錄。您的工作方式與在 ADO 中大致相同,但此處的模型更深入、更龐大,有更多的潛力供您去發掘。

adonetdev02.gif

圖 2:可更新表的樣本 總結
Web 應用程式的成功改變了典型分布式系統的面貌。現在大多數分布式系統都是 n 層系統,這類系統對擴充性和互通性的要求越來越高。因此,非串連資料處理和 XML 成為最佳實務,並為業界廣為接受。  
ADO.NET 嘗試將當今一些最好的實踐統一在 .NET 下。這種用於資料訪問的編程模型全面而又非常強大。但這個模型可能尚不能滿足每一個人的要求,在將來的模型設計中還需要邁出一大步。然而,請記住現在 ADO.NET 還只是 Beta 版,只有有限的文檔支援。
ADO 程式員從 Beta 版中獲益最多,因為他們熟悉了 ADO.NET 的許多方面,包括最高層次的抽象即啟發性模型。ADO.NET 代碼與現有的 ADO 代碼不相容,但功能相似。要充分利用 ADO.NET,您應該花些功夫來理解概念本身,而不僅僅是找出移植代碼的最快方式。無論您選擇何種 .NET 編程模型,Windows 表單、Web Form還是 Web 服務,ADO.NET 都會協助您處理好資料訪問的問題。

相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。