摘要:Visual Studio.NET作為最新一代的軟件開發(fā)環(huán)境,對數(shù)據(jù)庫編程有著強大而有力支持。在.NET平臺上,Microsoft推出了最新的數(shù)據(jù)庫訪問技術(shù)ADO.NET。本文講述ADO.NET中三個常用的類(Connection、Command、DataReader)的對象,學(xué)會運用這三個類的對象來對數(shù)據(jù)源中的數(shù)據(jù)進行靈活的在線處理的方法。
關(guān)鍵詞:連接類; 命令類;數(shù)據(jù)讀取器類
中圖分類號:TP393文獻標(biāo)識碼:A文章編號:1009-3044(2008)14-20805-03
1 Data Providers(數(shù)據(jù)提供者)
簡單的理解,數(shù)據(jù)源就是數(shù)據(jù)庫,它同時也能夠是文本文件、Excel表格或者XML文件。本文將以SQL Server 2000為示例數(shù)據(jù)庫服務(wù)器,Pubs為示例數(shù)據(jù)庫,語言上選擇最適合.NET平臺的C#語言。
ADO.NET是一組處理數(shù)據(jù)的類。應(yīng)用中可能需要與不同類型的數(shù)據(jù)源或者數(shù)據(jù)庫交互。但是并沒有這樣的一組類庫可以達到這個目的,因為各個數(shù)據(jù)源的協(xié)議各不相同,需要通過正確的協(xié)議來訪問數(shù)據(jù)源。有些比較老的數(shù)據(jù)源用ODBC協(xié)議,其后的一些數(shù)據(jù)源用OleDb協(xié)議,現(xiàn)在仍然還有許多新的數(shù)據(jù)源不斷出現(xiàn)。使用ADO.NET類庫,你可以直接訪問所有的數(shù)據(jù)源。
ADO.NET提供了訪問數(shù)據(jù)源的公共方法,對于不同的數(shù)據(jù)源,它采用不同的類庫。這些類庫稱為Data Providers,并且通常是以數(shù)據(jù)源的類型以及協(xié)議來命名的。
舉一個實際的例子來理解表格中的API前綴。你接觸到的第一個ADO.NET對象是連接類的對象(connection object),你可以通過它建立與數(shù)據(jù)源的連接。如果使用OleDb Data Provider連接一個提供OleDb接口的數(shù)據(jù)源,那么將使用的連接類就是OleDbConnection。同理,在本文中使用的數(shù)據(jù)源是SQL Server,所以所有的API對象都帶有Sql前綴,比如SqlConnection。針對每一種Data Provider都有相應(yīng)的命名空間,包含數(shù)據(jù)處理所需的所有的類。比如使用SqlServer數(shù)據(jù)源需要的類都包含在System.Data.SqlClient命名空間中。
2 ADO.NET中三個對象
ADO.NET里包括的類很抽象,經(jīng)過總結(jié)如下圖1,結(jié)合本圖先了解一下其中三個常用類的功能,然后再來應(yīng)用它們的對象進行數(shù)據(jù)處理。
2.1 SqlConnection Object(連接類的對象)
要訪問一個數(shù)據(jù)源,你必須先建立一個到它的連接。這個連接里描述了數(shù)據(jù)庫服務(wù)器類型、數(shù)據(jù)庫名字、用戶名、密碼,和連接數(shù)據(jù)庫所需要的其它參數(shù)。Command對象通過使用connection對象來知道是在哪個數(shù)據(jù)庫上面執(zhí)行SQL命令。
連接對象創(chuàng)建方法如下:
SqlConnection conn=new SqlConnection(\"Data Source=(local); Initial Catalog=Pubs; User ID=sa; password=123;\");
對于連接類對象來說,ConnectionString屬性即說明了連接類對象的連接方法。在創(chuàng)建并初始化連接對象時可以在構(gòu)造函數(shù)中說明連接字符串屬性,當(dāng)然也可以后來再設(shè)置。連接字符串中各關(guān)鍵字的意義如下:[2]
DataSource或Server:數(shù)據(jù)源或服務(wù)器?!?local)”表示本地服務(wù)器,此外,“.”或“l(fā)ocalhost”都表示本地服務(wù)器。
Initial Catalog或dataBase:指定初始目錄或數(shù)據(jù)庫。
User ID或uid:登陸服務(wù)器的賬戶名。
Password或pwd:登陸服務(wù)器的密碼。
連接類對象有兩個方法用來打開和關(guān)閉與數(shù)據(jù)源的連接。
Open()方法:打開連接,應(yīng)用程序使用數(shù)據(jù)源數(shù)據(jù)之前要求調(diào)用連接類對象的此方法打開與數(shù)據(jù)源的連接。
Close()方法:關(guān)閉連接,應(yīng)用程序使用數(shù)據(jù)源數(shù)據(jù)完畢后,最好關(guān)閉與數(shù)據(jù)源的連接,釋放所占的連接。
2.2 SqlCommand Object(命令類的對象)
連接數(shù)據(jù)庫后就可以開始想要執(zhí)行的數(shù)據(jù)庫操作,這個是通過command對象完成,command對象一般被用來發(fā)送SQL語句給數(shù)據(jù)庫。command對象通過connection對象得知道應(yīng)該與哪個數(shù)據(jù)庫進行連接。
SqlCommand cmd=new SqlCommand();
cmd.Connection=conn;
cmd.CommandText=\"select * from users\";
以上語句建立Command,根據(jù)習(xí)慣不同,也可以使用以下方法:
SqlCommand cmd=new SqlCommand(\"select * from users\",conn);
對于命令類的對象來說,CommandText屬性用于記錄下要對數(shù)據(jù)源執(zhí)行的SQL語句命令,Connection屬性用于記錄命令通過什么樣的連接訪問數(shù)據(jù)源。
以上代碼并沒有執(zhí)行SQL語句記錄的命令,SqlCommand類的對象本身提供的三種常用的執(zhí)行命令的方法分別為:[3]
ExecuteNonQuery()方法:非查詢類型SQL語句命令執(zhí)行方法。對連接執(zhí)行SQL語句并返回受影響的行數(shù)。當(dāng)要對數(shù)據(jù)源進行插入、刪除和更新數(shù)據(jù)時,先將命令對象的命令字符串指定到插入或更新的SQL語句,然后執(zhí)行ExecuteNonQuery()方法。當(dāng)然,執(zhí)行命令前需要打開與數(shù)據(jù)源的連接。
ExecuteReader()方法:執(zhí)行一個select類型的SQL命令,返回一個SqlDataReader對象。調(diào)用該方法前,需要將命令字符串設(shè)置到一個Select查詢語句,然后調(diào)用該方法,返回SqlDataReader對象,該對象中保存了需要的數(shù)據(jù)。同樣的,執(zhí)行命令前需要打開數(shù)據(jù)源的連接,如果在讀取SqlDataReader對象中記錄的數(shù)據(jù)時,也不可以斷開連接。
ExecuteScaler()方法:執(zhí)行一個SQL命令,返回記錄行的第一個字段。調(diào)用該方法前,需要將命令字符串設(shè)置到一個Select查詢語句,然后調(diào)用該方法,返回記錄行的第一個字段。執(zhí)行命令前也要打開與數(shù)據(jù)源的連接。
由此可見,當(dāng)使用的SQL命令類型不同,在執(zhí)行命令時調(diào)用的執(zhí)行函數(shù)有所不同。
2.3 SqlDataReader Object:數(shù)據(jù)讀取器類的對象
通過dataReader對象,可以獲得從command對象的SELECT語句篩選的結(jié)果。dataReader返回的數(shù)據(jù)流被設(shè)計為只讀的、單向的,這將意味著你只能按照一定的順序從數(shù)據(jù)流中取出數(shù)據(jù)。這樣你獲得了性能上的提升,但是缺點也是明顯的,不能夠操作取回數(shù)據(jù),如果需要操作編輯數(shù)據(jù),解決的辦法是使用DataSet。但SqlDataReader可以快速的從數(shù)據(jù)源獲得只讀的,向前的數(shù)據(jù)流。
ADO.NET中沒有構(gòu)造函數(shù)創(chuàng)建DataReader對象。通常使用Command類的ExecuteReader()方法來創(chuàng)建DataReader對象:
SqlDataReader oDR=cmd.ExecuteReader();
oDR.Read();
函數(shù)read()用于逐條讀取數(shù)據(jù),同時光標(biāo)移到下一條記錄所在位置,返回值為一個bool值,如果讀到記錄則為true,否則為1。[4]
ADO.NET包含了許多的Data Providers,分別用于訪問不同的數(shù)據(jù)源。然而無論使用什么樣的Data Provider,與數(shù)據(jù)源進行交互的對象的使用方法都是相似的。XxxConnection對象用于管理與數(shù)據(jù)源的連接。XxxCommand對象可以向數(shù)據(jù)源發(fā)送SQL命令。XxxDataReader可以快速從數(shù)據(jù)源獲得只讀的,向前的數(shù)據(jù)流。
3 應(yīng)用程序處理數(shù)據(jù)源中的數(shù)據(jù)
認識了ADO.NET中的三個基本的對象,應(yīng)用程序就可以實現(xiàn)在線處理數(shù)據(jù)。具體需要如何處理,需要結(jié)合實際情況寫出相應(yīng)的SQL語句命令,之后就可以討論如何處理數(shù)據(jù)的過程了。
3.1 應(yīng)用程序通過dataReader對象讀數(shù)據(jù)
通過在線的方式讀取數(shù)據(jù)源中的數(shù)據(jù)供應(yīng)用程序的使用,我們可以簡化成如下四步(見圖中豎向箭頭讀取數(shù)據(jù)的方式):
(1)建連接:建立與數(shù)據(jù)源的連接對象。
(2)建命令:建立要對數(shù)據(jù)源執(zhí)行的命令對象。
(3)執(zhí)行命令:執(zhí)行命令對象中記錄的SQL語句命令。
(4)讀數(shù)據(jù):應(yīng)用程序讀取dataReader對象中記錄的數(shù)據(jù)。
例如://建連接
SqlConnection conn=new SqlConnection(“Data Source=(local);
Initial Catalog=Northwind;User ID=sa ; password=1234;”);
//建命令
SqlCommand cmd=new SqlCommand(“select * from authors”,conn);
//執(zhí)行命令
conn.Open();
SqlDataReader dr=cmd.ExecuteReader();
//讀數(shù)據(jù)
while(dr.Read())
{
……
}
dr.Close();
conn.Close();
3.2 應(yīng)用程序直接對數(shù)據(jù)源進行數(shù)據(jù)添加、修改或刪除
倘若應(yīng)用程序需要對數(shù)據(jù)源中的數(shù)據(jù)進行添加、修改或是刪除。那么我們可以把此過程簡化成如下三步(見圖中向右處理數(shù)據(jù)的方式):
(1)建連接:建立與數(shù)據(jù)源的連接對象。
(2)建命令:建立要對數(shù)據(jù)源執(zhí)行的命令對象。
(3)執(zhí)行命令:執(zhí)行命令對象中記錄的SQL語句命令。
例如:
//建連接
SqlConnection conn=new SqlConnection(\"Data Source=(local); Initial Catalog=Pubs; User ID=sa; password=1234;\");//建命令
SqlCommand cmd=new SqlCommand(\"update authors set London='倫敦' where city='London'\",conn);
//執(zhí)行命令
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
4 結(jié)束語
本文講述的是ADO.NET中在線處理數(shù)據(jù)的一種方式。結(jié)合圖形,相信對于Connection、Command、DataReader這三個非常抽象的類的對象的學(xué)習(xí)會有很大的幫助。當(dāng)然本文重在結(jié)合三個對象處理數(shù)據(jù)的過程。對于每一類對象的知識細節(jié)還需讀者深入學(xué)習(xí)。應(yīng)用程序處理數(shù)據(jù)還有另外一種比較特色的方式,即離線處理數(shù)據(jù)。與本文中提到的在線處理數(shù)據(jù)方式有著很多的相同與不同之處,各有優(yōu)缺點,還需要進一步學(xué)習(xí)。
參考文獻:
[1] 參考網(wǎng)絡(luò)相關(guān)文章. http://blog.sina.com.cn/s/blog_54d1fb35010007rb.html.
[2] 李律松, 等. Visual C#數(shù)據(jù)庫高級教程[M]. 清華大學(xué)出版式社.
[3] Simon Robinson, Christian Nagel, 等. C#高級編程(第3版)[M].
[4] 李德奇. C#程序設(shè)計[M]. 科學(xué)出版社.
注:本文中所涉及到的圖表、注解、公式等內(nèi)容請以PDF格式閱讀原文