摘 要:ADO.NET是一組向.NET程序員公開數(shù)據(jù)訪問服務(wù)的類,是一個具有互操作性且伸縮性強(qiáng)的數(shù)據(jù)訪問體系結(jié)構(gòu)。以VB.NET為編程語言,系統(tǒng)、實例化地介紹ADO.NET對SQL Server數(shù)據(jù)庫的連接方法,并對常用數(shù)據(jù)訪問技術(shù)(如添加、刪除、更新等)進(jìn)行歸納介紹,為初學(xué)者提供參考。
關(guān)鍵詞:ADO.NET;SQL Server;數(shù)據(jù)訪問技術(shù);VB.NET
中圖分類號:TP311 文獻(xiàn)標(biāo)識碼:B 文章編號:1004373X(2008)1807404
ADO.NET Data Access Technology Based on SQL Server
YE Qian1,LIU Yi2
(1.Dean′s Office,Yan′an University,Yan′an,716000,China;2.Network Center,Yan′an University,Yan′an,716000,China)
Abstract:ADO.NET is a class which is used to open Data SQL Sever to.NET programmer,and it is a data access architecture which has interoperability and fine scalability.In the paper,VB.NET as programming language,the connect technique that ADO.NET to SQL Server database is introduced systematically.At the same time,some simple data access techniques (for example,adding,deleting,updating and etc.) are introduced to offer help to the beginner.
Keywords:ADO.NET;SQL Server;database SQL technique;VB.NET
在基于Web的編程時代,ADO.NET數(shù)據(jù)訪問體系結(jié)構(gòu)以其互操作性好、可伸縮性強(qiáng)的優(yōu)勢,成為一種重要的數(shù)據(jù)訪問模型,而且作為.NET Framework中不可缺少的一部分,它為創(chuàng)建分布式數(shù)據(jù)共享應(yīng)用程序提供了一組豐富的組件,提供對關(guān)系數(shù)據(jù)庫、XML和應(yīng)用程序數(shù)據(jù)的訪問。雖然.NET開發(fā)平臺可利用Web窗體控件間接實現(xiàn),但作為程序員往往希望直接通過編寫代碼實現(xiàn),然而目前系統(tǒng)性、實例化的報道此方面的文章不是很多,所以系統(tǒng)性、實例化地介紹ADO.NET數(shù)據(jù)訪問技術(shù)很有必要。下面詳細(xì)介紹ADO.NET數(shù)據(jù)訪問技術(shù)。
1 ADO.NET數(shù)據(jù)訪問技術(shù)要點(diǎn)
ADO.NET主要由2個核心組件組成: .NET數(shù)據(jù)提供程序(Data Providers)和數(shù)據(jù)集(DataSet)。前者實現(xiàn)數(shù)據(jù)操作和對數(shù)據(jù)的快速、只讀訪問;后者代表實際的數(shù)據(jù)。這里主要介紹Data Providers,它包含Connection,Command,DataReader,DataAdapter對象,.NET程序員使用這些元素實現(xiàn)對實際數(shù)據(jù)的操作。Connection對象用來實現(xiàn)和數(shù)據(jù)源的連接,是數(shù)據(jù)訪問者和數(shù)據(jù)源之間的對話通道。Command對象包含提交給實際數(shù)據(jù)庫的信息,例如一個查詢并返回數(shù)據(jù)的命令、一個修改數(shù)據(jù)的命令、一個調(diào)用數(shù)據(jù)庫存儲過程的命令及其參數(shù)等。DataReader提供一個簡單而輕量的方法,允許程序在數(shù)據(jù)記錄間進(jìn)行只讀的、單向(向前)的數(shù)據(jù)訪問。DataReader對象提供的數(shù)據(jù)訪問接口沒有DataSet對象那樣功能強(qiáng)大,但性能更高,因此在某些場合下(例如一個簡單的、不要求回傳更新數(shù)據(jù)的查詢)往往更能符合應(yīng)用程序的需要。DataAdapter對象充當(dāng)DataSet對象和數(shù)據(jù)源之間的橋梁,他使用Command對象、在Connection對象的連接輔助下訪問數(shù)據(jù)源,將Command對象中的命令執(zhí)行結(jié)果傳遞給DataSet對象,并將DataSet對象中的數(shù)據(jù)的改動回饋給數(shù)據(jù)源。DataAdapter對象對DataSet對象隱藏了實際數(shù)據(jù)操作的細(xì)節(jié),從而使得DataSet的數(shù)據(jù)源無關(guān)成為現(xiàn)實。
.NET自帶2個Data Providers:
(1)SQL Server.NET Data Providers。用于連接到Microsoft SQL Server 7.0或者更高版本的數(shù)據(jù)庫。它優(yōu)化了對SQL Server的訪問,并利用SQL Server內(nèi)置的數(shù)據(jù)轉(zhuǎn)換協(xié)議直接與SQL Server通訊;
(2) OLE DB.NET Data Providers。這是一個用于管理OLE DB數(shù)據(jù)源的數(shù)據(jù)提供程序。它的效率低于SQL Server.NET數(shù)據(jù)提供程序,因為在與數(shù)據(jù)庫通信時,它需要通過OLE DB層進(jìn)行通信。
相對上面提到的Connection,Command,DataReader,DataAdapter對象都有2個派生類版本,它們分別位于System.Data.SqlClient命名空間和System.Data.OleDb命名空間中,具體名稱如下:
Connection:SqlConnection和OleDbConnection
Command:SqlConnection和OleDbCommand
DataReader:SqlDataReader和OleDbDataReader
DataAdapter:SqlDataAdapter和OleDbDataAdapter
2 ADO.NET對SQL Server數(shù)據(jù)庫的訪問技術(shù)
隨著網(wǎng)絡(luò)世界的盛行,網(wǎng)絡(luò)上的圖片也大量盛行,許多人的電腦里存儲了很多好的圖片,而且大家也想把自己的圖片展示給別人看,炫耀自己美麗的圖片,但圖片的管理出現(xiàn)了麻煩。由此開發(fā)了《圖片管理系統(tǒng)》通過后臺管理實現(xiàn)圖片的分類管理、圖片的上傳、用戶的管理、圖片的瀏覽等功能。
下面以所開發(fā)的《圖片管理系統(tǒng)》為例,具體介紹ADO.NET對SQL Server數(shù)據(jù)庫的訪問技術(shù)的實現(xiàn)過程。
2.1 數(shù)據(jù)庫設(shè)計
訪問的數(shù)據(jù)庫文件為pic,所含表有admin,fenlei,myimg,其表結(jié)構(gòu)設(shè)計如圖1~圖3所示。
2.2 引用名稱空間
由于在訪問數(shù)據(jù)時需要用到相關(guān)的數(shù)據(jù)供應(yīng)器類型,因此在進(jìn)行數(shù)據(jù)訪問前首先要在.aspx.vb(事件代碼編寫處)的開始處填寫如下代碼,以引用名稱空間。名稱大多都是自行添加的。
<%@ Imports System.Data.OleDb %>
包含SQL Server.NET數(shù)據(jù)供應(yīng)器類型。
2.3 連接數(shù)據(jù)庫
先敘述2種連接的創(chuàng)建和打開方法示例。
(1) 對于SQL Server.NET Data Provider
Public void SqlConnection()
{ String connectionString=″Provider=SQLOLEDB;DataSource=(local);″+″Initial Catalog=databasename;uid=username;pwd=password;″+″Integrated Secrity=SSPI;″
try
{
SqlConnection myConnection=new
SqlConnection(connectionString);
//操作內(nèi)容
}
catch(SqlException e)
{
//異常處理操作內(nèi)容
}
}
(2) 對于OLE DB.NET Data Provider
public void OleConnection(String connectionString)
{
if(connectionString==\"\")
{
//操作內(nèi)容
}
try
{
OleDbConnection myConnnection=new OleDbConnection();
myConnection.ConnectionString=connectionString;
//操作內(nèi)容
}
catch(OleDbException e)
{
//異常處理操作內(nèi)容
}
//操作內(nèi)容
}
(3) 在該系統(tǒng)設(shè)計過程中引入一個類來連接數(shù)據(jù)庫
Public Class conn
Inherits System.Web.UI.Page
Public conn As OleDbConnection = New OleDbConnection(\"Provider=SQLOLEDB;Data Source=(local);Initial Catalog=pic;User ID=sa;Pwd=sa\")
End Class
(4)通過上面定義的類實現(xiàn)系統(tǒng)管理員登陸的數(shù)據(jù)庫連接
Public Sub doit(ByVal sender As System.Object,ByVal e As System.EventArgs)
If IsValid Then
Dim name,userpassword As String
name = username.Text
userpassword = FormsAuthentication.Hash
PasswordForStoringInConfigFile(pass.Text,
\"md5\")
Dim obj As New pic.conn
Dim mycommand As OleDbCommand
Dim rs As OleDbDataReader
Dim sql As String = \"select * from [admin] where username=′\" name \"′ and password=′\" userpassword \"′\"
obj.conn.Open()
mycommand = New OleDbCommand(sql,obj.conn)
rs = mycommand.ExecuteReader
′從數(shù)據(jù)庫讀取數(shù)據(jù),并進(jìn)行比較
If rs.Read() Then
Session.Add(\"username\",name)
Session.Add(\"userpassword\",userpassword)
Session.Add(\"type\",rs(\"type\"))
Response.Redirect(\"admin.aspx\")
rs.Close()
Else
Response.Write(\"\" + \"\\\\")
Response.Redirect(\"index.aspx\")
Response.End()
End If
obj.conn.Close()
End If
End Sub
注釋:SelectCommand用來取得數(shù)據(jù)源中的記錄。
2.4 訪問和操作數(shù)據(jù)庫
2.4.1 數(shù)據(jù)庫的操作
通過Connecton對象連接到數(shù)據(jù)庫之后,就可以使用Command對象對數(shù)據(jù)進(jìn)行操作,如數(shù)據(jù)添加、刪除、修改等。一個Command(命令)可以用典型的SQL語句表達(dá),包括執(zhí)行選擇查詢(Select Query)返回記錄集,執(zhí)行行動查詢(Action Query)更新(增加、編輯或刪除)數(shù)據(jù)庫的記錄,或者創(chuàng)建并修改數(shù)據(jù)庫的表結(jié)構(gòu)。
Command對象也有2種類型:SqlCommand和OleCommand,分別對應(yīng)與2種數(shù)據(jù)源類型??梢酝ㄟ^SqlCommand對象直接操作SQL Server數(shù)據(jù)庫,通過OleDbCommand操作支持ADO Managed Provider的數(shù)據(jù)源。
在創(chuàng)建Command對象后,可以使用他的一系列Execute方法來完成命令的執(zhí)行。
(1) 返回數(shù)據(jù)流,可以使用ExecuteReader方法來返回一個DataReader對象。
(2) 返回一個XmlReader對象。對于SQL數(shù)據(jù)源,如果將CommandText屬性設(shè)置為合法的帶有FOR XML子句的TSQL語句,可以使用SqlCommand對象的ExecuteXmlReader方法來返回一個XmlReader對象。
(3) 返回某個值,調(diào)用ExecuteScalar方法。
(4) 當(dāng)不希望返回值時,調(diào)用ExecuteNonQuery方法。
2.4.2 數(shù)據(jù)操作的操作代碼
下面是實現(xiàn)數(shù)據(jù)的添加、更新、刪除操作的代碼。
(1) 數(shù)據(jù)“添加”操作的代碼
Public Sub adduser(ByVal sender As System.Object,ByVal e As System.EventArgs)
If IsValid Then
Dim ad_name As String = username.Text
Dim ad_password As String = FormsAuthentication.HashPasswordForStoringInConfigFile(password.Text,
\"md5\")
Dim grade As Int32 = dnegji.Value
Dim sql As String
obj.conn.Open()
sql = \"select id from [admin] where username=′\" ad_name \"′\"
mycommand = New OleDbCommand(sql,obj.conn)
rs = mycommand.ExecuteReader
If rs.Read() Then
pageerr.InnerHtml = \"不能添加相同的用戶名\"
Exit Sub
End If
rs.Close()
Dim sql1 = \"insert into [admin](username,password,type) values(′\" ad_name \"′,′\" ad_password \"′,\" grade \")\"
′Response.Write(sql)
′Response.End()
mycommand = New OleDbCommand(sql1,obj.conn)
mycommand.ExecuteNonQuery()
obj.conn.Close()
pageerr.InnerHtml = \"添加用戶成功\"
main.Visible = False
End If
End Sub
注釋:InsertCommand用來添加記錄到數(shù)據(jù)庫。
(2) 數(shù)據(jù)“刪除”操作的代碼
Try
Dim id2 As Int32 = Request(\"id\")
sql = \"delete * from admin where id=\" id2
mycommand = New OleDbCommand(sql,obj.conn)
mycommand.ExecuteNonQuery()
pageerr.InnerHtml = \"刪除成功\"
main.Visible = False
Catch s As Exception
pageerr.InnerHtml = \"沒有這個用戶\"
main.Visible = False
Exit Sub
End Try
注釋:DeleteCommand用來刪除數(shù)據(jù)源中的記錄。
(3) 數(shù)據(jù)“更新”操作的代碼
Public Sub edituser(ByVal sender As System.Object,ByVal e As System.EventArgs)
If IsValid Then
Dim username As String = Seession(\"username\")
Dim e_password As String = FormsAuthentication.HashPasswordForStoringInConfigFile(password.Text,\"md5\")
Dim sql As String = \"update [admin] set password=′\" e_password \"′ where username=′\" username \"′\"
obj.conn.Open()
mycommand = New OleDbCommand(sql,obj.conn)
mycommand.ExecuteNonQuery()
obj.conn.Close()
pageerr.InnerHtml = \"修改密碼成功\"
main.Visible = False
End If
End Sub
注釋:UpdateCommand用來更新數(shù)據(jù)源中的記錄。
3 結(jié) 語
至此介紹ADO.NET對SQL Server數(shù)據(jù)庫的基本訪問技術(shù)??梢钥闯鯝DO.NET代表了最新版本的ADO技術(shù),作為一個用于創(chuàng)建分布式和數(shù)據(jù)共享程序的基本各種標(biāo)準(zhǔn)的編程模型,只有掌握ADO.NET數(shù)據(jù)訪問技術(shù),才能開發(fā)出功能強(qiáng)大、生命力持久的Web應(yīng)用程序。
參 考 文 獻(xiàn)
[1]李岱,劉至寶,陳斕.ASP.NET項目開發(fā)實踐[M].北京:中國鐵道出版社,2005.
[2]趙增敏,朱粹丹,趙朱曦.ASP.NET程序設(shè)計\\.西安:西安交通大學(xué)出版社,2006.
[3]陳峰棋.深入淺出ASP.NET程序設(shè)計\\.北京:中國水利水電出版社,2004.
[4]陳語林.Visual Basic.NET程序設(shè)計教程\\.北京:中國水利水電出版社,2005.
[5]張增良.ASP.NET程序設(shè)計教程\\.西安:西安交通大學(xué)出版社,2006.
[6]\\Chris Goode John Kauffman.ASP.NET 1.0入門經(jīng)典\\.康博,譯.北京:清華大學(xué)出版社,2002.
[7]曹祖圣.Visual Basic.NET學(xué)習(xí)范本\\.北京:科學(xué)出版社,2003.
[8]楊宗志.ASP.NET 入門與實作\\.北京:科學(xué)出版社,
2003.
[9]\\Kevin Hoffman.ASP.NET ECommerce Programming\\.北京:清華大學(xué)出版社,2003.
[10]\\ Glenn Johnson.ADO.NET 2.0高級編程\\.北京:清華大學(xué)出版社,2006.
作者簡介 葉 倩 女,1982年出生,2004年畢業(yè)于西安空軍工程大學(xué),西北大學(xué)在職碩士研究生。主要研究方向為軟件工程、計算機(jī)應(yīng)用。
劉 翼 男,1982年出生,助教,2003年畢業(yè)于延安大學(xué)。主要研究方向為網(wǎng)絡(luò)應(yīng)用、軟件工程、計算機(jī)應(yīng)用等。