明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

ASP.NET數(shù)據(jù)庫編程

[摘要]ASP.NET中的ADO.NET和ASP中的ADO相對(duì)應(yīng),它是ADO的改進(jìn)版本。在ADO.NET中,通過Managed Provider所提供的應(yīng)用程序編程接口(API),可以輕松地訪問各種數(shù)據(jù)源的數(shù)據(jù),包括OLEDB所支持的和ODBC支持的數(shù)據(jù)庫! ∠旅娼榻BADO.NET中最重要的兩個(gè)概念:M...

  ASP.NET中的ADO.NET和ASP中的ADO相對(duì)應(yīng),它是ADO的改進(jìn)版本。在ADO.NET中,通過Managed Provider所提供的應(yīng)用程序編程接口(API),可以輕松地訪問各種數(shù)據(jù)源的數(shù)據(jù),包括OLEDB所支持的和ODBC支持的數(shù)據(jù)庫。

  下面介紹ADO.NET中最重要的兩個(gè)概念:Managed Provider和DataSet。

  Managed Provider

  過去,通過ADO的數(shù)據(jù)存取采用了兩層的基于連接的編程模型。隨著多層應(yīng)用的需求不斷增加,程序員需要一個(gè)無連接的模型。ADO.NET就應(yīng)運(yùn)而生了。ADO.NET的Managed Provider就是一個(gè)多層結(jié)構(gòu)的無連接的一致的編程模型。

  Managed Provider提供了DataSet和數(shù)據(jù)中心(如MS SQL)之間的聯(lián)系。Managed Provider包含了存取數(shù)據(jù)中心(數(shù)據(jù)庫)的一系列接口。主要有三個(gè)部件:

  1、連接對(duì)象Connection、命令對(duì)象Command、參數(shù)對(duì)象Parameter提供了數(shù)據(jù)源和DataSet之間的接口。DataSetCommand接口定義了數(shù)據(jù)列和表映射,并最終取回一個(gè)DataSet。

  2、數(shù)據(jù)流提供了高性能的、前向的數(shù)據(jù)存取機(jī)制。通過IdataReader,你可以輕松而高效地訪問數(shù)據(jù)流。

  3、更底層的對(duì)象允許你連接到數(shù)據(jù)庫,然后執(zhí)行數(shù)據(jù)庫系統(tǒng)一級(jí)的特定命令。

  過去,數(shù)據(jù)處理主要依賴于兩層結(jié)構(gòu),并且是基于連接的。連接斷開,數(shù)據(jù)就不能再存取,F(xiàn)在,數(shù)據(jù)處理被延伸到三層以上的結(jié)構(gòu),相應(yīng)地,程序員需要切換到無連接的應(yīng)用模型。這樣,DataSetCommand就在ADO.NET中扮演了極其重要的角色。它可以取回一個(gè)DataSet,并維護(hù)一個(gè)數(shù)據(jù)源和DataSet之間的"橋",以便于數(shù)據(jù)訪問和修改、保存。DataSetCommand自動(dòng)將數(shù)據(jù)的各種操作變換到數(shù)據(jù)源相關(guān)的合適的SQL語句。從圖上可以看出,四個(gè)Command對(duì)象:SelectCommand、InsertCommand、UpdateCommand、DeleteCommand分別代替了數(shù)據(jù)庫的查詢、插入、更新、刪除操作。

  Managed Provider利用本地的OLEDB通過COM Interop來實(shí)現(xiàn)數(shù)據(jù)存取。OLEDB支持自動(dòng)的和手動(dòng)的事務(wù)處理。所以,Managed Provider也提供了事務(wù)處理的能力。
  DataSet

  DataSet是ADO.NET的中心概念。你可以把DataSet想象成內(nèi)存中的數(shù)據(jù)庫。正是由于DataSet,才使得程序員在編程序時(shí)可以屏蔽數(shù)據(jù)庫之間的差異,從而獲得一致的編程模型。

  DataSet支持多表、表間關(guān)系、數(shù)據(jù)約束等等。這些和關(guān)系數(shù)據(jù)庫的模型基本一致。

  通過ADO.NET訪問數(shù)據(jù)庫

  不論從語法來看,還是從風(fēng)格和設(shè)計(jì)目標(biāo)來看,ADO.NET都和ADO有顯著的不同。在ASP中通過ADO訪問數(shù)據(jù)庫,一般要通過以下四個(gè)步驟:

  1、 創(chuàng)建一個(gè)到數(shù)據(jù)庫的鏈路,即ADO.Connection;

  2、 查詢一個(gè)數(shù)據(jù)集合,即執(zhí)行SQL,產(chǎn)生一個(gè)Recordset;

  3、 對(duì)數(shù)據(jù)集合進(jìn)行需要的操作;

  4、 關(guān)閉數(shù)據(jù)鏈路。

  在ADO.NET里,這些步驟有很大的變化。ADO.NET的最重要概念之一是DataSet。DataSet是不依賴于數(shù)據(jù)庫的獨(dú)立數(shù)據(jù)集合。所謂獨(dú)立,就是:即使斷開數(shù)據(jù)鏈路,或者關(guān)閉數(shù)據(jù)庫,DataSet依然是可用的。如果你在ASP里面使用過非連接記錄集合(Connectionless Recordset),那么DataSet就是這種技術(shù)的最徹底的替代品。
有了DataSet,那么,ADO.NET訪問數(shù)據(jù)庫的步驟就相應(yīng)地改變了:

  1、創(chuàng)建一個(gè)數(shù)據(jù)庫鏈路;

  2、請(qǐng)求一個(gè)記錄集合;

  3、把記錄集合暫存到DataSet;

  4、如果需要,返回第2步;(DataSet可以容納多個(gè)數(shù)據(jù)集合)

  5、關(guān)閉數(shù)據(jù)庫鏈路;

  6、在DataSet上作所需要的操作。

  DataSet在內(nèi)部是用XML來描述數(shù)據(jù)的。由于XML是一種平臺(tái)無關(guān)、語言無關(guān)的數(shù)據(jù)描述語言,而且可以描述復(fù)雜數(shù)據(jù)關(guān)系的數(shù)據(jù),比如父子關(guān)系的數(shù)據(jù),所以DataSet實(shí)際上可以容納具有復(fù)雜關(guān)系的數(shù)據(jù),而且不再依賴于數(shù)據(jù)庫鏈路。

  ADO.NET有許多對(duì)象,我們先看看最基本的也最常用的幾個(gè)。首先看看ADOConnection。和ADO的ADODB.Connection對(duì)象相對(duì)應(yīng),ADOConnection維護(hù)一個(gè)到數(shù)據(jù)庫的鏈路。為了使用ADO.NET對(duì)象,我們需要引入兩個(gè)NameSpace:System.Data和System.Data.ADO,使用ASP.NET的Import指令就可以了:

 。%@ Import Namespace="System.Data" %> 

  <%@ Import Namespace="System.Data.ADO" %> 

和ADO的Connection對(duì)象類似,ADOConnection對(duì)象也有Open和Close兩個(gè)方法。下面的這個(gè)例子展示了如何連接到本地的MS SQL Server上的Pubs數(shù)據(jù)庫。

<%@ Import Namespace="System.Data" %> 
<%@ Import Namespace="System.Data.ADO" %> 
<%
'設(shè)置連接串...
Dim strConnString as String
strConnString = "Provider=SQLOLEDB; Data Source=(local); " & _
"Initial Catalog=pubs; User ID=sa"

'創(chuàng)建對(duì)象ADOConnection
Dim objConn as ADOConnection
objConn = New ADOConnection

'設(shè)置ADOCOnnection對(duì)象的連接串
objConn.ConnectionString = strConnString

objConn.Open() '打開數(shù)據(jù)鏈路

'數(shù)據(jù)庫操作代碼省略

objConn.Close() '關(guān)閉數(shù)據(jù)鏈路
objConn = Nothing '清除對(duì)象
%> 
 

上面的代碼和ADO沒有什么太大的差別。應(yīng)該提到的是,ADO.NET提供了兩種數(shù)據(jù)庫連接方式:ADO方式和SQL方式。這里我們是通過ADO方式連接到數(shù)據(jù)庫。關(guān)于建立數(shù)據(jù)庫連接的詳細(xì)信息,我們?cè)诤竺娴钠袑?huì)講到。

  ADODatasetCommand

  另一個(gè)不得不提到的ADO.NET對(duì)象是ADODatasetCommand,這個(gè)對(duì)象專門負(fù)責(zé)創(chuàng)建我們前面提到的DataSet對(duì)象。另一個(gè)重要的ADO.NET對(duì)象是Dataview,它是DataSet的一個(gè)視圖。還記得DataSet可以容納各種各種關(guān)系的復(fù)雜數(shù)據(jù)嗎?通過Dataview,我們可以把DataSet的數(shù)據(jù)限制到某個(gè)特定的范圍。

  下面的代碼展示了如何利用ADODatasetCommand為DataSet填充數(shù)據(jù):

 

'創(chuàng)建SQL字符串
Dim strSQL as String = "SELECT * FROM authors"

'創(chuàng)建對(duì)象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ù)準(zhǔn)備好。下面我們來看看如何顯示Dataset中的數(shù)據(jù)。在ASP.NET中,顯示DataSet的常用控件是DataGrid,它是ASP.NET中的一個(gè)HTML控件,可以很好地表現(xiàn)為一個(gè)表格,表格的外觀可以任意控制,甚至可以分頁顯示。這里我們只需要簡單地使用它:

 。糰sp:DataGrid id="DataGridName" runat="server"/> 

  剩下的任務(wù)就是把Dataset綁定到這個(gè)DataGrid,綁定是ASP.NET的重要概念,我們將另文講解。一般來說,你需要把一個(gè)Dataview綁定到DataGrid,而不是直接綁定Dataset。好在Dataset有一個(gè)缺省的Dataview,下面我們就把它和DataGrid綁定:
MyFirstDataGrid.DataSource = _
objDataset.Tables("Author Information").DefaultView
MyFirstDataGrid.DataBind()


  Dataset的用法
  Dataset 并不是Recordset的簡單翻版。從一定的意義上來說,DataView更類似于Recordset。如果說DataReader是訪問數(shù)據(jù)的最容易的方式,那么Dataset則是最完整的數(shù)據(jù)訪問對(duì)象。通過Dataset,你可以操作已有的數(shù)據(jù),還可以通過程序創(chuàng)建Dataset,加入Table到Dataset,并建立這些Table之間的關(guān)系。

  使用Dataset的幾個(gè)步驟

  第1步,創(chuàng)建到數(shù)據(jù)源的連接:

   SQLConnection con =new SQLConnection("server=localhost;uid=sa;pwd=;database=pubs");

  第2步,創(chuàng)建DataSetCommand對(duì)象,指定一個(gè)存儲(chǔ)過程的名字或者一個(gè)SQL語句,指定數(shù)據(jù)鏈路;

   SQLDataSetCommand cmd =new SQLDataSetCommand("SELECT * FROM Authors", con);

  第3步,創(chuàng)建一個(gè)Dataset對(duì)象

   DataSet ds = new DataSet();

  第4步,調(diào)用DataSetCommand的FillData方法,為Dataset填充數(shù)據(jù)。注意:數(shù)據(jù)鏈路沒有必要是打開的。如果數(shù)據(jù)鏈路是關(guān)閉狀態(tài),F(xiàn)illData函數(shù)會(huì)打開它,并在FillData之后關(guān)閉數(shù)據(jù)鏈路。如果數(shù)據(jù)鏈路本來就是打開的,在FillData之后,數(shù)據(jù)鏈路依然保持打開狀態(tài)。

   int iRowCount = cmd.FillDataSet(ds, "Authors");

  第5步,操作數(shù)據(jù)。由于FillData返回了記錄的個(gè)數(shù),我們可以構(gòu)造一個(gè)循環(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ù)綁定技術(shù)

  Repeater、DataList 、DataGrid控件是System.Web.UI.WebControls名空間(Namespace)里幾個(gè)相關(guān)的頁面組件。這些控件把綁定到它們的數(shù)據(jù)通過HTML表現(xiàn)出來,它們又被成為"列表綁定控件"(list-bound controls)。

  和其他Web組件一樣,這些組件不僅提供了一個(gè)一致的編程模型,而且封裝了與瀏覽器版本相關(guān)的HTML邏輯。這種特點(diǎn)使得程序員可以針對(duì)這個(gè)對(duì)象模型編程,而無須考慮各種瀏覽器版本的差別和不一致性。

  這三個(gè)控件具有把它們的相關(guān)數(shù)據(jù)"翻譯"成各種外觀的能力。這些外觀包括表格、多列列表、或者任何的HTML流。同時(shí),它們也允許你創(chuàng)建任意的顯示效果。除此之外,它們還封裝了處理提交數(shù)據(jù)、狀態(tài)管理、事件激發(fā)的功能。最后,它們還提供了各種級(jí)別的標(biāo)準(zhǔn)操作,包括選擇、編輯、分頁、排序等等。利用這些控件,你可以輕松地完成如下的Web應(yīng)用:報(bào)表、購物推車、產(chǎn)品列表、查詢結(jié)果顯示、導(dǎo)航菜單等等。