在ASP.NET 2.0中操作資料之四十六:使用SqlDataSource控制項檢索資料_自學過程

來源:互聯網
上載者:User

導言

  到目前為止,我們探討的教程是由表現層,商務邏輯層和資料訪問層構成的層次體繫結構。資料訪問層和商務邏輯層分別在教程第一和第二章提到。在Displaying Data With the ObjectDataSource 這篇教程裡,我們探討了怎樣用ASP.NET 2.0的新控制項--ObjectDataSource控制項在表現層展示資料。

  本教程到目前為止用這種階層來處理資料。然而繞過這種體繫結構,通過直接把資料查詢和商務邏輯放在Web頁面上,也可以達到直接在ASP.NET頁面上訪問,插入,更新,刪除資料庫資料的目的。對十分龐大或者複雜的應用程式而言,使用階層對程式的成功和可維護性是很重要的。然而對很簡單的程式來說,沒有必要使用層次體繫結構。

  ASP.NET 2.0 提供了5個內建的資料來源控制項, SqlDataSource控制項, AccessDataSource控制項, ObjectDataSource控制項, XmlDataSource控制項, 和SiteMapDataSource控制項。SqlDataSource控制項能直接從關係型資料庫中訪問和更新資料,包括Microsoft SQL Server,Microsoft Access, Oracle, MySQL等資料庫。在本章以及接下來的3章教程裡面,我們將探討如何用SqlDataSource控制項來查詢和篩選資料庫資料,包括插入,更新和刪除。


圖1:ASP.NET 2.0 的5個內建的資料來源控制項

比較ObjectDataSource控制項和 SqlDataSource控制項

  從理論上說,ObjectDataSource控制項和 SqlDataSource控制項都是作為訪問資料的一種代理。就象在教程Displaying Data With the ObjectDataSource中討論的那樣,可以在ObjectDataSource控制項中設定展示資料的資料類型,以及用來選擇,插入,更新和刪除資料所調用的方法。一旦完成了ObjectDataSource控制項的設定,GridView, DetailsView, DataList等資料Web控制項便可以通過綁定ObjectDataSource控制項調用其Select(), Insert(), Delete(), 和 Update() methods方法。

  雖然SqlDataSource控制項具有和SqlDataSource控制項同樣的功能,但使用SqlDataSource控制項時,我們必須提供詳細的資料庫連接字串,以及用來執行選擇,更新,插入,刪除資料的ad-hoc SQL查詢或預存程序。當調用SqlDataSource控制項的Select(), Insert(), Update(), and Delete() 方法時,SqlDataSource控制項串連到資料庫,並傳遞適當的SQL查詢。下圖展示了這些方法如何串連資料庫,傳遞查詢和返回結果。


圖2  SqlDataSource控制項充當訪問資料庫的代理

注意:在本章教程中我們主要關注如何從資料庫獲得資料,在後面的教程中,我們將討論如何通過設定SqlDataSource控制項以支援插入,更新和刪除資料。

SqlDataSource 控制項和 AccessDataSource 控制項

  除了 SqlDataSource 控制項外,ASP.NET 2.0 還包AccessDataSource 控制項。這兩種不同的控制項使很多開發人員誤以為AccessDataSource 控制項主要是被設計來與Microsoft Access資料庫打交道,SqlDataSource 控制項主要是被設計來來與Microsoft SQL Server打交道。實際情況是,SqlDataSource 控制項可以與幾乎所有.NET能訪問的關係型資料庫打交道。包括任何 OleDb, ODBC,compliant data stores,比如:Microsoft SQL Server, Microsoft Access, Oracle, Informix, MySQL, and PostgreSQL等。

  SqlDataSource 控制項和 AccessDataSource 控制項的唯一區別在於AccessDataSource 控制項的資料庫連接資訊只需要提供Access資料庫檔案的訪問路徑。而SqlDataSource 控制項則需要提供完整的連接字串。

第一步:建立 SqlDataSource 頁面

  在我們探討用SqlDataSource控制項直接操作資料庫資料之前,讓我們先花些時間在我們的網站項目裡添加這些本節裡和下三節裡需要的ASP.NET頁面。首先添加一個名為SqlDataSource的檔案夾,在裡面添加下列頁面,並配置為使用Site.master母板頁。

Default.aspx
Querying.aspx
ParameterizedQueries.aspx
InsertUpdateDelete.aspx
OptimisticConcurrency.aspx


圖3:為SqlDataSource相關教程添加頁面

  類似在其它檔案夾裡,EditInsertDelete檔案夾裡的Default.aspx將列出這些教程章節。記得使用者控制項提供這個功能。因此,從方案總管中拖拽一個這個使用者控制項到頁面的設計檢視,從而添加它到Default.aspx頁面


圖4:將使用者控制項添加到Default.aspx頁面

  最後把這4個頁面加入網站地圖中。開啟Web.sitemap檔案並且把下列代碼加在“Adding Custom Buttons to the DataList and Repeater”siteMapNode標記之後:

<siteMapNode url="~/SqlDataSource/Default.aspx" title="Using the SqlDataSource Control" description="Work directly with database data using the SqlDataSource control."> <siteMapNode url="~/SqlDataSource/Querying.aspx" title="Retrieving Database Data"  description="Examines how to query data from a database that can then be      displayed through a data Web control."/> <siteMapNode url="~/SqlDataSource/ParameterizedQueries.aspx"  title="Parameterized Queries"  description="Learn how to specify parameterized WHERE clauses in the      SqlDataSource's SELECT statement." /> <siteMapNode url="~/SqlDataSource/InsertUpdateDelete.aspx"  title="Inserting, Updating, and Deleting Database Data"  description="See how to configure the SqlDataSource to include INSERT, UPDATE,      and DELETE statements." /> <siteMapNode url="~/SqlDataSource/OptimisticConcurrency.aspx"  title="Using Optimistic Concurrency"  description="Explore how to augment the SqlDataSource to include support for      optimistic concurrency." /></siteMapNode>



圖5:更新網站地圖使之包含新的頁面

第二步:添加並設定 SqlDataSource控制項

  在SqlDataSource檔案夾中開啟Querying.aspx頁面,切換到設計試圖。從工具箱中拖一個SqlDataSource控制項到設計器中,設定其ID 為 ProductsDataSource。和ObjectDataSource一樣,SqlDataSource不產生任何的聲明標記,所以現在在頁面上看起來就象一個灰色的方塊。點擊SqlDataSource控制項的智能標籤,點“Configure Data Source”連結,進入資料來源設定精靈。


圖6:在智能標籤裡點擊“設定資料來源”連結。

  ObjectDataSource控制項和 SqlDataSource控制項的設定精靈有些許不同,但最終目的都是相同的:詳細的說明了如何從資料庫擷取,插入,更新和刪除資料。ObjectDataSource控制項明確指定了要訪問的資料庫,並提供了要使用的SQL查詢聲明或預存程序的詳細情況

  嚮導的第一步是選擇要訪問的資料庫,在下拉式清單中包含了放在App_Data 檔案夾中的資料庫,以及添加到伺服器總管的資料連線節點中的資料庫。一旦我們將一個串連到App_Data檔案夾中的NORTHWIND.MDF資料庫的連接字串添加到項目的Web.config 檔案中,這個連接字串就會出現在下拉式清單的選項。如下圖,選中它,點“下一步”。


圖7:從下拉式清單裡選擇NORTHWINDConnectionString

  選擇資料庫後,嚮導轉入“如何從資料庫檢索資料”介面。有2種方式:第一種指定自訂SQL語句或預存程序,第二種是指定來自表或視圖的列。

  注意:我們先探討使用“指定來自表或視圖的列”選項的執行個體,稍後再探討用“自訂SQL語句或預存程序”選項的執行個體。

  圖8是我們點擊“指定來自表或視圖的列”選項按鈕時的畫面,這裡我們選擇Products表,返回ProductID, ProductName和UnitPrice 列。完成選擇後,在底部的方框內將顯示SQL語句: SELECT [ProductID], [ProductName], [UnitPrice] FROM [Products]


圖8:從表Products返回資料。

  完成上述設定後,點“下一步”按鈕,進入測試查詢介面,在這裡可以測試上一步所設定的查詢的結果。點擊“測試查詢”按鈕,執行查詢。


圖9:點擊“測試”,從SELECT 查詢檢索資料。

  最後,點“完成”按鈕完成嚮導。

  和ObjectDataSource一樣,SqlDataSource的嚮導設定只是完成了對SqlDataSource控制項屬性的賦值而已,即ConnectionString 屬性和SelectCommand 屬性。完成設定之後,我們的SqlDataSource控制項代碼應該和下面的差不多:

<asp:SqlDataSource ID="ProductsDataSource" runat="server" ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>" SelectCommand="SELECT [ProductID], [ProductName], [UnitPrice] FROM [Products]"></asp:SqlDataSource>

  其中ConnectionString屬性提供了怎樣串連資料庫的詳細資料,可以用完整的,硬式編碼連接字串對其賦值,也可以用Web.config檔案中的連接字串來賦值。當用Web.config檔案中的字串時,文法為:<%$ expressionPrefix:expressionValue %>,特別地expressionPrefix就是“ConnectionStrings”,而expressionValue 則是Web.config檔案<connectionStrings>部分中,連接字串的名字。關於此文法的更多資訊請參考: ASP.NET Expressions Overview

  而SelectCommand屬性是SQL查詢語句或預存程序的詳細陳述。

第三步:添加資料Web控制項並綁定到SqlDataSource

  一旦設定好SqlDataSource後,就可以用GridView 或DetailsView等資料Web控制項綁定它。在本篇教程中我們使用GridView,從工具箱拖一個GridView控制項到頁面上,在智能標籤中的“選擇資料來源”裡選ProductsDataSource ,這樣就將GridView控制項綁定到我們前面設定的SqlDataSource控制項了。


圖10:添加GridView控制項並綁定到SqlDataSource

  完成綁定後,Visual Studio 會自動為GridView從資料來源控制項返回的每一列添加一個BoundField 或CheckBoxField 。就本文來說既然SqlDataSource從資料庫返回三列:ProductID, ProductName, 和 UnitPrice ,那麼Visual Studio就在自動在GridView中產生三列(three fields )。

  花幾分鐘來設定GridView的三個BoundFields:把ProductName field的HeaderText 屬性設定為“Product Name”,UnitPrice field設定為“Price”,同時格式化為貨幣形式。修改後,你的GridView代碼看起來應該象下面這樣:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="ProductID" DataSourceID="ProductsDataSource" EnableViewState="False"> <Columns>  <asp:BoundField DataField="ProductID" HeaderText="ProductID"   InsertVisible="False" ReadOnly="True" SortExpression="ProductID" />  <asp:BoundField DataField="ProductName" HeaderText="Product Name"   SortExpression="ProductName" />  <asp:BoundField DataField="UnitPrice" HeaderText="Price"   SortExpression="UnitPrice" DataFormatString="{0:c}"   HtmlEncode="False" /> </Columns></asp:GridView>

  在瀏覽器中瀏覽本頁,如圖11所示,GridView列出了每個產品的ProductID, ProductName, 和UnitPrice。


圖11:GridView裡列出了每個產品的ProductID, ProductName, 和UnitPrice。

  測試該頁面時,GridView調用其資料來源控制項的Select()方法。如果我們使用ObjectDataSource控制項來測試該頁面的話,它將會調用邏輯層ProductsBLL class的GetProducts() 方法。而用SqlDataSource控制項的話,其Select()方法將直接連結到要訪問的資料庫,並傳遞SelectCommand(具體就本例而言,傳遞的是SELECT [ProductID], [ProductName], [UnitPrice] FROM [Products])。SqlDataSource將返回的結果傳遞給GridView,後者根據從資料庫返回的每一條記錄生產一行(a row)

SqlDataSource控制項及資料Web控制項的內建屬性

  一般來說,資料Web控制項的分頁,排序,編輯,插入,刪除等屬性是由資料Web控制項自身指定的,跟它所使用的資料來源控制項沒有太大關係。也就是說,GridView可以自由的啟用它內建的分頁,排序,編輯和刪除功能,而不管它到底是綁定到SqlDataSource控制項還是ObjectDataSource控制項。然而,資料Web控制項的某些屬性卻要受其繫結資料原始檔控制及其設定的影響。

  比如, 就像我們在Efficiently Paging Through Large Amounts of Data 這章教程中探討的那樣,在啟用分頁功能後,在預設情況下,每次跳轉頁面時,資料Web控制項都會對所有的記錄重新檢索,儘管我們只需要顯示特定的那幾條記錄。這種模式在要檢索的資料量很大的情況下,效率會很低。不過ObjectDataSource控制項可以通過自訂分頁的方法僅僅返回那些需要在當前頁面上顯示的記錄,很遺憾的是SqlDataSource控制項不支援自訂分頁功能。

  在預設情況下,SqlDataSource控制項返回的資料可以通過GridView控制項來進行分頁和排序。來做個示範,在Querying.aspx 頁面中,在GridView控制項的智能標籤裡啟用分頁和排序功能,看它是否象我們期望的那樣工作。

  分頁和排序的原理在於SqlDataSource控制項將檢索的資料庫資料轉換成“泛型資料集”(loosely-typed DataSet)。那些被用來分頁的每條記錄就蘊含

  在資料集裡面,此外,資料集支援對返回的結果進行排序。當GridView請求對資料分頁或排序時,SqlDataSource控制項自動完成上述工作。

  在預設情況下,SqlDataSource返回的是資料集(DataSet),你也可以使它返回一個DataReader ,方法是把它的DataSourceMode屬性設定為“DataReader”。當希望把DataReader的檢索結果轉換為現成的代碼(existing code )時,設定為DataReader往往是首選。另外DataReader比起DataSet來簡單的多,功能更強大。不過將DataSourceMode屬性設定為“DataReader”後,資料Web控制項便不能啟用分頁或排序功能,因為SqlDataSource無法得知總共返回了多少條記錄,並且DataReader也不支援對返回的資料排序。

第四步:使用自訂的SQL查詢或預存程序

  前面講到,SqlDataSource控制項從資料庫檢索資料的方法有2種。在第二步我們探討了從表Products返回資料的方法,現在我們探討用自訂SQL查詢的情況。

  在Querying.aspx添加一個新的GridView控制項,在其智能標籤的下拉式清單中選擇“建立資料來源”,在“選擇資料來源類型”介面中選“database”,將資料來源ID設定為“ProductsWithCategoryInfoDataSource”。


圖12:建立一個新的SqlDataSource控制項,並命名為ProductsWithCategoryInfoDataSource

  下一步,接著會詢問使用哪個資料連線,就想我們在圖7做的那樣,在下拉式清單中選擇NORTHWINDConnectionString,點下一步,在配置SQL語句介面中,選擇“指定自訂SQL語句或預存程序”,點下一步,進入“定義自訂語句或預存程序”介面,包含“選擇”,“更新”,“刪除”,“插入”四個選項卡,在每個選項卡中,你可以在文字框中輸入自訂SQL語句,或者在下拉式清單中選擇預存程序。本章我們討論輸入自訂SQL語句,在下面的教程中再探討使用預存程序的情況。


圖13:輸入自訂SQL語句或選擇某個預存程序

  可以手工輸入自訂SQL語句,也可以藉助於查詢產生器來輔助產生。不管用哪種,都應使用如下查詢:

SELECT Products.ProductID, Products.ProductName, Categories.CategoryNameFROM Categories INNER JOIN Products ON  Categories.CategoryID = Products.CategoryID


圖14:使用查詢產生器映像化的構造查詢

  點下一步進入“測試查詢”介面,點“完成”結束設定。完成設定後,GridView的代碼應該看起來象下面這樣:

<asp:GridView ID="GridView2" runat="server" AutoGenerateColumns="False" DataKeyNames="ProductID" DataSourceID="ProductsWithCategoryInfoDataSource" EnableViewState="False"> <Columns>  <asp:BoundField DataField="ProductID" HeaderText="ProductID"   InsertVisible="False" ReadOnly="True" SortExpression="ProductID" />  <asp:BoundField DataField="ProductName" HeaderText="ProductName"   SortExpression="ProductName" />  <asp:BoundField DataField="CategoryName" HeaderText="CategoryName"   SortExpression="CategoryName" /> </Columns></asp:GridView><asp:SqlDataSource ID="ProductsWithCategoryInfoDataSource" runat="server" ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>" SelectCommand="  SELECT Products.ProductID, Products.ProductName, Categories.CategoryName  FROM Categories  INNER JOIN Products ON Categories.CategoryID = Products.CategoryID"></asp:SqlDataSource>



圖15:GridView顯示了每個產品的ID, Name和Category Name

總結:

  在本章我們探討了怎樣用SqlDataSource控制項查詢和顯示資料。和ObjectDataSource控制項一樣,它們都是作為一種訪問資料庫的代理。我們可以在屬性視窗中或通過設定它的資料來源嚮導,來指定它要串連的資料庫以及要執行的SQL選取查詢(SQL SELECT query)

  本文所探討的SQL選取查詢執行個體從指定的查詢返回所以的記錄,實際上SqlDataSource控制項還可以包含一個帶參數的WHERE字句。我們將在下一章探討帶參數的查詢。

  祝編程快樂!

作者簡介

  本系列教程作者 Scott Mitchell,著有六本ASP/ASP.NET方面的書,是4GuysFromRolla.com的創始人,自1998年以來一直應用 微軟Web技術。大家可以點擊查看全部教程《[翻譯]Scott Mitchell 的ASP.NET 2.0資料教程》,希望對大家的學習ASP.NET有所協助。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.