徐祥濤
摘要:ADO.NET是基于.NET平臺(tái)下的數(shù)據(jù)庫(kù)訪問(wèn)技術(shù),本文闡述了ADO.NET的功能、結(jié)構(gòu)和對(duì)象模型,給出了基于C#.NET的ADO.NET技術(shù)訪問(wèn)數(shù)據(jù)庫(kù)的具體實(shí)現(xiàn)過(guò)程,并給出了部分實(shí)現(xiàn)代碼。
關(guān)鍵詞:ADO.NET; 數(shù)據(jù)集; 數(shù)據(jù)提供程序
1 引言
數(shù)據(jù)庫(kù)訪問(wèn)技術(shù)一直是數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)開(kāi)發(fā)中的難點(diǎn)和重點(diǎn),也是每個(gè)數(shù)據(jù)庫(kù)軟件開(kāi)發(fā)者必須要考慮的環(huán)節(jié)。ADO.NET微軟最新的數(shù)據(jù)訪問(wèn)技術(shù),是數(shù)據(jù)庫(kù)應(yīng)用程序和數(shù)據(jù)源間溝通的橋梁,主要提供一個(gè)面向?qū)ο蟮臄?shù)據(jù)存取架構(gòu),用來(lái)開(kāi)發(fā)數(shù)據(jù)庫(kù)應(yīng)用程序。
2 ADO.NET概述
ADO.NET是.NET Framework提供的一系列類,提供了對(duì)關(guān)系數(shù)據(jù)、XML和應(yīng)用程序數(shù)據(jù)的訪問(wèn),是.NET Framework 中最重要的組成部分。
2.1 ADO.NET的功能
ADO.NET是連接系統(tǒng)前、后端的關(guān)鍵。在典型的數(shù)據(jù)庫(kù)應(yīng)用體系結(jié)構(gòu)中,用戶和數(shù)據(jù)庫(kù)系統(tǒng)的交互過(guò)程是:首先,用戶通過(guò)用戶界面向系統(tǒng)發(fā)出數(shù)據(jù)操作的請(qǐng)求,用戶界面接收請(qǐng)求后傳到ADO.NET;然后,ADO.NET分析用戶請(qǐng)求,并通過(guò)數(shù)據(jù)庫(kù)訪問(wèn)接口于數(shù)據(jù)源交互,向數(shù)據(jù)源發(fā)送SQL指令,并從數(shù)據(jù)源獲取數(shù)據(jù);最后,ADO.NET將數(shù)據(jù)訪問(wèn)結(jié)果傳回用戶界面。
2.2 ADO.NET的基本結(jié)構(gòu)
ADO.NET將其組件區(qū)分為:"數(shù)據(jù)存取"與"數(shù)據(jù)操作"兩大類,負(fù)責(zé)完成這些處理的兩大中心組件是:數(shù)據(jù)集(DateSet)和數(shù)據(jù)提供程序(Data Providers)。數(shù)據(jù)集代表了實(shí)際的數(shù)據(jù)而數(shù)據(jù)提供程序就是用來(lái)連接數(shù)據(jù)庫(kù)、執(zhí)行命令和提取結(jié)果的。數(shù)據(jù)提供程序有兩種:一種是SQL Server數(shù)據(jù)提供程序;另一種是一般的數(shù)據(jù)提供程序,它可以與任何一個(gè)OLEDB數(shù)據(jù)源通信。數(shù)據(jù)提供程序包含下列組件專門負(fù)責(zé)數(shù)據(jù)操作并且能夠以快速、順序和只讀方式來(lái)存取數(shù)據(jù):Connection、Command、DataReader和DataAdapter。
3 使用ADO.NET訪問(wèn)數(shù)據(jù)庫(kù)
對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作,首先是與數(shù)據(jù)庫(kù)建立連接,其次發(fā)出SQL命令或存儲(chǔ)過(guò)程進(jìn)行相應(yīng)操作,之后由數(shù)據(jù)集返回所需的數(shù)據(jù)記錄,最后將修改后的結(jié)果返回到數(shù)據(jù)庫(kù)。
3.1 連接數(shù)據(jù)庫(kù)
要使用ADO.NET從數(shù)據(jù)庫(kù)發(fā)送和檢索數(shù)據(jù),必須首先創(chuàng)建對(duì)數(shù)據(jù)庫(kù)的連接。連接是客戶應(yīng)用程序和ADO.NET之間的管道,在ADO.NET的兩種工作模式(連接模式和非連接模式)中都使用。ADO.NET提供了兩個(gè)類來(lái)創(chuàng)建連接,第一個(gè)是通用的OleDbConnection類,它創(chuàng)建處理不同的數(shù)據(jù)庫(kù)類型的連接。第二個(gè)是SqlConnection類,它創(chuàng)建的連接只處理只處理SQL Server數(shù)據(jù)庫(kù),并優(yōu)化了性能。
本文以連接SQL Server數(shù)據(jù)庫(kù)為例,首先建立一個(gè)名為SCN的SqlConnection對(duì)象,再使用ConnectionString屬性來(lái)設(shè)置要連接的數(shù)據(jù)庫(kù)種類和所在的位置,最后用Open方法來(lái)打開(kāi)數(shù)據(jù)庫(kù),如下所示:
SqlConnection SCN = new SqlConnection();
SCN. ConnectionString =
"Persist Security Info=False;User id=sa;pwd=frock;database=Student;server=(local)";
SCN.Open();
3.2 操作數(shù)據(jù)庫(kù)
創(chuàng)建了數(shù)據(jù)庫(kù)連接之后,下一步就是通過(guò)連接發(fā)送請(qǐng)求來(lái)選擇數(shù)據(jù)。對(duì)數(shù)據(jù)庫(kù)執(zhí)行命令操作,如進(jìn)行數(shù)據(jù)的查詢、修改、添加、刪除等,實(shí)際上就是傳送SQL指令,SQL指令封裝在Command對(duì)象中。操縱數(shù)據(jù)庫(kù)可以通過(guò)多種方式來(lái)實(shí)現(xiàn),常用的對(duì)象是SqlCommand對(duì)象(表示一個(gè)SQL操作或者一個(gè)存儲(chǔ)過(guò)程)和SqlDataAdpater對(duì)象(把一個(gè)SqlCommand提交給SQL Server數(shù)據(jù)庫(kù))。
本文以SqlCommand對(duì)象為例,其過(guò)程為:先定義一個(gè)SqlCommand對(duì)象,再通過(guò)設(shè)置它的CommandText屬性來(lái)指定對(duì)數(shù)據(jù)庫(kù)進(jìn)行的操作(SQL語(yǔ)句可以是查詢、添加、修改和刪除等),然后指明SqlCommand對(duì)象所用到的SqlConnection對(duì)象。
SqlCommand SCM = new SqlCommand();
SCM.CommandText = "select * from tdbStudent";
SCM.Connection = SCN;
還有一種更簡(jiǎn)便的方法如下:
SqlCommand SCM = new SqlCommand("select * from tdbStudent", SCN);
根據(jù)不同的操作目的選擇執(zhí)行命令的方式,SqlCommand 特別提供了以下對(duì) SQL Server 數(shù)據(jù)庫(kù)執(zhí)行命令的方法。
3.3 獲取數(shù)據(jù)集
ADO.NET 支持面向流的數(shù)據(jù)訪問(wèn)(如DataReader 對(duì)象)和基于集的數(shù)據(jù)訪問(wèn)(如DataSet 對(duì)象)。
3.3.1 面向流的數(shù)據(jù)訪問(wèn)
可以從數(shù)據(jù)庫(kù)中順向逐條從數(shù)據(jù)庫(kù)中讀取由SELECT 命令返回的只讀數(shù)據(jù)流,而且當(dāng)前內(nèi)存中每次只存一條記錄。DataReader對(duì)象的讀取數(shù)據(jù)方式是先通過(guò)Connection 對(duì)象和數(shù)據(jù)庫(kù)聯(lián)機(jī),再通過(guò)Command 對(duì)象的ExecuteReader 方法執(zhí)行SQLSELECT 命令獲取查詢的數(shù)據(jù), 再通過(guò)DataReader 對(duì)象的屬性和方法,將獲取的數(shù)據(jù)以只讀方式從當(dāng)前的數(shù)據(jù)記錄順向逐條處理,最后將數(shù)據(jù)放入內(nèi)存或直接顯示在窗體上。但是要注意在DataReader 開(kāi)啟時(shí), 必須和數(shù)據(jù)庫(kù)一直保持聯(lián)機(jī), 此時(shí)Connection 只提供給DataReader 使用, 必須等到DataReader 關(guān)閉后, 才允許執(zhí)行其他Connection 命令。DataReader 適用于只需返回一個(gè)簡(jiǎn)單的只讀記錄集的情況。DataReader 最主要的方法是Read, 用于從查詢結(jié)果中獲取數(shù)據(jù)行。DataReader 每執(zhí)行一次Read()方法, 就返回一個(gè)Bool 值, 說(shuō)明是否有數(shù)據(jù)可讀, 并且所檢索的數(shù)據(jù)向下走一行。
SqlDataReader SDR;
SDR = CM.ExecuteReader();
this.lstUser.Items.Clear();
while (DR.Read())
this.lstUser.Items.Add(DR[0].ToString());
3.3.2 面向集的數(shù)據(jù)訪問(wèn)
數(shù)據(jù)適配器, 包含將數(shù)據(jù)從數(shù)據(jù)庫(kù)中取出的方法, 和將數(shù)據(jù)寫(xiě)回?cái)?shù)據(jù)庫(kù)的方法, 是數(shù)據(jù)庫(kù)和DataSet 之間溝通的橋梁。DataAdapter 對(duì)象使用Command 對(duì)象執(zhí)行SQL 命令, 將從數(shù)據(jù)庫(kù)獲取的數(shù)據(jù)送到DataSet, 此時(shí)便可使用DataTable 對(duì)象來(lái)存取數(shù)據(jù)表, 將DataSet里面的數(shù)據(jù)經(jīng)過(guò)處理后再送回?cái)?shù)據(jù)庫(kù)。
SqlDataAdapter SDAP = new SqlDataAdapter();
SDA.SelectCommand = selectCMD;
DataSet DS = new DataSet();//4 填充DataSet
SDAP.Fill(DS, "student");
Page.Response.Write("
" + DS.Tables[0].Rows[i].ItemArray[j] + " | ");
4小結(jié)
ADO.NET是與數(shù)據(jù)源交互的.NET技術(shù)。有許多的Data Providers,它將允許與不同的數(shù)據(jù)源交流——取決于它們所使用的協(xié)議或者數(shù)據(jù)庫(kù)。然而無(wú)論使用什么樣的Data Provider,你將使用相似的對(duì)象與數(shù)據(jù)源進(jìn)行交互。
參考文獻(xiàn)
[1] 劉乃麗.ASP.NET 2.0 網(wǎng)絡(luò)開(kāi)發(fā)詳解[M].北京:電子工業(yè)出版社.2008.
[2] 茅健.Visual Basic.NET+SQL Server全程指南[M].北京:電子工業(yè)出版社.2008.
[3] Michael Ekedahl著,馬海軍,楊繼萍等譯. Visual Basic.NET程序設(shè)計(jì)高級(jí)教程[M].北京:清華大學(xué)出版社.2005.