處理ADO.NET標(biāo)準(zhǔn)化注意問題
本章簡明扼要的進(jìn)行說明。針對ADO.NET標(biāo)準(zhǔn)化以及他的更多功能,還有一些功能請參照微軟官網(wǎng)發(fā)布的實(shí)時消息,那上面講述了一些你知道和不知道的內(nèi)容,歡迎大家進(jìn)行訪問。
粗看起來,ADO.NET提供的模型是零散的,因?yàn)樗鼪]有包含一個通過的對象集,來處理多種不同類型的數(shù)據(jù)庫。盡管不同的.NET數(shù)據(jù)提供者使用不同的類,但所有提供者都是采用同一方法進(jìn)行標(biāo)準(zhǔn)化的。說得更明確一點(diǎn),就是每個提供者都是基于相同的基類和接口集。例如,每個連接對象都執(zhí)行IDbConnection接口,這些接口定義了核心的方法,如Open()、Close()。這個標(biāo)準(zhǔn)化保證每個連接類以同樣的方式工作,并且向用戶提供的核心屬性和方法集是一樣的。
在可視的界面之后,不同的提供者使用完全不同的底層調(diào)用和API。舉個例來說,ADO.NET標(biāo)準(zhǔn)化SQL Server提供者使用私有的TDS(Tabular Data Stream)協(xié)議來與服務(wù)器通信。這個模型的好處并不是顯而易見的,但它們很重要:
因?yàn)槊總€提供者使用相同的接口和基類,你可以編寫通用的數(shù)據(jù)訪問代碼(只需一點(diǎn)點(diǎn)的努力),而不是需要針對具體的提供者類編寫代碼。你將在“Provider-Agnostic Code”一節(jié)中看到這個技術(shù)所起的作用。
由于每個提供者的實(shí)現(xiàn)是完全分離的,ADO.NET標(biāo)準(zhǔn)化可以使用私有的優(yōu)化措施(這與ADO模型不同。在ADO中,ADO.NET標(biāo)準(zhǔn)化每個數(shù)據(jù)庫調(diào)用需要在到達(dá)底層數(shù)據(jù)庫驅(qū)動前要使用通過的層來進(jìn)行過濾)。另外,自定義提供者能夠添加非標(biāo)準(zhǔn)的功能,擴(kuò)展在其它提供者中的不足(如SQL Server能夠執(zhí)行XML查詢)。
ADO.NET也有另一個標(biāo)準(zhǔn)的層:DataSet。DataSet是一個能滿足所有要求的數(shù)據(jù)容器,這些數(shù)據(jù)來自于一個數(shù)據(jù)源的一個或多個表。DataSet非常通用,換句話說,自定義提供者不需要定義DataSet類的自定義版本。無論你使用哪種數(shù)據(jù)提供者,你都能夠以同樣的方法提取數(shù)據(jù)和將數(shù)據(jù)放入未連接的DataSet。ADO.NET標(biāo)準(zhǔn)化這樣就使得數(shù)據(jù)獲取代碼和數(shù)據(jù)處理代碼分離開來。如果你改變了底層的數(shù)據(jù)庫,你只需要改變數(shù)據(jù)獲取代碼,但如果你使用的DataSet和你的信息具有相同的結(jié)構(gòu),你就不需要改變數(shù)據(jù)處理的方法。
提示:下一章將對DataSet進(jìn)行詳細(xì)介紹,你將學(xué)到如何使用ADO.NET執(zhí)行直接的、基于連接的訪問的基本原理。