共用方式為


使用 SqlDataSource 控制項查詢資料 (C#)

由斯科特· 米切爾

下載 PDF

在上述教學課程中,我們使用 ObjectDataSource 控件來完全分隔表示層與數據存取層。 從本教學課程開始,我們將瞭解如何將 SqlDataSource 控件用於不需要如此嚴格區分簡報和數據存取的簡單應用程式。

簡介

到目前為止,我們檢查的所有教學課程都使用由簡報、商業規則和數據存取層組成的階層式架構。 數據存取層 (DAL) 是在第一個教學課程中製作的(建立數據存取層)和第二個商業規則層(建立商業規則層)。 從 使用 ObjectDataSource 顯示數據教學課程開始,我們已瞭解如何使用 ASP.NET 2.0 s 新的 ObjectDataSource 控件,以宣告方式與呈現層架構的介面。

雖然到目前為止的所有教學課程都已使用架構來處理數據,但也可以直接從 ASP.NET 頁面存取、插入、更新和刪除資料庫數據,而略過架構。 這樣做會將特定的資料庫查詢和商業規則直接放在網頁中。 對於足夠大型或複雜的應用程式,設計、實作和使用階層式架構對於應用程式的成功、可更新性和可維護性至關重要。 不過,在建立極其簡單、一次性的應用程式時,開發強固的架構可能不必要。

ASP.NET 2.0 提供五個內建數據源控件 SqlDataSource、AccessDataSourceObjectDataSourceXmlDataSourceSiteMapDataSource。 SqlDataSource 可用來直接從關係數據庫存取和修改數據,包括Microsoft SQL Server、Microsoft Access、Oracle、MySQL 等。 在本教學課程和接下來的三個教學課程中,我們將檢查如何使用 SqlDataSource 控件、探索如何查詢和篩選資料庫數據,以及如何使用 SqlDataSource 來插入、更新和刪除數據。

ASP.NET 2.0 包含五個內建數據源控件

圖 1:ASP.NET 2.0 包含五個內建數據源控件

比較 ObjectDataSource 和 SqlDataSource

就概念上來說,ObjectDataSource 和 SqlDataSource 控件都是數據的 Proxy。 如使用 ObjectDataSource 顯示數據教學課程中所述 ,ObjectDataSource 具有屬性,指出提供數據的物件類型,以及用來叫用的方法,以從基礎對象類型選取、插入、更新和刪除數據。 設定 ObjectDataSource 屬性之後,可以使用 ObjectDataSource s Select()Insert()Delete()Update() 方法來與基礎架構互動,系結 GridView、DetailsView 或 DataList 等數據 Web 控件。

SqlDataSource 提供相同的功能,但會針對關係資料庫而非物件庫運作。 使用 SqlDataSource 時,我們必須指定要執行的資料庫 連接字串 和臨機操作 SQL 查詢或預存程式,以插入、更新、刪除和擷取數據。 叫用 SqlDataSource s Select()Insert()Update()Delete() 方法時,會連線到指定的資料庫,併發出適當的 SQL 查詢。 如下圖所示,這些方法會執行連線到資料庫、發出查詢及傳回結果的不和諧工作。

SqlDataSource 做為資料庫的 Proxy

圖 2:SqlDataSource 可作為資料庫的 Proxy

注意

在本教學課程中,我們將著重於從資料庫擷取數據。 在使用 SqlDataSource 控制件插入、更新和刪除資料教學課程中,我們將瞭解如何設定 SqlDataSource 以支援插入、更新和刪除。

SqlDataSource 和 AccessDataSource 控件

除了 SqlDataSource 控制件之外,ASP.NET 2.0 也包含 AccessDataSource 控制件。 這兩個不同的控件可讓許多開發人員 ASP.NET 2.0,懷疑 AccessDataSource 控件的設計目的是與 Microsoft Access 獨佔搭配 sqlDataSource 控件搭配設計來與 Microsoft SQL Server 搭配運作。 雖然 AccessDataSource 的設計目的是要與 Microsoft Access 搭配運作,但 SqlDataSource 控件可與任何可透過 .NET 存取的關係資料庫搭配使用。 這包括任何符合 OleDb 或 ODBC 規範的數據存放區,例如Microsoft SQL Server、Microsoft Access、Oracle、Informix、MySQL 和 PostgreSQL 等等。

AccessDataSource 和 SqlDataSource 控制件的唯一差異在於指定資料庫連接資訊的方式。 AccessDataSource 控制件只需要 Access 資料庫檔案的檔案路徑。 另一方面,SqlDataSource 需要完整的 連接字串。

步驟 1:建立 SqlDataSource 網頁

在開始探索如何使用 SqlDataSource 控制項直接使用資料庫數據之前,讓我們先花點時間在網站專案中建立我們在本教學課程和接下來三個專案中建立 ASP.NET 頁面。 首先,新增名為 SqlDataSource的新資料夾。 接下來,將下列 ASP.NET 頁面新增至該資料夾,請務必讓每個頁面與 Site.master 主版頁面產生關聯:

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

為 SqlDataSource 相關教學課程新增 ASP.NET 頁

圖 3:新增 SqlDataSource 相關教學課程的 ASP.NET 頁面

就像在其他資料夾中一樣, Default.aspx 資料夾中 SqlDataSource 會列出其區段中的教學課程。 回想一下, SectionLevelTutorialListing.ascx 使用者控件會提供這項功能。 因此,請將此使用者控制件從 方案總管 拖曳至頁面的設計檢視,將其新增至 Default.aspx

將 SectionLevelTutorialListing.ascx 使用者控件新增至 Default.aspx

圖 4:將使用者控制項新增 SectionLevelTutorialListing.ascxDefault.aspx按兩下以檢視完整大小的影像

最後,將這四個頁面新增為檔案的專案 Web.sitemap 。 具體來說,在將自定義按鈕新增至 DataList 和 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>

更新 Web.sitemap之後,請花點時間透過瀏覽器檢視教學課程網站。 左側功能表現在包含編輯、插入和刪除教學課程的專案。

網站地圖現在包含 SqlDataSource 教學課程的專案

圖 5:網站地圖現在包含 SqlDataSource 教學課程的專案

步驟 2:新增和設定 SqlDataSource 控件

從開啟 Querying.aspx 資料夾中的頁面 SqlDataSource 開始,然後切換至 [設計] 檢視。 將 SqlDataSource 控制件從 [工具箱] 拖曳至設計工具,並將其設定 IDProductsDataSource。 如同 ObjectDataSource,SqlDataSource 不會產生任何轉譯的輸出,因此會在設計介面上顯示為灰色方塊。 若要設定 SqlDataSource,請按下 SqlDataSource 智慧標記中的 [設定數據源] 連結。

按兩下 SqlDataSource 的 [設定資料源連結] 智慧標記

圖 6:按兩下 SqlDataSource 智慧標記中的 [設定資料源連結]

這會顯示 SqlDataSource 控制件的 [設定數據源精靈]。 雖然精靈的步驟與 ObjectDataSource 控件不同,但最終目標是相同的,以提供如何透過數據源擷取、插入、更新和刪除數據的詳細數據。 針對 SqlDataSource,這需要指定要使用的基礎資料庫,並提供臨機操作 SQL 語句或預存程式。

第一個精靈步驟會提示我們輸入資料庫。 下拉式清單包含 Web 應用程式 App_Data 資料夾中找到的資料庫,以及已新增至 [伺服器總管] 中 [資料連線] 節點的資料庫。 由於我們已將資料夾中資料庫的 App_Data 連接字串 NORTHWIND.MDF 新增至項目Web.config檔,下拉式清單會包含該 連接字串 的參考。 NORTHWINDConnectionString 從下拉式清單中選擇此項目,然後按 [下一步]。

從下拉式清單中選擇 NORTHWINDConnectionString

圖 7NORTHWINDConnectionString 從下拉式清單中選擇

選擇資料庫之後,精靈會要求查詢傳回數據。 我們可以指定要傳回之數據表或檢視的數據行,也可以輸入自定義 SQL 語句或指定預存程式。 您可以透過指定自定義 SQL 語句或預存程式,以及從資料表或檢視單選按鈕指定資料行,來切換這個選項。

注意

在此第一個範例中,讓我們使用 [從數據表或檢視表指定數據行] 選項。 我們稍後會在本教學課程中返回精靈,並探索指定自定義 SQL 語句或預存程式選項。

圖 8 顯示選取 [從數據表或檢視表指定數據行] 單選按鈕時,設定 [選取語句] 畫面。 下拉式清單包含 Northwind 資料庫中的數據表和檢視集,其中選取的數據表或檢視數據行會顯示在下方複選框清單中。 在此範例中,讓我們從數據表傳 ProductID回 、 ProductNameUnitPrice 數據 Products 行。 如圖 8 所示,在進行這些選取之後,精靈會顯示產生的 SQL 語句 SELECT [ProductID], [ProductName], [UnitPrice] FROM [Products]

從 Products 數據表傳回數據

圖 8:從數據表傳 Products 回數據

設定精靈以從Products數據表傳回ProductIDProductNameUnitPrice 數據行之後,請按兩下一步[ 下一步] 按鈕。 此最終畫面提供機會來檢查上一個步驟所設定的查詢結果。 按兩下 [測試查詢] 按鈕會執行已設定 SELECT 的語句,並在方格中顯示結果。

按兩下 [測試查詢] 按鈕以檢閱您的 SELECT 查詢

圖 9:按兩下 [測試查詢] 按鈕以檢閱您的 SELECT 查詢

若要完成精靈,請按一下 [完成] 。

如同 ObjectDataSource,SqlDataSource 精靈只會將值指派給控件的屬性,也就是 ConnectionStringSelectCommand 屬性。 完成精靈之後,您的 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 是 區段中的連接字串<connectionStrings>Web.config名稱。 不過,語法可用來從資源文件參考 <appSettings> 專案或內容。 如需此語法的詳細資訊,請參閱 ASP.NET 表達式概觀

屬性 SelectCommand 會指定要執行以傳回數據的臨機操作 SQL 語句或預存程式。

步驟 3:新增數據 Web 控制件並將它系結至 SqlDataSource

設定 SqlDataSource 之後,就可以繫結至數據 Web 控件,例如 GridView 或 DetailsView。 在本教學課程中,讓我們在 GridView 中顯示數據。 從 [工具箱] 將 GridView 拖曳到頁面,然後從 GridView 智慧標記的下拉式清單中選擇數據源,將其系結至 ProductsDataSource SqlDataSource。

新增 GridView 並將它系結至 SqlDataSource 控件

圖 10:新增 GridView 並將其系結至 SqlDataSource 控件(按兩下以檢視完整大小的影像

一旦您從 GridView 智慧標記的下拉式清單中選取 SqlDataSource 控件,Visual Studio 就會針對數據源控件所傳回的每個數據行自動將 BoundField 或 CheckBoxField 新增至 GridView。 由於 SqlDataSource 會傳回三個資料庫資料行 ProductIDProductName而且 UnitPrice GridView 中有三個字段。

花點時間設定 GridView s 三個 BoundFields。 將 ProductName 欄位的 HeaderText 屬性變更為 [產品名稱], UnitPrice 並將欄位 s 變更為 Price。 同時將 UnitPrice 欄位格式化為貨幣。 進行這些修改之後,您的 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 會列出每個產品的 ProductIDProductNameUnitPrice 值。

GridView 會顯示每個產品的 ProductID、ProductName 和 UnitPrice 值

圖 11:GridView 顯示每個產品的 ProductIDProductNameUnitPrice 值 (按下即可檢視完整大小的影像

瀏覽頁面時,GridView 會叫用其數據源控件的方法 Select() 。 當我們使用 ObjectDataSource 控制件時,這會呼叫 ProductsBLL 類別 s GetProducts() 方法。 不過,使用 SqlDataSource 時 Select() ,方法會建立與指定資料庫的連線,併發出 SelectCommandSELECT [ProductID], [ProductName], [UnitPrice] FROM [Products]在此範例中為 )。 SqlDataSource 會傳回其結果,GridView 接著會列舉其結果,並在 GridView 中為每個傳回的資料庫記錄建立數據列。

內建數據 Web 控制項功能和 SqlDataSource 控制件

一般而言,數據 Web 控件分頁、排序、編輯、刪除、插入等固有的功能專屬於數據 Web 控制件,並不相依於所使用的數據源控件。 也就是說,GridView 可以利用其內建分頁、排序、編輯和刪除它是否系結至 ObjectDataSource 或 SqlDataSource。 不過,某些數據 Web 控制件功能對所使用的數據源控件或數據源控件的元件很敏感。

例如,在 「有效率地分頁到大量數據」教學課程中,我們討論數據 Web 控件的分頁邏輯預設會從基礎數據源傳回所有記錄,然後只顯示適當的記錄子集,給定目前頁面索引和每頁顯示記錄數目。 當分頁到足夠大型的結果集時,此模型非常沒有效率。 幸運的是,ObjectDataSource 可以設定為支援自定義分頁,只傳回要顯示的記錄精確子集。 不過,SqlDataSource 控件缺少實作自定義分頁的屬性。

另一個分頁和排序的微妙之處是 SqlDataSource。 根據預設,從 SqlDataSource 傳回的數據可以分頁或排序至 GridView。 若要示範這一點,請檢查 中 GridView 智慧標記 Querying.aspx 中的 [啟用分頁] 和 [啟用排序] 選項,並確認這如預期般運作。

排序和分頁可運作,因為 SqlDataSource 會將資料庫數據擷取到鬆散類型的 DataSet。 您可以從 DataSet 確定實作分頁的基本層面,查詢所傳回的記錄總數。 此外,DataSet 的結果也可以透過 DataView 排序。 當 GridView 要求分頁或排序數據時,SqlDataSource 會自動使用這些功能。

您可以將 SqlDataSource 設定為將 DataReader 取代 DataSet,方法是將其 DataSourceMode 屬性DataSet (預設值) 變更為 DataReader。 在將 SqlDataSource 結果傳遞至預期 DataReader 的現有程式代碼時,使用 DataReader 可能會偏好使用 DataReader。 此外,由於 DataReaders 比 DataSet 更簡單,因此可提供更佳的效能。 不過,如果您進行這項變更,數據 Web 控制項就無法排序或分頁,因為 SqlDataSource 無法確定查詢傳回的記錄數,DataReader 也不會提供排序傳回數據的任何技術。

步驟 4:使用自訂 SQL 語句或預存程式

設定 SqlDataSource 控制項時,可以使用兩種方法之一指定用來傳回數據的查詢做為自定義 SQL 語句或預存程式,或做為現有數據表或檢視表中的數據行。 在步驟 2 中,我們已檢查從 Products 數據表中選取數據行。 讓我們看看如何使用自定義 SQL 語句。

將另一個 GridView 控件新增至 Querying.aspx 頁面,然後選擇從智慧標記的下拉式清單中建立新的數據源。 接下來,表示數據將會從資料庫提取,這會建立新的 SqlDataSource 控件。 將控制項 ProductsWithCategoryInfoDataSource命名為 。

建立名為 Products 的新 SqlDataSource 控件WithCategoryInfoDataSource

圖 12:建立名為 的新 SqlDataSource 控件 ProductsWithCategoryInfoDataSource

下一個畫面會要求我們指定資料庫。 如同我們在圖 7 中所做的,請從下拉式清單中選取 NORTHWINDConnectionString ,然後按 [下一步]。 在 [設定 Select 語句] 畫面中,選擇 [指定自定義 SQL 語句或預存程式] 單選按鈕,然後按 [下一步]。 這會顯示 [定義自定義語句或預存程式] 畫面,其提供標示為 SELECT、UPDATE、INSERT 和 DELETE 的索引標籤。 在每個索引標籤中,您可以在文字框中輸入自訂 SQL 語句,或從下拉式清單中選擇預存程式。 在本教學課程中,我們將探討輸入自定義 SQL 語句;下一個教學課程包含使用預存程式的範例。

輸入自定義 SQL 語句或挑選預存程式

圖 13:輸入自訂 SQL 語句或挑選預存程式

自定義 SQL 語句可以手動輸入文字框中,也可以按兩下 [查詢產生器] 按鈕以圖形方式建構。 從 [查詢產生器] 或文字框中,使用下列查詢從 數據表傳回 和 欄位,使用 JOIN 從資料表擷取產品:Products ProductName ProductIDCategoriesCategoryName

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

您可以使用查詢產生器以圖形方式建構查詢

圖 14:您可以使用查詢產生器以圖形方式建構查詢

指定查詢之後,按 [下一步] 以繼續進行 [測試查詢] 畫面。 單擊 [完成] 以完成 SqlDataSource 精靈。

完成精靈之後,GridView 會新增三個 BoundField,以顯示 ProductID從查詢傳回的 、 ProductName和數據 CategoryName 行,併產生下列宣告式標記:

<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>

GridView 會顯示每個產品的標識碼、名稱和相關聯的類別名稱

圖 15:GridView 顯示每個產品的識別碼、名稱和相關聯的類別名稱(按兩下即可檢視完整大小的影像

摘要

在本教學課程中,我們已瞭解如何使用 SqlDataSource 控件來查詢和顯示數據。 如同 ObjectDataSource,SqlDataSource 可作為 Proxy,提供宣告式方法來存取數據。 其屬性會指定要連線的資料庫,以及要執行的 SQL SELECT 查詢;您可以透過 屬性視窗 或使用 [設定 DataSource 精靈] 來指定它們。

SELECT我們在本教學課程中檢查的查詢範例會從指定的查詢傳回所有記錄。 不過,SqlDataSource 控制項可以包含 WHERE 具有參數的 子句,其值會以程式設計方式指派或自動從指定的來源提取。 我們將在下一個教學課程中檢查如何建立和使用參數化查詢!

快樂的程序設計!

深入閱讀

如需本教學課程中所討論主題的詳細資訊,請參閱下列資源:

關於作者

斯科特·米切爾,七本 ASP/ASP.NET 書籍和 4GuysFromRolla.com 創始人的作者,自1998年以來一直與Microsoft Web 技術合作。 斯科特擔任獨立顧問、教練和作家。 他的最新書是 山姆斯在24小時內 ASP.NET 2.0。 他可以到達 mitchell@4GuysFromRolla.com, 或通過他的博客,可以在 找到 http://ScottOnWriting.NET

特別感謝

本教學課程系列已由許多實用的檢閱者檢閱。 本教學課程的主要檢閱者是 Susan Connery、Bernadette Leigh 和 David Suru。 有興趣檢閱我即將推出的 MSDN 文章嗎? 如果是,請將一行 mitchell@4GuysFromRolla.com放在 。