top
Loading...
在ASP.NET2.0中實現數據的綁定
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://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗