Scott Mitchell 的 ASP.NET 2.0 數(shù)據(jù)教程之四十七 使用 SqlDataSource 控件檢索數(shù)據(jù)
使用 SqlDataSource 控件檢索數(shù)據(jù)
在前面的教程里,我們用 ObjectDataSource 控件充分的將表現(xiàn)層和數(shù)據(jù)訪問層( DAL )分開來。在這篇教程里我們看看怎樣在一個表現(xiàn)層和數(shù)據(jù)訪問層區(qū)分的不是很嚴格的簡單程序中使用 SqlDataSource 控件。
導言:
到目前為止,我們探討的教程是由表現(xiàn)層,業(yè)務(wù)邏輯層和數(shù)據(jù)訪問層構(gòu)成的層次體系結(jié)構(gòu)。數(shù)據(jù)訪問層和業(yè)務(wù)邏輯層分別在教程第一和第二章提到。在 Displaying Data With the ObjectDataSource 這篇教程里,我們探討了怎樣用 ASP.NET 2.0 的新控件 --ObjectDataSource 控件在表現(xiàn)層展示數(shù)據(jù) 。
本教程到目前為止用這種層次結(jié)構(gòu)來處理數(shù)據(jù)。然而繞過這種體系結(jié)構(gòu),通過直接把數(shù)據(jù)查詢和業(yè)務(wù)邏輯放在 Web 頁面上,也可以達到直接在 ASP.NET 頁面上訪問,插入,更新,刪除數(shù)據(jù)庫數(shù)據(jù)的目的。對十分龐大或者復雜的應(yīng)用程序而言,使用層次結(jié)構(gòu)對程序的成功和可維護性是很重要的。然而對很簡單的程序來說,沒有必要使用層次體系結(jié)構(gòu)。
ASP.NET 2.0 提供了 5 個內(nèi)建的數(shù)據(jù)源控件, SqlDataSource 控件 , AccessDataSource 控件 , ObjectDataSource 控件 , XmlDataSource 控件 , 和 SiteMapDataSource 控件。 SqlDataSource 控件能直接從關(guān)系型數(shù)據(jù)庫中訪問和更新數(shù)據(jù),包括 Microsoft SQL Server , Microsoft Access, Oracle, MySQL 等數(shù)據(jù)庫。在本章以及接下來的 3 章教程里面,我們將探討如何用 SqlDataSource 控件來查詢和篩選數(shù)據(jù)庫數(shù)據(jù),包括插入,更新和刪除。
圖1:ASP.NET 2.0 的5個內(nèi)建的數(shù)據(jù)源控件
比較ObjectDataSource控件和 SqlDataSource控件
從理論上說, ObjectDataSource 控件和 SqlDataSource 控件都是作為訪問數(shù)據(jù)的一種代理。就象在教程 Displaying Data With the ObjectDataSource 中討論的那樣,可以在 ObjectDataSource 控件中設(shè)置展示數(shù)據(jù)的數(shù)據(jù)類型,以及用來選擇,插入,更新和刪除數(shù)據(jù)所調(diào)用的方法。一旦完成了 ObjectDataSource 控件的設(shè)置, GridView, DetailsView, DataList 等數(shù)據(jù) Web 控件便可以通過綁定 ObjectDataSource 控件調(diào)用其 Select(), Insert(), Delete(), 和 Update() methods 方法。
雖然 SqlDataSource 控件具有和 SqlDataSource 控件同樣的功能,但使用 SqlDataSource 控件時,我們必須提供詳細的數(shù)據(jù)庫連接字符串,以及用來執(zhí)行選擇,更新,插入,刪除數(shù)據(jù)的 ad-hoc SQL 查詢
或存儲過程。當調(diào)用 SqlDataSource 控件的 Select(), Insert(), Update(), and Delete() 方法時, SqlDataSource 控件連接到數(shù)據(jù)庫,并傳遞適當?shù)? SQL 查詢。下圖展示了這些方法如何連接數(shù)據(jù)庫,傳遞查詢和返回結(jié)果。
圖 2 SqlDataSource 控件充當訪問數(shù)據(jù)庫的代理
注意:在本章教程中我們主要關(guān)注如何從數(shù)據(jù)庫獲得數(shù)據(jù),在后面的
Inserting, Updating, and Deleteing Data with the SqlDataSource
Control 教程中 , 我們將討論如何通過設(shè)置 SqlDataSource 控件以支持插入,更新和刪除數(shù)據(jù)。
SqlDataSource 控件和 AccessDataSource 控件
除了 SqlDataSource 控件外, ASP.NET 2.0 還包 AccessDataSource 控件。這兩種不同的控件使很多開發(fā)者誤以為 AccessDataSource 控件主要是被設(shè)計來與 Microsoft Access 數(shù)據(jù)庫打交道, SqlDataSource 控件主要是被設(shè)計來來與 Microsoft SQL Server 打交道。實際情況是, SqlDataSource 控件可以與幾乎所有 .NET 能訪問的關(guān)系型數(shù)據(jù)庫打交道。包括任何 OleDb , ODBC , compliant data stores, 比如: Microsoft SQL Server, Microsoft Access, Oracle, Informix, MySQL, and PostgreSQL 等。
SqlDataSource 控件和 AccessDataSource 控件的唯一區(qū)別在于 AccessDataSource 控件的數(shù)據(jù)庫連接信息只需要提供 Access 數(shù)據(jù)庫文件的訪問路徑。而 SqlDataSource 控件則需要提供完整的連接字符串。
第一步:創(chuàng)建 SqlDataSource 頁面
在我們探討用 SqlDataSource 控件直接操作數(shù)據(jù)庫數(shù)據(jù)之前,讓我們先花些時 間在我們的站點項目里添加這些本節(jié)里和下三節(jié)里需要的 ASP.NET 頁面。首先添加一個名為 SqlDataSource 的文件夾,在里面添加下列頁面,并配置為使用 Site.master 母板頁。
Default.aspx
Querying.aspx
ParameterizedQueries.aspx
InsertUpdateDelete.aspx
OptimisticConcurrency.aspx
圖 3 :為 SqlDataSource 相關(guān)教程添加頁面
類似在其它文件夾里, EditInsertDelete文件夾里的Default.aspx將列出這些教程章節(jié)。記得用戶控件提供這個功能。因此,從解決方案資源管理器中拖拽一個這個用戶控件到頁面的設(shè)計視圖,從而添加它到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."/>
<siteMapNodeurl="~/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:更新站點地圖使之包含新的頁面
第二步:添加并設(shè)置 SqlDataSource控件
在 SqlDataSource文件夾中打開Querying.aspx頁面,切換到設(shè)計試圖。從工具箱中拖一個SqlDataSource控件到 設(shè)計器中,設(shè)置其 ID 為 ProductsDataSource。和ObjectDataSource一樣,SqlDataSource不產(chǎn)生任何的聲明標記,所以現(xiàn)在在頁面上看起來就象一個灰色的方塊。點擊SqlDataSource控件的智能標簽,點“Configure Data Source”鏈接,進入數(shù)據(jù)源配置向?qū)А?
圖 6:在智能標簽里點擊“設(shè)置數(shù)據(jù)源”鏈接。
ObjectDataSource控件和 SqlDataSource控件的配置向?qū)в行┰S不同,但最終目的都是相同的:詳細的說明了如何從數(shù)據(jù)庫獲取,插入,更新和刪除數(shù)據(jù)。ObjectDataSource控件明確指定了要訪問的數(shù)據(jù)庫,并提供了要使用的SQL查詢聲明或存儲過程的詳細情況
向?qū)У牡谝徊绞沁x擇要訪問的數(shù)據(jù)庫,在下拉列表中包含了放在 App_Data 文件夾中的數(shù)據(jù)庫,以及添加到服務(wù)器資源管理器的數(shù)據(jù)連接節(jié)點中的數(shù)據(jù)庫。一旦我們將一個連接到App_Data文件夾中的NORTHWIND.MDF數(shù)據(jù)庫的連接字符串添加到項目的Web.config 文件中,這個連接字符串就會出現(xiàn)在下拉列表的選項。如下圖,選 中它,點“下一步”。
圖 7:從下拉列表里選擇NORTHWINDConnectionString
選擇數(shù)據(jù)庫后,向?qū)мD(zhuǎn)入“如何從數(shù)據(jù)庫檢索數(shù)據(jù)”界面。有 2種方式:第一種指定自定義SQL語句或存儲過程,第二種是指定來自表或視圖的列。
注意:我們先探討使用“指定來自表或視圖的列”選項的實例,稍后再探討用“自定義 SQL語句或存儲過程”選項的實例。
圖 8是我們點擊“指定來自表或視圖的列”單選按鈕時的畫面,這里我們選擇Products表,返回ProductID, ProductName和UnitPrice 列。完成選擇后,在底部的方框內(nèi)將顯示SQL語句: SELECT [ProductID], [ProductName], [UnitPrice] FROM [Products]
圖 8:從表Products返回數(shù)據(jù)。
完成上述設(shè)置后,點“下一步”按鈕,進入測試查詢界面,在這里可以測試上一步所設(shè)置的查詢的結(jié)果。點擊“測試查詢”按鈕,執(zhí)行查詢。
圖 9:點擊“測試”,從SELECT 查詢檢索數(shù)據(jù)。
最后,點“完成”按鈕完成向?qū)А?
和 ObjectDataSource一樣,SqlDataSource的向?qū)гO(shè)置只是完成了對SqlDataSource控件屬性的賦值而已,即ConnectionString 屬性和SelectCommand 屬性。完成設(shè)置之后,我們的SqlDataSource控件代碼應(yīng)該和下面的差不多:
<asp:SqlDataSource ID="ProductsDataSource" runat="server"
ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>"
SelectCommand="SELECT [ProductID], [ProductName], [UnitPrice] FROM [Products]">
</asp:SqlDataSource>
其中 ConnectionString屬性提供了怎樣連接數(shù)據(jù)庫的詳細信息,可以用完整的,硬編碼的連接字符串對其賦值,也可以用Web.config文件中的連接字符串來賦值。當用Web.config文件中的字符串時,語法為:<%$ expressionPrefix:expressionValue %>,特別地expressionPrefix就是“ConnectionStrings”,而expressionValue 則是Web.config文件<connectionStrings>部分中,連接字符串的名字。關(guān)于此語法的更多信息請參考: ASP.NET Expressions Overview
而 SelectCommand屬性是SQL查詢語句或存儲過程的詳細陳述。
第三步:添加數(shù)據(jù) Web控件并綁定到SqlDataSource
一旦設(shè)置好 SqlDataSource后,就可以用GridView 或DetailsView等數(shù)據(jù)Web控件綁定它。在本篇教程中我們使用GridView,從工具箱拖一個GridView控件到頁面上,在智能標簽中的“選擇數(shù)據(jù)源”里選ProductsDataSource ,這樣就將GridView控件綁定到我們前面設(shè)置的SqlDataSource控件了。
圖 10:添加GridView控件并綁定到SqlDataSource
完成綁定后, Visual Studio 會自動為GridView從數(shù)據(jù)源控件返回的每一列添加一個BoundField 或CheckBoxField 。就本文來說既然SqlDataSource從數(shù)據(jù)庫返回三列:ProductID, ProductName, 和 UnitPrice ,那么Visual Studio就在自動在GridView中生成三列(three fields )。
花幾分鐘來設(shè)置 GridView的三個BoundFields:把ProductName field的HeaderText 屬性設(shè)置為“Product Name”,UnitPrice field設(shè)置為“Price”,同時格式化為貨幣形式。修改后,你的GridView代碼看起來應(yīng)該象下面這樣:
<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列出了每個產(chǎn)品的ProductID, ProductName, 和UnitPrice。
圖 11:GridView里列出了每個產(chǎn)品的ProductID, ProductName, 和UnitPrice。
測試該頁面時, GridView調(diào)用其數(shù)據(jù)源控件的Select()方法。如果我們使用ObjectDataSource控件來測試該頁面的話,它將會調(diào)用邏輯層ProductsBLL class的GetProducts() 方法。而用SqlDataSource控件的話,其Select()方法將直接鏈接到要訪問的數(shù)據(jù)庫,并傳遞SelectCommand(具體就本例而言,傳遞的是SELECT [ProductID], [ProductName], [UnitPrice] FROM [Products])。SqlDataSource將返回的結(jié)果傳遞給GridView,后者根據(jù)從數(shù)據(jù)庫返回的每一條記錄生產(chǎn)一行(a row)
SqlDataSource控件及數(shù)據(jù)Web控件的內(nèi)置屬性
一般來說,數(shù)據(jù) Web控件的分頁,排序,編輯,插入,刪除等屬性是由數(shù)據(jù)Web控件自身指定的,跟它所使用的數(shù)據(jù)源控件沒有太大關(guān)系。也就是說, GridView可以自由的啟用它內(nèi)建的分頁,排序,編輯和刪除功能,而不管它到底是綁定到SqlDataSource控件還是ObjectDataSource控件。然而,數(shù)據(jù)Web控件的某些屬性卻要受其綁定的數(shù)據(jù)源控件及其設(shè)置的影響。
比如, 就像我們在 Efficiently Paging Through Large Amounts of Data 這章教程中探討的那樣,在啟用分頁功能后,在默認情況下,每次跳轉(zhuǎn)頁面時,數(shù)據(jù)Web控件都會對所有的記錄重新檢索,盡管我們只需要顯示特定的那幾條記錄。這種模式在要檢索的數(shù)據(jù)量很大的情況下,效率會很低。不過ObjectDataSource控件可以通過自定義分頁的方法僅僅返回那些需要在當前頁面上顯示的記錄,很遺憾的是SqlDataSource控件不支持自定義分頁功能。
在默認情況下, SqlDataSource控件返回的數(shù)據(jù)可以通過GridView控件來進行分頁和排序。來做個示范,在Querying.aspx 頁面中,在GridView控件的智能標簽里啟用分頁和排序功能,看它是否象我們期望的那樣工作。
分頁和排序的原理在于SqlDataSource控件將檢索的數(shù)據(jù)庫數(shù)據(jù)轉(zhuǎn)換成“泛型數(shù)據(jù)集”(loosely-typed DataSet)。那些被用來分頁的每條記錄就蘊含
在數(shù)據(jù)集里面,此外,數(shù)據(jù)集支持對返回的結(jié)果進行排序。當 GridView請求對數(shù)據(jù)分頁或排序時,SqlDataSource控件自動完成上述工作。
在默認情況下, SqlDataSource返回的是數(shù)據(jù)集(DataSet),你也可以使它返回一個DataReader ,方法是把它的DataSourceMode屬性設(shè)置為 “ DataReader”。當希望把DataReader的檢索結(jié)果轉(zhuǎn)換為現(xiàn)成的代碼 ( existing code )時,設(shè)置為DataReader往往是首選。另外DataReader比起 DataSet來簡單的多,功能更強大。不過將DataSourceMode屬性設(shè)置為 “ DataReader”后,數(shù)據(jù)Web控件便不能啟用分頁或排序功能,因為 SqlDataSource無法得知總共返回了多少條記錄,并且DataReader也不支持對返回的數(shù)據(jù)排序。
第四步:使用自定義的 SQL查詢或存儲過程
前面講到, SqlDataSource控件從數(shù)據(jù)庫檢索數(shù)據(jù)的方法有2種。在第二步我們探討了從表Products返回數(shù)據(jù)的方法,現(xiàn)在我們探討用自定義SQL查詢的情況。
在 Querying.aspx添加一個新的GridView控件,在其智能標簽的下拉列表中
選擇“新建數(shù)據(jù)源”,在“選擇數(shù)據(jù)源類型”界面中選“ database”,將數(shù)據(jù)
源 ID設(shè)置為“ProductsWithCategoryInfoDataSource”。
圖 12:創(chuàng)建一個新的SqlDataSource控件,并命名為ProductsWithCategoryInfoDataSource
下一步,接著會詢問使用哪個數(shù)據(jù)連接,就想我們在圖 7做的那樣,在下拉列表中選擇NORTHWINDConnectionString,點下一步,在配置SQL語句界面中,選擇“指定自定義SQL語句或存儲過程”,點下一步,進入“定義自定義語句或存儲過程”界面,包含“選擇”,“更新”,“刪除”,“插入”四個選項卡,在每個選項卡中,你可以在文本框中輸入自定義SQL語句,或者在下拉列表中選擇存儲過程。本章我們討論輸入自定義SQL語句,在下面的教程中再探討使用存儲過程的情況。
圖 13:輸入自定義SQL語句或選擇某個存儲過程
可以手工輸入自定義 SQL 語句,也可以借助于查詢生成器來輔助生成。不管
用哪種,都應(yīng)使用如下查詢:
SELECT Products.ProductID, Products.ProductName, Categories.CategoryName
FROM Categories
INNER JOIN Products ON
Categories.CategoryID = Products.CategoryID
圖 14:使用查詢生成器圖像化的構(gòu)造查詢
點下一步進入“測試查詢”界面,點“完成”結(jié)束設(shè)置。
完成設(shè)置后, GridView的代碼應(yīng)該看起來象下面這樣:
<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>
http:
- 2007-03-17 12:39
- 瀏覽 216
- 評論(0)
- 相關(guān)推薦
發(fā)表評論
Scott Mitchell 的ASP.NET 2.0數(shù)據(jù)教程之四十七使用SqlDataSource控件檢索數(shù)據(jù)
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

評論