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