摘要:在B/S模式或C/S模式系統(tǒng)開發(fā)中,ADO.NET對象是前臺頁面(或窗體)與后臺數(shù)據(jù)庫之間的重要橋梁。通過ADO.NET對象的數(shù)據(jù)庫訪問技術(shù),可以實(shí)現(xiàn)對數(shù)據(jù)庫中數(shù)據(jù)的讀取、插入、修改和刪除等操作。首先介紹了Ado.net組件的體系結(jié)構(gòu),其次分析了Ado.net數(shù)據(jù)庫訪問技術(shù)的兩種模式,最后針對這兩種模式,通過實(shí)例實(shí)現(xiàn)了應(yīng)用ADO.NET的數(shù)據(jù)庫訪問技術(shù)。
關(guān)鍵詞:ADO.NET;B/S;C/S;數(shù)據(jù)庫訪問技術(shù)
中圖分類號:TP311 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2013)12-2758-03
在數(shù)據(jù)庫應(yīng)用系統(tǒng)開發(fā)中,數(shù)據(jù)的操作占據(jù)了大量的工作,要操作的數(shù)據(jù)既可以是存儲在數(shù)據(jù)庫中的數(shù)據(jù)、又可以是存儲在文件中的數(shù)據(jù)以及XML數(shù)據(jù),其中對存儲在數(shù)據(jù)庫中的數(shù)據(jù)的操作最為普遍。Ado.net技術(shù)是web頁面或者Winform窗體與數(shù)據(jù)庫之間進(jìn)行數(shù)據(jù)交互的一種重要技術(shù),它把對數(shù)據(jù)庫的操作分為幾個步驟,并為每個步驟提供對象來分裝操作過程,從而使得對數(shù)據(jù)庫中數(shù)據(jù)的操作變得簡單易行。
1 Ado.net組件體系結(jié)構(gòu)
Ado.net對Microsoft SQL Server數(shù)據(jù)庫和XML等數(shù)據(jù)源提供一致的訪問。我們可以使用Ado.net來連接到這些數(shù)據(jù)源,并檢索、處理和更新所包含的數(shù)據(jù)。
Ado.net組件將數(shù)據(jù)訪問與數(shù)據(jù)處理分離。它是通過兩個主要的組件:.NET數(shù)據(jù)提供程序(Data Provider)和Dataset來完成這一操作的。圖1說明了數(shù)據(jù)訪問與數(shù)據(jù)處理分離的概念。Ado.net體系結(jié)構(gòu)的一個核心元素是.Net數(shù)據(jù)提供程序,它是專門為數(shù)據(jù)處理以及快速地只進(jìn)、只讀訪問數(shù)據(jù)而設(shè)計的組件,包括Connection、Command、DataReader和DataAdapter對象的組件。[1]
taSet是Ado.net體系結(jié)構(gòu)中另一個核心組件,它是專門針對各種數(shù)據(jù)源的數(shù)據(jù)訪問獨(dú)立性而設(shè)計的,所以它可以用于多個不同的數(shù)據(jù)源。DataSet包含一個或多個DataTable對象的集合,這些對象由數(shù)據(jù)行和數(shù)據(jù)列,以及有關(guān)DataTable對象中數(shù)據(jù)的主鍵、外鍵、約束和關(guān)系信息組成。它相當(dāng)于內(nèi)存中的一個數(shù)據(jù)庫,但從不關(guān)心它的數(shù)據(jù)是從數(shù)據(jù)庫中、XML文件中還是其他什么數(shù)據(jù)源中獲得。
2 Ado.net訪問數(shù)據(jù)庫的兩種模式
針對不同的數(shù)據(jù)源訪問需求,ADO.NET為我們提供了兩種連接數(shù)據(jù)庫的方式:連接模式和斷開模式。[2]
2.1 基于連接模式下數(shù)據(jù)庫訪問技術(shù)
對數(shù)據(jù)的讀取和操作在斷開數(shù)據(jù)庫連接之前,這樣的工作方式稱為連接模式,使用DataReader對象來實(shí)現(xiàn)。DataReader從數(shù)據(jù)庫中檢索只讀、只進(jìn)的數(shù)據(jù)流。查詢結(jié)果在查詢執(zhí)行時返回,并存儲在客戶端的網(wǎng)絡(luò)緩沖區(qū)中,直到用戶使用DataReader的Read方法對它們發(fā)出請求。使用DataReader可以提高應(yīng)用程序的性能,原因是它只要數(shù)據(jù)可用就立即檢索數(shù)據(jù),并且一次只在內(nèi)存中存儲一行,減少了系統(tǒng)開銷。連接模式訪問數(shù)據(jù)庫數(shù)據(jù)原理如圖2所示。
由于DataReader允許對數(shù)據(jù)庫進(jìn)行直接、高性能的訪問,它只提供對數(shù)據(jù)的只讀和只向前的訪問,它返回的結(jié)果不會駐留在內(nèi)存中,并且它一次只能訪問一條記錄,對服務(wù)器的內(nèi)存要求較小,而且,只使用DataReader就可以顯示數(shù)據(jù)。所以,只需要顯示數(shù)據(jù)的應(yīng)用程序,盡量使用DataReader,因?yàn)樗鼘⑻峁┳罴训男阅堋?/p>
2.2 基于斷開模式下數(shù)據(jù)庫訪問技術(shù):
而對數(shù)據(jù)的讀取在斷開數(shù)據(jù)庫連接之后,這樣的工作方式稱為斷開模式,使用DataAdapter對象和DataSet對象配合實(shí)現(xiàn)。通過DataAdapter對象,向DataSet中填充數(shù)據(jù)。 DataAdapter對象充當(dāng)數(shù)據(jù)庫和DataSet之間的橋梁。能夠用來保存和檢索數(shù)據(jù)。DataAdapter對象的Fill方法用于將查詢結(jié)果填充到DataSet中,以便能夠?qū)崿F(xiàn)離線處理數(shù)據(jù)。DataSet從數(shù)據(jù)源中獲取數(shù)據(jù)以后就斷開了與數(shù)據(jù)源之間的連接。允許在DataSet中進(jìn)行增、刪、改以及查等各種操作。當(dāng)完成了各項(xiàng)操作以后還可以把DataSet中的數(shù)據(jù)送回到數(shù)據(jù)源。斷開模式訪問數(shù)據(jù)庫數(shù)據(jù)原理如圖3所示。
3 數(shù)據(jù)庫訪問技術(shù)的具體實(shí)現(xiàn)
3.1 數(shù)據(jù)庫連接的實(shí)現(xiàn)
下面的代碼通過 ADO.NET 連接到本地 SQL Server 中的student 數(shù)據(jù)庫。
public SqlConnection MyConnstring( )
{
string connstr = "Data Source=.;Initial Catalog=student;Integrated Security=True";
SqlConnection con = new SqlConnection(connstr);
return con;
}
3.2 從數(shù)據(jù)源中讀取數(shù)據(jù)的實(shí)現(xiàn)
讀取數(shù)據(jù)我們可以采用兩種方法實(shí)現(xiàn),一種是通過DataReader對象在連接模式下實(shí)現(xiàn),另一種是通過DataAdapter對象和DataSet對象配合使用的離線模式下實(shí)現(xiàn)。
1)連接模式實(shí)現(xiàn)對數(shù)據(jù)庫中數(shù)據(jù)的讀取操作,代碼如下:
private void SearchUserInfor_Click(object sender, EventArgs e)
{
MyConnstring().Open();
string SQL = "select UserName,UserPWD from users";
SqlCommand cmd = new SqlCommand(SQL, MyConnstring());
SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
Console.WriteLine(“{0}\t{1}”,reader[0].ToString(),reader[1].ToString()) ;
}
reader.Close();
con.Close();
}
2)斷開模式下實(shí)現(xiàn)對數(shù)據(jù)庫中數(shù)據(jù)的讀取操作,代碼如下:
private void SearchUserInfor_Click(object sender, EventArgs e)
{
string SQL = "select * from users";
SqlDataAdapter da = new SqlDataAdapter(SQL,MyConnstring());
DataSet ds = new DataSet();
da.Fill(ds, "users");
for(int i=0;i { for(int j=0;j { Console.Write(ds.Tables[0]).Rows[i][j]+“\t”); } Console.Write(“\n”); } } 3.3 操作數(shù)據(jù)庫中數(shù)據(jù)的實(shí)現(xiàn) 1)在連接模式下,主要使用Command對象通過執(zhí)行SQL命令來操作數(shù)據(jù)庫。下面通過實(shí)例來實(shí)現(xiàn)對數(shù)據(jù)庫中數(shù)據(jù)的操作。代碼如下: Public void OperateUserInfor (string SQL) { MyConnstring().Open(); SqlCommand cmd = new SqlCommand(SQL, MyConnstring()); if (cmd.ExecuteNonQuery() > 0) { MessageBox.Show("操作成功!"); } else { Return; } con.Close(); } 對于上面的代碼,只要改變SQL語句就可以實(shí)現(xiàn)對數(shù)據(jù)庫中數(shù)據(jù)的添加、刪除以及修改等操作。 2)利用DataSet對象可以實(shí)現(xiàn)在斷開模式下對數(shù)據(jù)庫數(shù)據(jù)的添加、刪除以及修改操作。當(dāng)添加數(shù)據(jù)時,具體實(shí)現(xiàn)代碼如下: private void InsertUserInfor_Click(object sender, EventArgs e) { SqlCommand MySelectCmd=new SqlCommand("select * from users",MyConnstring()); SqlCommand MyInsertCmd=new SqlCommand("insert users values('"+UserName_TB .Text .Trim ()+"','"+UserPWD_TB.Text .Trim ()+"')",MyConnstring()); SqlDataAdapter MyAdapter=new SqlDataAdapter(); MyAdapter.SelectCommand=MySelectCmd ; MyAdapter.InsertCommand=MyInsertCmd ; DataSet MyDs=new DataSet(); MyAdapter.Fill(MyDs, "UserInfor"); (下轉(zhuǎn)第2767頁) (上接第2760頁) DataRow Row=MyDs.Tables[0].NewRow(); Row["UserName"]="fashion"; Row["UserPWD"]="123"; MyDs.Tables[0].Rows.Add(Row); MyAdapter.Update(MyDs, "UserInfor"); } 當(dāng)要刪除數(shù)據(jù)時,可以通過DataRow對象的Delete方法刪除當(dāng)前行。更新數(shù)據(jù)集和添加、刪除數(shù)據(jù)的操作類似,首先獲得DataSet的某個數(shù)據(jù)表的DataTable對象,然后再獲得要更新數(shù)據(jù)的行對象DataRow,最后直接對DataRow對象進(jìn)行修改,并更新數(shù)據(jù)庫即可完成數(shù)據(jù)的修改工作。 4 結(jié)束語 應(yīng)用程序訪問數(shù)據(jù)庫中的數(shù)據(jù)時,既可以使用DataReader對象從數(shù)據(jù)庫中讀取數(shù)據(jù),又可以使用DataSet對象將數(shù)據(jù)放在本地內(nèi)存中,但兩者存在一定的差異。[3] 總之,兩者各有優(yōu)缺點(diǎn),具體使用哪種對象需要具體問題具體分析。當(dāng)數(shù)據(jù)量較少,不需要緩存數(shù)據(jù)時,可以使用DataReader;當(dāng)數(shù)據(jù)來源于多個數(shù)據(jù)庫,為減輕數(shù)據(jù)庫服務(wù)器的負(fù)擔(dān),則可以考慮使用DataSet。 參考文獻(xiàn): [1] 張聯(lián)鋒,陳文臣.ASP.NET3.5程序設(shè)計與項(xiàng)目實(shí)踐[M].北京:電子工業(yè)出版社,2011. [2] 劉維崗.基于AS P.NET的數(shù)據(jù)庫訪問技術(shù)研究與實(shí)現(xiàn)[J].信息時代,2012,2:50-53. [3] 王晶晶.C#面向?qū)ο蟪绦蛟O(shè)計[M].北京:機(jī)械工業(yè)出版社,2010.