ASP.NET數(shù)據(jù)庫編程
發(fā)表時間:2024-06-14 來源:明輝站整理相關軟件相關文章人氣:
[摘要]ASP.NET中的ADO.NET和ASP中的ADO相對應,它是ADO的改進版本。在ADO.NET中,通過Managed Provider所提供的應用程序編程接口(API),可以輕松地訪問各種數(shù)據(jù)源的數(shù)據(jù),包括OLEDB所支持的和ODBC支持的數(shù)據(jù)庫! ∠旅娼榻BADO.NET中最重要的兩個概念:M...
ASP.NET中的ADO.NET和ASP中的ADO相對應,它是ADO的改進版本。在ADO.NET中,通過Managed Provider所提供的應用程序編程接口(API),可以輕松地訪問各種數(shù)據(jù)源的數(shù)據(jù),包括OLEDB所支持的和ODBC支持的數(shù)據(jù)庫。
下面介紹ADO.NET中最重要的兩個概念:Managed Provider和DataSet。
Managed Provider
過去,通過ADO的數(shù)據(jù)存取采用了兩層的基于連接的編程模型。隨著多層應用的需求不斷增加,程序員需要一個無連接的模型。ADO.NET就應運而生了。ADO.NET的Managed Provider就是一個多層結(jié)構(gòu)的無連接的一致的編程模型。
Managed Provider提供了DataSet和數(shù)據(jù)中心(如MS SQL)之間的聯(lián)系。Managed Provider包含了存取數(shù)據(jù)中心(數(shù)據(jù)庫)的一系列接口。主要有三個部件:
1、連接對象Connection、命令對象Command、參數(shù)對象Parameter提供了數(shù)據(jù)源和DataSet之間的接口。DataSetCommand接口定義了數(shù)據(jù)列和表映射,并最終取回一個DataSet。
2、數(shù)據(jù)流提供了高性能的、前向的數(shù)據(jù)存取機制。通過IdataReader,你可以輕松而高效地訪問數(shù)據(jù)流。
3、更底層的對象允許你連接到數(shù)據(jù)庫,然后執(zhí)行數(shù)據(jù)庫系統(tǒng)一級的特定命令。
過去,數(shù)據(jù)處理主要依賴于兩層結(jié)構(gòu),并且是基于連接的。連接斷開,數(shù)據(jù)就不能再存取。現(xiàn)在,數(shù)據(jù)處理被延伸到三層以上的結(jié)構(gòu),相應地,程序員需要切換到無連接的應用模型。這樣,DataSetCommand就在ADO.NET中扮演了極其重要的角色。它可以取回一個DataSet,并維護一個數(shù)據(jù)源和DataSet之間的"橋",以便于數(shù)據(jù)訪問和修改、保存。DataSetCommand自動將數(shù)據(jù)的各種操作變換到數(shù)據(jù)源相關的合適的SQL語句。從圖上可以看出,四個Command對象:SelectCommand、InsertCommand、UpdateCommand、DeleteCommand分別代替了數(shù)據(jù)庫的查詢、插入、更新、刪除操作。
Managed Provider利用本地的OLEDB通過COM Interop來實現(xiàn)數(shù)據(jù)存取。OLEDB支持自動的和手動的事務處理。所以,Managed Provider也提供了事務處理的能力。
DataSet
DataSet是ADO.NET的中心概念。你可以把DataSet想象成內(nèi)存中的數(shù)據(jù)庫。正是由于DataSet,才使得程序員在編程序時可以屏蔽數(shù)據(jù)庫之間的差異,從而獲得一致的編程模型。
DataSet支持多表、表間關系、數(shù)據(jù)約束等等。這些和關系數(shù)據(jù)庫的模型基本一致。
通過ADO.NET訪問數(shù)據(jù)庫
不論從語法來看,還是從風格和設計目標來看,ADO.NET都和ADO有顯著的不同。在ASP中通過ADO訪問數(shù)據(jù)庫,一般要通過以下四個步驟:
1、 創(chuàng)建一個到數(shù)據(jù)庫的鏈路,即ADO.Connection;
2、 查詢一個數(shù)據(jù)集合,即執(zhí)行SQL,產(chǎn)生一個Recordset;
3、 對數(shù)據(jù)集合進行需要的操作;
4、 關閉數(shù)據(jù)鏈路。
在ADO.NET里,這些步驟有很大的變化。ADO.NET的最重要概念之一是DataSet。DataSet是不依賴于數(shù)據(jù)庫的獨立數(shù)據(jù)集合。所謂獨立,就是:即使斷開數(shù)據(jù)鏈路,或者關閉數(shù)據(jù)庫,DataSet依然是可用的。如果你在ASP里面使用過非連接記錄集合(Connectionless Recordset),那么DataSet就是這種技術的最徹底的替代品。
有了DataSet,那么,ADO.NET訪問數(shù)據(jù)庫的步驟就相應地改變了:
1、創(chuàng)建一個數(shù)據(jù)庫鏈路;
2、請求一個記錄集合;
3、把記錄集合暫存到DataSet;
4、如果需要,返回第2步;(DataSet可以容納多個數(shù)據(jù)集合)
5、關閉數(shù)據(jù)庫鏈路;
6、在DataSet上作所需要的操作。
DataSet在內(nèi)部是用XML來描述數(shù)據(jù)的。由于XML是一種平臺無關、語言無關的數(shù)據(jù)描述語言,而且可以描述復雜數(shù)據(jù)關系的數(shù)據(jù),比如父子關系的數(shù)據(jù),所以DataSet實際上可以容納具有復雜關系的數(shù)據(jù),而且不再依賴于數(shù)據(jù)庫鏈路。
ADO.NET有許多對象,我們先看看最基本的也最常用的幾個。首先看看ADOConnection。和ADO的ADODB.Connection對象相對應,ADOConnection維護一個到數(shù)據(jù)庫的鏈路。為了使用ADO.NET對象,我們需要引入兩個NameSpace:System.Data和System.Data.ADO,使用ASP.NET的Import指令就可以了:
<%@ Import Namespace="System.Data" %>
。%@ Import Namespace="System.Data.ADO" %>
和ADO的Connection對象類似,ADOConnection對象也有Open和Close兩個方法。下面的這個例子展示了如何連接到本地的MS SQL Server上的Pubs數(shù)據(jù)庫。
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.ADO" %>
<%
'設置連接串...
Dim strConnString as String
strConnString = "Provider=SQLOLEDB; Data Source=(local); " & _
"Initial Catalog=pubs; User ID=sa"
'創(chuàng)建對象ADOConnection
Dim objConn as ADOConnection
objConn = New ADOConnection
'設置ADOCOnnection對象的連接串
objConn.ConnectionString = strConnString
objConn.Open() '打開數(shù)據(jù)鏈路
'數(shù)據(jù)庫操作代碼省略
objConn.Close() '關閉數(shù)據(jù)鏈路
objConn = Nothing '清除對象
%>
上面的代碼和ADO沒有什么太大的差別。應該提到的是,ADO.NET提供了兩種數(shù)據(jù)庫連接方式:ADO方式和SQL方式。這里我們是通過ADO方式連接到數(shù)據(jù)庫。關于建立數(shù)據(jù)庫連接的詳細信息,我們在后面的篇幅中將會講到。
ADODatasetCommand
另一個不得不提到的ADO.NET對象是ADODatasetCommand,這個對象專門負責創(chuàng)建我們前面提到的DataSet對象。另一個重要的ADO.NET對象是Dataview,它是DataSet的一個視圖。還記得DataSet可以容納各種各種關系的復雜數(shù)據(jù)嗎?通過Dataview,我們可以把DataSet的數(shù)據(jù)限制到某個特定的范圍。
下面的代碼展示了如何利用ADODatasetCommand為DataSet填充數(shù)據(jù):
'創(chuàng)建SQL字符串
Dim strSQL as String = "SELECT * FROM authors"
'創(chuàng)建對象ADODatasetCommand 和Dataset
Dim objDSCommand as ADODatasetCommand
Dim objDataset as Dataset = New Dataset
objDSCommand = New ADODatasetCommand(strSQL, objConn)
'填充數(shù)據(jù)到Dataset
'并將數(shù)據(jù)集合命名為 "Author Information"
objDSCommand.FillDataSet(objDataset, "Author Information")
顯示Dataset
前面我們已經(jīng)把數(shù)據(jù)準備好。下面我們來看看如何顯示Dataset中的數(shù)據(jù)。在ASP.NET中,顯示DataSet的常用控件是DataGrid,它是ASP.NET中的一個HTML控件,可以很好地表現(xiàn)為一個表格,表格的外觀可以任意控制,甚至可以分頁顯示。這里我們只需要簡單地使用它:
。糰sp:DataGrid id="DataGridName" runat="server"/>
剩下的任務就是把Dataset綁定到這個DataGrid,綁定是ASP.NET的重要概念,我們將另文講解。一般來說,你需要把一個Dataview綁定到DataGrid,而不是直接綁定Dataset。好在Dataset有一個缺省的Dataview,下面我們就把它和DataGrid綁定:
MyFirstDataGrid.DataSource = _
objDataset.Tables("Author Information").DefaultView
MyFirstDataGrid.DataBind()
Dataset的用法
Dataset 并不是Recordset的簡單翻版。從一定的意義上來說,DataView更類似于Recordset。如果說DataReader是訪問數(shù)據(jù)的最容易的方式,那么Dataset則是最完整的數(shù)據(jù)訪問對象。通過Dataset,你可以操作已有的數(shù)據(jù),還可以通過程序創(chuàng)建Dataset,加入Table到Dataset,并建立這些Table之間的關系。
使用Dataset的幾個步驟
第1步,創(chuàng)建到數(shù)據(jù)源的連接:
SQLConnection con =new SQLConnection("server=localhost;uid=sa;pwd=;database=pubs");
第2步,創(chuàng)建DataSetCommand對象,指定一個存儲過程的名字或者一個SQL語句,指定數(shù)據(jù)鏈路;
SQLDataSetCommand cmd =new SQLDataSetCommand("SELECT * FROM Authors", con);
第3步,創(chuàng)建一個Dataset對象
DataSet ds = new DataSet();
第4步,調(diào)用DataSetCommand的FillData方法,為Dataset填充數(shù)據(jù)。注意:數(shù)據(jù)鏈路沒有必要是打開的。如果數(shù)據(jù)鏈路是關閉狀態(tài),F(xiàn)illData函數(shù)會打開它,并在FillData之后關閉數(shù)據(jù)鏈路。如果數(shù)據(jù)鏈路本來就是打開的,在FillData之后,數(shù)據(jù)鏈路依然保持打開狀態(tài)。
int iRowCount = cmd.FillDataSet(ds, "Authors");
第5步,操作數(shù)據(jù)。由于FillData返回了記錄的個數(shù),我們可以構(gòu)造一個循環(huán),來操縱Dataset中的數(shù)據(jù)。
for(int i=0; i< iRowCount; i++){
DataRow dr = ds.Tables[0].Rows[i];
Console.WriteLine(dr["au_lname"]);
}
數(shù)據(jù)綁定技術
Repeater、DataList 、DataGrid控件是System.Web.UI.WebControls名空間(Namespace)里幾個相關的頁面組件。這些控件把綁定到它們的數(shù)據(jù)通過HTML表現(xiàn)出來,它們又被成為"列表綁定控件"(list-bound controls)。
和其他Web組件一樣,這些組件不僅提供了一個一致的編程模型,而且封裝了與瀏覽器版本相關的HTML邏輯。這種特點使得程序員可以針對這個對象模型編程,而無須考慮各種瀏覽器版本的差別和不一致性。
這三個控件具有把它們的相關數(shù)據(jù)"翻譯"成各種外觀的能力。這些外觀包括表格、多列列表、或者任何的HTML流。同時,它們也允許你創(chuàng)建任意的顯示效果。除此之外,它們還封裝了處理提交數(shù)據(jù)、狀態(tài)管理、事件激發(fā)的功能。最后,它們還提供了各種級別的標準操作,包括選擇、編輯、分頁、排序等等。利用這些控件,你可以輕松地完成如下的Web應用:報表、購物推車、產(chǎn)品列表、查詢結(jié)果顯示、導航菜單等等。