人人做人人澡人人爽欧美,国产主播一区二区,久久久精品五月天,羞羞视频在线观看免费

當前位置:蘿卜系統(tǒng)下載站 > 技術開發(fā)教程 > 詳細頁面

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

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

更新時間:2022-07-08 文章作者:未知 信息來源:網絡 閱讀次數(shù):

轉換現(xiàn)有代碼


有許多 ASP 頁面使用 ADO 對象來抽取數(shù)據(jù)。讓我們來討論幾種典型的情況,您在不久的將來移植和改編代碼時可能會遇上這些情形。
如果您有從單個記錄集生成報表的 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 來輸出數(shù)據(jù)
} 

您還可以用 HasMoreRows 屬性快速檢查 DataReader 是否為空。如果您只需要快速瀏覽一系列記錄,沒有比 DataReader 更好更快的對象了。它同樣適用于查詢單個記錄。您不能編輯 DataReader 的內容,但您可以將其內容移入更易于管理的對象,例如 DataTable 或者一個或多個 DataRow 對象。
當您需要處理表和記錄之間的復雜關系時,DataReader 就不再是合適的工具了。在 ADO 中, 最終您需要處理記錄集。您的數(shù)據(jù)模型鏈接越多,SQL 命令就越復雜。導航模型仍然是順序的,最后放入緩存的數(shù)據(jù)往往多于你所需要的。DataSetDataRelation 對象是這種表關系模型的基礎。
為了管理父/子關系,ADO 還封裝了數(shù)據(jù)形成引擎。從功能上講,數(shù)據(jù)形成和 ADO.NET 關系是一樣的。然而,從設計方面來看,它們幾乎沒有什么共同點。形成記錄集將所有信息嵌入單個列表對象。ADO.NET 關系是您可以隨時在兩個數(shù)據(jù)表之間建立的動態(tài)鏈接。為了在執(zhí)行單個 ADO 命令的過程中創(chuàng)建一個層次結構記錄集,ADO 要依靠 Shaping OLE DB 服務提供程序,并且使用特定的類 SQL 語言。
在 ADO.NET 中,關系中涉及的每個對象總是被看成單獨的個體。關系本身作為對象被公開,并且具有一定的行為規(guī)則。例如,DataRelation 對象可以從父行到子行一層層進行更改。您可以通過將 ForeignKeyConstraint 對象添加到 DataTableConstraints 集合中來進行此操作。ForeignKeyConstraint 對象表示當刪除或更新數(shù)值和行時,對通過外鍵關系相關聯(lián)的一組列的約束。如前面提到的,一旦設置好了關系,在它按程序預設終止之前,您不能進行可能破壞該關系的更改。
另外,關系是不可傳遞的。您可以建立兩組不同的關系,例如客戶和訂單、訂單和產品之間的關系。然而,當在訂單中導航以尋找某一位客戶時,您不能從一個訂單跳到與之相關的產品行。您必須另外打開訂單/產品關系,定位到您需要的訂單,然后才能獲取相關的行。這就是為什么有時候最好不要通過原來的無格式 SQL JOIN 語句實現(xiàn)一對一關系的原因。
需要在 ASP Session 對象中存儲記錄嗎?利用 ADO.NET 和 DataSet 對象,您可以相當安全的操作而不會導致在在 GIT 中存儲 ADO 記錄集可能會導致訪問沖突(英文)中所討論的問題,也不會有線程相似性的麻煩。

更新數(shù)據(jù)


更新數(shù)據(jù)時,Web 應用程序通常使用無格式 SQL 語句,或者使用更好的參數(shù)化存儲過程。然而,當需要使用未連接的數(shù)據(jù)時,您可能想使用內置服務來更新所有需要修訂的記錄。ADO 提供了批更新機制來實現(xiàn)這個功能。
UpdateBatch 方法用于把保存在副本緩沖中的 Recordset 更改發(fā)送到服務器,以更新數(shù)據(jù)源。它采用開放式鎖定,允許所有掛起的本地更改。它還在單個操作中把所有更改傳送到數(shù)據(jù)源。僅當更改提交后數(shù)據(jù)源鎖定要更改的記錄時,才會出現(xiàn)開放式鎖定。開放式鎖定使兩個用戶可以同時訪問同一個記錄,但一個用戶輸入的更改很快會被另一用戶所覆蓋。當然,這種方式要求數(shù)據(jù)源能夠檢測和防止數(shù)據(jù)沖突。還要求整個數(shù)據(jù)源比較穩(wěn)定,不會發(fā)生頻繁的更改。否則,不難想象協(xié)調費用將很快超過替代嚴格鎖定所帶來的節(jié)約。事實上,使用 UpdateBatch 方法,在任何更改失敗時都會返回一個錯誤。然后,您可以通過 Errors 集合和 Error 對象來訪問該錯誤。
要理解 ADO.NET 模型為什么是更新數(shù)據(jù)的更強大的工具,理解 ADO 中開放式鎖定的工作原理是非常關鍵的。在 ADO 代碼中,您無法控制調用 UpdateBatch 之后所發(fā)生的一切。也就是說,更新是在服務器上通過滾動已更改的行,然后比較原始值和數(shù)據(jù)源中對應記錄中的當前值來進行的。當所有的值都一致了,才對表執(zhí)行適當?shù)?SQL 語句(INSERT、UPDATE 或 DELETE)。
問題在于您不能控制實際應用于更改的 SQL 語句。服務器端的更新代碼并不比您編寫的代碼好,如果您采用非 SQL 提供程序,它甚至無法運行。在本節(jié)的開頭,我曾講過 Web 應用程序通常通過參數(shù)化存儲過程來更新數(shù)據(jù)。然而,如果您使用批更新就不同了。
在 ADO.NET 中,這個模型已經有所擴展。現(xiàn)在它采用更通用的架構,允許您自己指定基本操作命令,例如插入、刪除、更新和選擇等。其用意很明顯:不論何種數(shù)據(jù)源,都可以從中抽取數(shù)據(jù)并提供同樣的支持。在 ADO.NET 中進行批更新,您需要創(chuàng)建 DataSetCommand 對象即 SQLDataSetCommandADODataSetCommand
注意:在 Beta 2 中,DataSetCommand 對象將被稱為 DataAdapter 對象。
擁有 DataSetCommand 對象之后,您便可以調用它的 Update 方法。DataSetCommand 提供 InsertCommandDeleteCommandUpdateCommandSelectCommand 等屬性。它們都是 Command 對象。但是,除非默認行為無法滿足需要,否則您不必設置它們。這與在 ADO 中一樣。在 Update 過程中,如果沒有設置任何 xxxCommand 屬性,但是存在主鍵信息,將自動生成 Command 對象。請注意,要使上述過程正確進行,必須為所涉及的數(shù)據(jù)表設置主鍵。
以下代碼顯示了如何為 DataSet 的 EmployeesList 表設置主鍵:
DataColumn[] keys = new DataColumn[1];
keys[0] = m_oDS.Tables["EmployeesList"].Columns["EmployeeID"]; 
m_oDS.Tables["EmployeesList"].PrimaryKey = keys;

主鍵基本上是 DataColumn 對象的一個數(shù)組。
如果您要使用存儲過程來更新表,或者采用專用非 SQL 數(shù)據(jù)提供程序,您會經常用到這些命令屬性。

XML 擴展支持


在 ADO 中,XML 只不過是輸入和輸出格式。然而在 ADO.NET 中,XML 是一種數(shù)據(jù)格式,提供了操作、組織、共享和傳遞數(shù)據(jù)的手段。任何帶入 DataSet 的數(shù)據(jù),無論其來源,都能通過雙面編程模型進行處理。您可以順序交替訪問信息,或者按行訪問,也可以按照 XML 文檔對象模型驅動的非順序、層次結構路徑進行訪問。
DataSet 將數(shù)據(jù)和架構作為 XML 文檔進行讀寫。數(shù)據(jù)和架構都可以通過 HTTP 傳輸,并且能在所有支持 XML 的平臺上使用。相同的數(shù)據(jù)在不同的時候可以通過不同的架構來呈現(xiàn),這是通過 XSLT 實現(xiàn)的。您可以使用 ReadXmlSchema 方法編寫架構。XML 架構包括數(shù)據(jù)集中的表的說明,以及表的關系和約束。在調用 ReadXmlData 方法填充 DataSet 之前,應該先完成這個步驟。
以下代碼示例是一個顯示可更新數(shù)據(jù)表的最簡單的 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 數(shù)據(jù)和架構 
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 節(jié)點或 XMLDOM 方法。您可以用相同的直觀數(shù)據(jù)表接口來讀取和更新 XML 記錄。您的工作方式與在 ADO 中大致相同,但此處的模型更深入、更龐大,有更多的潛力供您去發(fā)掘。

/article/UploadPic/2006719105137498.gif

圖 2:可更新表的示例

總結


Web 應用程序的成功改變了典型分布式系統(tǒng)的面貌。現(xiàn)在大多數(shù)分布式系統(tǒng)都是 n 層系統(tǒng),這類系統(tǒng)對擴展性和互操作性的要求越來越高。因此,非連接數(shù)據(jù)處理和 XML 成為最佳實踐,并為業(yè)界廣為接受。
ADO.NET 嘗試將當今一些最好的實踐統(tǒng)一在 .NET 下。這種用于數(shù)據(jù)訪問的編程模型全面而又非常強大。但這個模型可能尚不能滿足每一個人的要求,在將來的模型設計中還需要邁出一大步。然而,請記住現(xiàn)在 ADO.NET 還只是 Beta 版,只有有限的文檔支持。
ADO 程序員從 Beta 版中獲益最多,因為他們熟悉了 ADO.NET 的許多方面,包括最高層次的抽象即啟發(fā)性模型。ADO.NET 代碼與現(xiàn)有的 ADO 代碼不兼容,但功能相似。要充分利用 ADO.NET,您應該花些功夫來理解概念本身,而不僅僅是找出移植代碼的最快方式。無論您選擇何種 .NET 編程模型,Windows 窗體、Web 窗體還是 Web 服務,ADO.NET 都會幫助您處理好數(shù)據(jù)訪問的問題。

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統(tǒng)下載排行

網站地圖xml | 網站地圖html
主站蜘蛛池模板: 广宗县| 广西| 成武县| 涞水县| 澄城县| 枣强县| 行唐县| 肇州县| 和平区| 金湖县| 迭部县| 毕节市| 建瓯市| 奇台县| 茂名市| 沈丘县| 昌乐县| 定襄县| 安陆市| 永吉县| 田阳县| 若羌县| 神池县| 金川县| 兴和县| 安福县| 普格县| 无极县| 延庆县| 永登县| 天祝| 历史| 吴旗县| 新源县| 永福县| 吴江市| 阿城市| 安化县| 辉南县| 来凤县| 宁安市|