ASP.NET的第一個版本就已經建立了一組新的資料庫繫結控制項。有了這些控制項的支援,資料的可視化和編輯就簡單多了,其中一個最重要的控制項就是DataGrid控制項。但是這個控制項也有很多缺點。它為資料的排序,分頁和編輯提供了一些內建的功能,但必須手動實現。
而ASP.NET的新版本2.0中採用了一種新的方式來解決以前版本的諸多問題,並且提供了標準的功能。現在可以對任何資料來源進行排序,分頁和編輯----在大多數情況下不需要輸入任何代碼。由於幾乎所有的動態WEB程式都要考慮到與資料庫的互動,幸運的是在ASP.NET 2.0中,我們可以輕鬆的實現如下這些操作:
· 選擇資料庫中我們所需要的資料,並在頁面中進行相應的顯示。
· 利用GridView控制項實現排序,分頁和資料緩衝等功能,這使我們得到的資料更加直觀和有序。
· 更新,插入和刪除資料是我們在日常開發中經常碰到的,GridView控制項使得這一切變得更加高效和簡單。
· 當資料量比較龐大時,如何快速的找到所需要的資料就需要考慮資料篩選了。在後文中我將詳細介紹任何實現資料篩選功能。
由於本文主要是討論資料存取方面的知識,因此我們先來介紹一下ASP.NET 2.0在這方面的新增功能:
· 資料來源控制項 -- ASP.NET 2.0 引入了聲明性資料來源控制項,這些控制項向頁上的資料繫結控制項公開來自後端儲存(例如 SQL 資料庫、中介層業務對象或 XML 檔案)的資料。資料來源控制項還公開諸如排序、分頁、緩衝、更新、插入和刪除資料等功能,資料繫結控制項能夠自動調用這些功能而無需編寫任何的代碼。
· 新的資料繫結控制項 -- 除了保留ASP.NET 1.x 版中的一些資料繫結控制項外,ASP.NET 2.0 還包括諸如 GridView、DetailsView、FormView、TreeView 和 Menu 等新的資料繫結控制項,我們可以自訂這些控制項以不同的方式開顯示資料。GridView、DetailsView 和 FormView 控制項還能自動調用資料來源功能,使得我們可以更加簡便的向資料驅動頁添加排序、分頁和更新操作等功能。
· 資料控制項參數 -- 資料來源能夠使用 ASP.NET 2.0 中新的資料控制項參數對象從各種來源接受輸入參數。使用這些參數對象可以輕鬆地向參數化資料操作提供伺服器控制項屬性值、會話、應用程式、Cookie 和 querystring 欄位以及使用者設定檔屬性。使用這些參數,只需很少的自訂代碼或無需自訂代碼就能支援篩選和主/詳細資料方案。
· 改進的資料繫結文法 -- ASP.NET 2.0 中DataBinder.Eval 資料繫結文法已得到簡化,並且我們還可以將雙向資料繫結與控制項屬性相關聯,以允許自動將值傳遞給資料來源更新、插入或刪除操作。對於分層的 XML 資料,ASP.NET 2.0 還包含一種基於 Xpath 的資料繫結文法。
· 使用 SQL Express 的本地檔案資料庫 -- 為簡化開發,ASP.NET 2.0 現在支援在應用程式中串連到作為本地檔案的 SQL Express 資料庫的能力,從而消除僅為了執行開發工作而向伺服器提供資料庫的需要。當然,您仍然能夠串連到基於伺服器的 SQL 資料庫。
ASP.NET 2.0已經增加了兩種新的伺服器控制項來實現資料繫結模型。這兩種新的伺服器控制項可以處理許多複雜的資料方案,這使得開發人員無須理解資料繫結過程中的一系列運行機制,這樣我們就可以把開發的重點放在程式的構架和效能完善上,而不是重複的代碼編寫過程上。
為了使你可以充分的理解資料繫結模型,現在我們重點來介紹一下這兩種新的伺服器控制項:
資料來源控制項
資料來源控制項沒有特定的呈現形式,而是表示特定的後端資料存放區,例如資料庫、業務對象、XML 檔案或 XML Web services。資料來源控制項還支援針對資料的豐富功能(例如排序、分頁、篩選、更新、刪除和插入),資料繫結 UI 控制項能夠自動使用這些功能。資料來源控制項的其他優點包括資料自動綁定功能,無須再調用DataBind()方法,從而大大減少了所需要的代碼量。在設計時其具有更多的擴充支援,並且保留了1.X版本的靈活性。
ASP.NET 2.0中現成的資料來源控制項如下:
| 名稱 |
說明 |
| SqlDataSource |
訪問SQL Server,OLE DB,ODBC,Oracle和其他存在定製.NET Data Provider的資料庫系統(提供者可以是MySQL,FireBird等)。 |
| ObjectDataSource |
支援綁定到中介層對象,例如資料訪問層或業務組件。 |
| AccessDataSource |
可以通過指定檔案名稱來方便地操作Microsoft Access資料庫。 |
| SiteMapDataSource |
支援綁定到 ASP.NET 2.0 網站導覽提供者公開的階層。 |
| XmlDataSource |
支援綁定到 XML 檔案或文檔。 |
資料繫結控制項
資料繫結控制項是將資料作為標記向發出請求的用戶端裝置或瀏覽器呈現的 UI 控制項。資料繫結控制項能夠自動綁定到從資料來源公開的資料,並在頁請求生命週期中的適當時間擷取資料。這些控制項還可以選擇利用資料來源功能,例如排序、分頁、篩選、更新、刪除和插入。資料繫結控制項通過其 DataSourceID 屬性串連到資料來源控制項。您可能熟悉 ASP.NET 1.x 版中的一些資料繫結控制項,例如 DataGrid、DataList、Repeater 和諸如 DropDownList 這樣的清單控制項。ASP.NET 2.0 還包含幾個新的資料繫結控制項,例如:
| 名稱 |
說明 |
| GridView |
以網格格式呈現資料。此控制項是 DataGrid 控制項的演變形式,並且能夠自動利用資料來源功能。 |
| DetailsView |
在標籤/值對的表格中呈現單個資料項目,類似於 Microsoft Access 中的表單檢視。此控制項也能自動利用資料來源功能。 |
| FormView |
在由自訂模板定義的表單中一次呈現單個資料項目。在標籤/值對的表格中呈現單個資料項目,類似於 Microsoft? Access 中的表單檢視。此控制項也能自動利用資料來源功能。 |
| TreeView |
在可展開的節點的分層樹視圖中呈現資料。 |
| Menu |
在分層動態菜單(包括彈出式菜單)中呈現資料. |
ASP.NET 2.0中實現資料的綁定
在WEB程式中,我們最常用到的功能之一就是顯示來自諸如 Microsoft SQL Server、Oracle 等 SQL 資料庫或其他 OLEDB 或 ODBC 資料存放區區的資料。SqlDataSource 控制項在 Web 應用程式中可以表示到資料庫的直接連接,並且資料繫結控制項可使用它自動檢索資料。以前我們要編寫大量的代碼來實現資料庫的串連和命令的查詢,現在SqlDataSource 控制項封裝了實現這些功能的ADO.NET代碼。由於資料查詢被直接指定為資料來源控制項的屬性,因為資料查詢仍然在頁代碼中維護,所以我們稱之為兩層模型。由於這個原因,SqlDataSource 控制項通常針對不需要完全封裝的資料中介層對象的小型業餘愛好者或個人網站。本教程後面有一個部分將討論 ObjectDataSource 控制項,該控制項針對需要資料庫查詢的中介層封裝的較大型企業。
為了示範如何綁定資料庫中的資料,本節中的樣本利用一個新的名為 GridView 的資料繫結控制項。GridView 控制項是一種在ASP.NET 2.0 中用網格形式來呈現資料的新的資料繫結控制項。網格中的每一行對應一個資料記錄,列表示記錄的欄位。GridView 控制項是ASP.NET 1.x版本中流行控制項DataGrid的正式繼承者。2.0版本因相容性的緣故仍支援DataGrid,但是它已經不在工具箱中顯示了。所以在新的項目中不要使用它。如果新控制項GridView不僅提供了舊控制項的所有功能,還提綱了更加完善的新功能,那為什麼還要使用舊控制項呢?特別是GridView可以利用新的Data Source Provider概念更好地工作。
GridView 控制項的主要功能如下:
· 綁定到任何單層式結構或多層結構(僅綁定第一層)的資料來源控制項。
· 內建排序功能。
· 選擇資料記錄。
· 更新和刪除資料記錄。
· 支援多個關鍵字段。
· 支援用多個欄位來建立超連結。
· 內建的分頁功能。
· 對 GridView 物件模型進行編程訪問以動態設定屬性和處理事件。
· 諸如 CheckBoxField 和 ImageField 等新的列類型。
· 根據主題(Theme)和風格(Style)進行可視化的調整。
· 根據不同的(移動)裝置來調整顯示結果。
· 指定背景圖片。
建立一個唯讀報表及其工作原理:
最簡單的資料驅動頁面就是顯示一個唯讀報表,它主要是顯示資料庫中的一些資料。它並不允許使用者去操作其表現形式和修改其中的資料。如果準備建立一個居於SQL Server資料庫的唯讀報表的話,首先必須在頁面上配置一個SqlDataSource資料來源,然後將一個資料繫結控制項的"DataSourceID"屬性指定為SqlDataSource資料來源控制項的"ID"屬性,這樣就為資料來源控制項和資料繫結控制項建立了一個串連。
在下面的樣本中,GridView 控制項將綁定到一個串連到 SQL Server 資料庫的 SqlDataSource 控制項上。
第一步:建立一個"ASP.NET Web site"項目,命名為"GridViewSqlDataSource"
第二步:拖拽一個"GridView"控制項到頁面上,然後點擊右上方的"智能標籤"。在"選擇資料來源"項中選擇"建立資料來源"項,將出現如下視窗:
第三步:在資料來源設定精靈中選擇"Database"為該程式的資料來源類型。其預設"ID"為SqlDataSource1,點擊"OK"按鈕後,出現如下視窗:
第四步:點擊上面視窗的"建立串連"按鈕,將出現 "資料庫連接"視窗,由於我們希望在GridView顯示的是SQL Server 2000內建的"pubs"資料庫中的資訊,所以我們選擇"pubs"資料庫做為資料讀取的來源。選擇後的圖示如下:
第五步:確定選擇的資料庫後,單擊"確定"按鈕,VS 2005將自動化佈建好你的連接字串,本例的為"Data Source=hoowoo;Initial Catalog=pubs;Integrated Security=True"。在新彈出的視窗中點擊"下一步"後,將得到如下視窗:
因為考慮到資料庫的安全效能,所以我們希望可以通過其他方式來實現資料庫連接字串的資訊隱藏。在這我們通過給連接字串一個別名,並且將這個別名儲存在Web.Config檔案中。VS 2005會自動將別名和連接字串進行映射,以實現資料庫的串連。
第六步:單擊"下一步"按鈕後,將會出現如下視窗:
我們可以直接指定一個表格,選擇其中的某些欄位,單擊"下一步"按鈕後,就完成了整個的資料庫配置過程。
執行該程式後,其頁面顯示如下:
現在我們來分析一下所產生的頁面代碼,查看代碼可以在頁面中右鍵選擇"查看代碼"項。
<form runat="server"> <asp:GridView ID="GridView1" DataSourceID="SqlDataSource1" runat="server"> <Columns> <asp:BoundField HeaderText="Last Name" DataField="au_lname" /> <asp:BoundField HeaderText="First Name" DataField="au_fname" /> <asp:BoundField HeaderText="City" DataField="city" /> <asp:BoundField HeaderText="State" DataField="state" /> <asp:BoundField HeaderText="Zip Code" DataField="zip" /> <asp:CheckBoxField HeaderText="Contract" DataField="contract" /> </Columns> </asp:GridView> <asp:SqlDataSource ID="SqlDataSource1" runat="server" SelectCommand="SELECT [au_lname], [au_fname],[city],[state],[zip] FROM [authors]" ConnectionString="<%$ ConnectionStrings:Pubs %>" /> </form> |
在本例中,DataGrid控制項指定其"DataSourceID"屬性為"SqlDataSource1",這樣就建立了資料繫結控制項和資料來源控制項之間的關聯。
GridView 控制項反映 SqlDataSource 返回的資料記錄的欄位以動態產生網格的列。通過向 GridView 的 Columns 集合添加 DataControlField 對象,還可以指定要顯示的顯式欄欄位。這樣允許確切指定要顯示的列以及它們的相對順序。可分配給Columns集合的其他欄位類型包括 ImageField、HyperLinkField、CommandField、ButtonField 和 TemplateField。 我們可以根據需要來選擇這些
欄位類型。
SqlDataSource 的 ConnectionString 屬性指定到資料庫的連接字串,SelectCommand 屬性指定要執行以檢索資料的查詢。連接字串可以在頁中按字面文本指定,不過在此例中,該屬性是採用一種新的文法方式在Web.Config來查詢該連接字串的實際值。
在本例中,Web.Config中的程式碼片段如下:
<connectionStrings> <add name="Pubs" connectionString="Data Source=hoowoo;Initial Catalog=pubs; Integrated Security=True" providerName="System.Data.SqlClient"/> </connectionStrings> |
通過在Web.Config中添加一個"<connectionStrings></connectionString>"節點,就可以實現連接字串與"name"屬性指定的別名"Pubs"的映射。在 Web.config 中儲存連接字串是對任何 ASP.NET 應用程式的建議做法,這樣不僅實現了程式的集中管理,而且保護了資料庫連接字串。在VS 2005中,我們可以使用 ASP.NET 2.0 中的一個命令列工具來加密此節點以實現進一步的安全性。
注意:SqlDataSource 控制項並不僅限於串連到SQL Server 資料庫。它實際上能夠串連到被配置為 System.Data.Common.DbProviderFactory 的任何託管 ADO.NET 提供者。預設情況下,.NET Framework machine.config 中包括四個提供者:
<configuration> <system.data> <DbProviderFactories> <add name="Odbc Data Provider" invariant="System.Data.Odbc" type="System.Data.Odbc.OdbcFactory, ..." /> <add name="OleDb Data Provider" invariant="System.Data.OleDb" type="System.Data.OleDb.OleDbFactory, ..." /> <add name="OracleClient Data Provider" invariant="System.Data.OracleClient" type="System.Data.OracleClient.OracleClientFactory, ..." /> <add name="SqlClient Data Provider" invariant="System.Data.SqlClient" type="System.Data.SqlClient.SqlClientFactory, ..." /> </DbProviderFactories> </system.data> </configuration> |
SqlDataSource 的 ProviderName 屬性可設定為任何有效提供者工廠的固定名稱(預設為 System.Data.SqlClient)。注意,如果更改提供者名稱,則需要確保 ConnectionString 和 SelectCommand 屬性使用所選提供者的正確文法。
我們還可以給SqlDataSource資料來源控制項的SelectCommand屬性指定一個預存程序來替代一個SQL 命令,而且使用預存程序具有更大的靈活性。為了實現該功能,可以設定SqlDataSource資料來源控制項的SelectCommandType屬性為"StoredProcedure".
現在我們就利用SQL Server內建的樣本資料庫Northwind的"TenMostExpensiveProducts"預存程序來實現一個唯讀報表。
該預存程序主要是在"Products"表中選擇"ProductName"和"UnitPrice"兩個欄位,其代碼如下:
create procedure "Ten Most Expensive Products" AS SET ROWCOUNT 10 SELECT Products.ProductName AS TenMostExpensiveProducts, Products.UnitPrice FROM Products ORDER BY Products.UnitPrice DESC |
頁面代碼如下:
<form id="form1" runat="server"> <asp:GridView ID="GridView1" DataSourceID="SqlDataSource1" AutoGenerateColumns="False" runat="server"> <Columns> <asp:BoundField DataField="TenMostExpensiveProducts" HeaderText="Product" /> <asp:BoundField DataField="UnitPrice" DataFormatString="{0:c}" HeaderText="Price" /> </Columns> </asp:GridView> <asp:SqlDataSource ID="SqlDataSource1" runat="server" SelectCommand="Ten Most ExpensiveProducts" ConnectionString= "<%$ ConnectionStrings:Northwind %>" SelectCommandType="StoredProcedure" /> </form> |
在本例中我們可以通過設定SqlDataSource資料來源控制項的SelectCommandType屬性為"StoredProcedure"來實現,如:
也可以在資料來源設定精靈按下述步驟進行:
當進行到"配置選擇語句"視窗時,選擇"指定一個自訂的SQL語句或預存程序"項,單擊"下一步"
在"自訂語句或預存程序"視窗中,選擇"儲存過程"項。並選擇"Ten Most Expensive Products"
等一系列的操作完成後,按F5執行該程式,頁面顯示如下:
一般情況下,SqlDataSource資料來源控制項只返回包含查詢結果的DataSet對象中的DataView。你可以配置SqlDataSource資料來源控制項將資料以DataReader的發生返回。當你希望唯讀,向前的資料存取時,採用DataReader的比DataSet具有更好的效能。儘管如此,當你需要SqlDataSource資料來源控制項的分頁支援時,就必須採用DataSet的方式。
設定SqlDataSource資料來源控制項的DataSourceMode屬性為"DataReader",預設為"DataSet".如:
頁面代碼如下:
<form id="form1" runat="server"> <asp:GridView ID="GridView1" DataSourceID="SqlDataSource1" AutoGenerateColumns="False" runat="server"> <Columns> <asp:BoundField DataField="TenMostExpensiveProducts" HeaderText="Product" /> <asp:BoundField DataField="UnitPrice" DataFormatString="{0:c}" HeaderText="Price" /> </Columns> </asp:GridView> <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:Northwind %>" SelectCommand="Ten Most Expensive Products" SelectCommandType="StoredProcedure" DataSourceMode="DataReader" /> |
原文出處:http://blog.csdn.net/hiyavip/archive/2005/12/31/566835.aspx