使用 ASP.NET 2.0 ObjectDataSource 控制項自MSDN)

來源:互聯網
上載者:User
發布日期: 12/3/2004 | 更新日期: 8/4/2005

Stephen Walther
Superexpert

適用於:
Microsoft ASP.NET 2.0
Microsoft Visual Studio 2005

摘要:ADO.NET 和 SqlDataSource 使得人們可以很容易地訪問 ASP.NET 2.0 中的兩層資料。但是,它們在 n 層應用程式中就不是那麼有效了,而 ObjectDataSource 卻能在 n 層應用程式中為業務對象提供相同的易用性。學習如何使用 ASP.NET 2.0 Framework 並利用 ObjectDataSource 控制項產生嚴格意義上的多層 Web 應用程式。

本頁內容
簡介
使用 ObjectDataSource 控制項顯示資料
結合使用參數與 ObjectDataSource 控制項
使用 ObjectDataSource 控制項編輯資料
結合使用 ObjectDataSource 控制項和 SqlDataSource 控制項
小結
簡介

在 Microsoft ASP.NET 2.0 Framework 中,資料庫訪問得到了極大的簡化。利用全新的 SqlDataSource 控制項,您無需編寫一行代碼就可以選擇、更新、插入和刪除資料庫資料。

產生簡單的應用程式時,SqlDataSource 控制項是一個很好的選擇。如果您需要迅速產生一個使使用者可以顯示和編輯資料庫記錄的 Web 頁,使用 SqlDataSource 控制項在幾分鐘之內就能完成此工作。

例如,我自己就曾計時產生了這麼一個頁面。通過結合使用 SqlDataSource 控制項與 GridView 控制項,我在 1 分 15秒 內就能產生一個用於顯示 Northwind Products 資料庫表的內容的頁面。就有這麼快!

但是,SqlDataSource 控制項存在一個問題。如果您使用 SqlDataSource 控制項,那您就是在做不太妙的事情。SqlDataSource 控制項的缺點在於它迫使您將使用者介面層與商務邏輯層混合在一起。任何應用程式架構師都會告訴您:混合多個層的行為是不可取的。

產生嚴格意義上的多層 Web 應用程式時,您應該具有清晰的使用者介面層、商務邏輯層和資料訪問層。僅僅由於 SqlDataSource 控制項的強制而在使用者介面層引用 SQL 陳述式或預存程序是完全錯誤的。

那麼為什麼您要關心這些東西呢?不錯,在很多情況下,您不必在意。如果您正在建立一個簡單的 Web 應用程式,完全可以使用 SqlDataSource 控制項。例如,如果您需要產生一個由單獨頁面組成的應用程式來顯示資料庫的表的內容,那麼將應用程式劃分為多個應用程式層就很不明智。

遺憾的是(如果您已經為此“交過學費”,則會感到幸運),並非所有的 Web 應用程式都很簡單。應用程式達到一定的複雜程度之後,如果將其劃分為多個應用程式層,則產生和維護它們就更輕鬆。

將應用程式劃分為多個應用程式層有很多優點。如果您有一個清晰的商務邏輯層,就能夠建立一個可以從多個頁面調用的方法庫。換句話說,建立一個清晰的商務邏輯層提升了代碼重用。此外,建立清晰而獨立的應用程式層使得應用程式更易於修改。例如,清晰的層次使您無需修改資料存取碼就可以修改使用者介面。

如果您需要使用 ASP.NET Framework 產生多層 Web 應用程式,那麼您可以使用 ASP.NET 2.0 Framework 所引入的另一個新控制項:ObjectDataSource 控制項ObjectDataSource 控制項使您可將諸如 GridViewDropDownList 這樣的使用者介面控制項綁定到一個中介層組件。

這篇文章的主題就是 ObjectDataSource 控制項。在這篇文章中,您將學習如何使用此控制項來顯示和編輯資料庫資料。我們還將討論如何結合使用 ObjectDataSource 控制項和 SqlDataSource 控制項以簡化資料庫訪問。

使用 ObjectDataSource 控制項顯示資料

我們在這裡設想您需要建立一個用於顯示 Products 資料庫表的內容的 Web 頁面。再進一步設想您的某個現有業務組件包含了一種用於檢索此資料的方法。

例如,清單 1 中的組件包含了一個名為 GetProducts 的方法,此方法返回一個 DataReader 來表示 Products 資料庫表的內容。

清單 1: ProductInfo.cs (C#)

using System;using System.Data;using System.Data.SqlClient;public class ProductInfo{const string conString ="Server=localhost;Trusted_Connection=true;Database=Northwind";public static SqlDataReader GetProducts(){SqlConnection con = new SqlConnection(conString);string selectString = "SELECT * FROM Products";SqlCommand cmd = new SqlCommand(selectString, con);con.Open();SqlDataReader dtr =cmd.ExecuteReader(CommandBehavior.CloseConnection);return dtr;}}

如果您將清單 1 中包含的這個類添加到應用程式的 Code 目錄中,那麼 ASP.NET Framework 將自動編譯這個類。換句話說,只要向 Code 目錄添加了這個類,就可以立即在 ASP.NET 頁中使用它。

我們將使用 GridView 控制項(在 ASP.NET 2.0 Framework 中替換了 DataGrid 控制項)來顯示由 GetProducts 方法返回的資料庫記錄。清單 2 中的 ASP.NET 頁包含了一個綁定到 ObjectDataSource 控制項的 GridView

清單 2: ShowProducts.aspx

<html><head><title>Show Products</title></head><body><form id="form1" runat="server"><asp:GridViewID="GridView1"DataSourceID="ObjectDataSource1"Runat="Server" /><asp:ObjectDataSourceID="ObjectDataSource1"TypeName="ProductInfo"SelectMethod="GetProducts"Runat="Server" /></form></body></html>

清單 2 中聲明的 ObjectDataSource 控制項包含兩個重要的屬性。TypeName 屬性指示類名,而 SelectMethod 屬性指示在選擇資料時要在此類上調用的方法名。

在清單 2 中,ObjectDataSource 控制項用於調用 ProductInfo 類上的 GetProducts 方法。由於 GridView 控制項綁定到了 ObjectDataSource 控制項上,因此通過 GridView 控制項的 DataSourceID 屬性,GridView 控制項即可顯示產品列表(請參見圖 1)。

圖 1. 使用 ObjectDataSource 控制項顯示產品

您可以結合使用 ObjectDataSource 控制項與任何標準的 ASP.NET 資料繫結控制項(例如,GridViewDropDownListTreeViewRepeater 控制項)。ObjectDataSource 控制項使您能夠將任何標準控制項綁定到組件。

SelectMethod 可以引用靜態方法(在 Visual Basic .NET 中共用)或執行個體方法。如果您使用的是執行個體方法,則 ObjectDataSource 控制項在調用這個方法前,會自動建立此組件的一個執行個體。在完成方法調用後,將自動銷毀此組件。

結合使用參數與 ObjectDataSource 控制項

您可以將參數與使用 ObjectDataSource 控制項調用的方法一起使用。當您調用某方法時,如果需要將某些值(例如,控制項屬性或查詢字串的值)傳遞給此方法,則這種方式就非常有用。

在前一節中,我們使用 ObjectDataSource 控制項建立了一個頁面,用於顯示來自 Products 資料庫表的所有記錄。在本節中,我們將修改此頁面,以便允許使用者從 DropDownList 控制項(請參見圖 2)選擇產品類別。

圖 2. 從 DropDownList 選擇產品類別

清單 3 包含了修改後的 ProductInfo 組件。

清單 3: ProductInfo2.cs (C#)

using System;using System.Data;using System.Data.SqlClient;public class ProductInfo2{const string conString ="Server=localhost;Trusted_Connection=true;Database=Northwind";public SqlDataReader GetProducts(string category){SqlConnection con = new SqlConnection(conString);string selectString = "SELECT Products.* " +"FROM Products INNER JOIN Categories " +"ON Products.CategoryID=Categories.CategoryId " +"WHERE CategoryName=@CategoryName";SqlCommand cmd = new SqlCommand(selectString, con);cmd.Parameters.AddWithValue("@CategoryName", category);con.Open();SqlDataReader dtr =cmd.ExecuteReader(CommandBehavior.CloseConnection);return dtr;}}

清單 3 中經過修改的 ProductInfo 組件包含了一個經過修改的 GetProducts 方法,此方法包含了一個用於類別名的參數。這個參數用於限制從資料庫返回的產品。

清單 4 包含了 DropDownListGridViewObjectDataSource 控制項,使您可以選擇要顯示的不同類別的產品。

清單 4: ShowProducts2.aspx

<html><head><title>Show Products</title></head><body><form id="form1" runat="server"><asp:DropDownListid="DropCategories"AutoPostBack="true"Runat="Server"><asp:ListItem Value="Beverages" /><asp:ListItem Value="Seafood" /></asp:DropDownList><br /><br /><asp:GridViewID="GridView1"DataSourceID="ObjectDataSource1"Runat="Server" /><asp:ObjectDataSourceID="ObjectDataSource1"TypeName="ProductInfo2"SelectMethod="GetProducts"Runat="Server"><SelectParameters><asp:ControlParameterName="category"ControlID="DropCategories" /></SelectParameters></asp:ObjectDataSource></form></body></html>

從清單 4 的 DropDownList 控制項選擇新類別時,GridView 控制項將自動地只顯示來自選定類別的產品。

請注意,清單 4 中的 ObjectDataSource 控制項包含了一個 SelectParameters 元素。這個元素列出了調用由 ObjectDataSource 控制項的 SelectMethod 屬性指定的方法時使用的所有參數。在本例中,SelectedParameters 元素包含了一個名為 category 的單個參數。這個參數表示來自 DropCategoriesDropDownList 控制項的 SelectedValue 屬性的值。

使用 ObjectDataSource 控制項編輯資料

ObjectDataSource 控制項包含 4 個重要屬性:SelectMethod 屬性、UpdateMethod 屬性、InsertMethod 屬性和 DeleteMethod 屬性。綜合利用這些屬性,您能夠指定執行標準資料庫操作所需的所有方法。

例如,您可以使用 ObjectDataSource 控制項來編輯資料庫資料。在清單 5 中,修改後的 ProductInfo 類包含了一個新的 UpdateProductDeleteProduct 方法。

清單 5: ProductInfo3.cs (C#)

using System;using System.Data;using System.Data.SqlClient;public class ProductInfo3{const string conString ="Server=localhost;Trusted_Connection=true;Database=Northwind";public static SqlDataReader GetProducts(){SqlConnection con = new SqlConnection(conString);string selectString = "SELECT ProductId,ProductName, " +"UnitPrice FROM Products ORDER BY ProductId";SqlCommand cmd = new SqlCommand(selectString, con);con.Open();SqlDataReader dtr =cmd.ExecuteReader(CommandBehavior.CloseConnection);return dtr;}public static void UpdateProduct(int original_productId,string productName, decimal unitPrice){SqlConnection con = new SqlConnection(conString);string updateString = "UPDATE Products SET " +"ProductName=@ProductName,UnitPrice=@UnitPrice " +"WHERE ProductID=@ProductID";SqlCommand cmd = new SqlCommand(updateString, con);cmd.Parameters.AddWithValue("@ProductName", productName);cmd.Parameters.AddWithValue("@UnitPrice", unitPrice);cmd.Parameters.AddWithValue("@ProductId", original_productId);con.Open();cmd.ExecuteNonQuery();con.Close();}public static void DeleteProduct(int original_productId){SqlConnection con = new SqlConnection(conString);string deleteString = "DELETE Products " +"WHERE ProductID=@ProductID";SqlCommand cmd = new SqlCommand(deleteString, con);cmd.Parameters.AddWithValue("@ProductId", original_productId);con.Open();cmd.ExecuteNonQuery();con.Close();}}

您可以將這個修改過的 ProductInfo 類與清單 6 中包含的ObjectDataSource 控制項一起使用,以編輯 Products 資料庫表的內容。

清單 6: ShowProducts3.aspx

<html><head><title>Show Products</title></head><body><form id="form1" runat="server"><asp:GridViewID="GridView1"DataSourceID="ObjectDataSource1"DataKeyNames="ProductId"AutoGenerateColumns="false"AutoGenerateEditButton="true"AutoGenerateDeleteButton="true"Runat="Server"><Columns><asp:BoundFieldDataField="ProductName"/><asp:BoundFieldDataField="UnitPrice"DataFormatString="{0:c}"/></Columns></asp:GridView><asp:ObjectDataSourceID="ObjectDataSource1"TypeName="ProductInfo3"SelectMethod="GetProducts"UpdateMethod="UpdateProduct"DeleteMethod="DeleteProduct"Runat="Server"><UpdateParameters><asp:ParameterName="original_productId"Type="Int32" /><asp:ParameterName="productName" /><asp:ParameterName="unitPrice"Type="Decimal"/></UpdateParameters></asp:ObjectDataSource></form></body></html>

在清單 6 中,GridView 控制項顯示了ProductName 和 UnitPrice 這兩個列的值。由於 GridView 控制項的 AutoGenerateEditButtonAutoGenerateDeleteButton 屬性均設定為值 True,GridView 將自動產生用於編輯和刪除產品行的使用者介面(請參見圖 3)。

圖 3. 使用 ObjectDataSource 控制項編輯資料

當您單擊 Update 連結更新產品時,ObjectDataSource 控制項將調用 UpdateProduct 方法。請注意,ObjectDataSource 控制項在其 UpdateParameters 元素中列出了傳遞給 UpdateProduct 方法的參數。

有一個參數需要額外進行討論。我們需要將被更新的行的 ProductID 列的值傳遞給 UpdateProduct 方法由於沒有在 GridView 中顯示 ProductID 列,我們必須將 ProductID 列分配給 GridView 控制項的 DataKeyNames 屬性。這個列的名稱變為 original_productId,而不是 productId,因為我們正在向 update 方法傳遞 ProductID 列的未編輯版本。

如果您單擊 Delete 連結,ObjectDataSource 控制項將調用 DeleteProduct 方法。由於 GridView 控制項的 DataKeyNames 屬性具有值 ProductId,因此會再次將一個名為 original_productId 的參數自動傳遞給 DeleteProduct 方法。

結合使用 ObjectDataSource 控制項和 SqlDataSource 控制項

到目前為止,我們已經將 ObjectDataSource 控制項與使用 SqlDataReader 對象的組件一起使用,以便檢索資料庫資料。這裡還有另一種選擇。即不在組件內使用 SqlDataReaderDataSet 等 ADO.NET 對象,而是在組件中使用 SqlDataSource 控制項。

您可以在組件中使用 SqlDataSource 控制項的這一事實似乎很奇怪。通常,您不在組件中使用控制項,因為控制項一般具有可視化表示形式,而且控制項參與頁面執行生命週期。而 DataSource 控制項在這一點上有些特殊。

如果您希望簡化組件中的資料庫存取碼,您可以在此組件中使用 SqlDataSource 控制項。清單 7 展示了這種方式。

清單 7: ProductInfo4.cs (C#)

using System;using System.Collections;using System.Web.UI;using System.Web.UI.WebControls;public class ProductInfo4{const string conString ="Server=localhost;Trusted_Connection=true;Database=Northwind";public static IEnumerable GetProducts(){string selectString = "SELECT * FROM Products";SqlDataSource dsrc = new SqlDataSource(conString,selectString);dsrc.DataSourceMode = SqlDataSourceMode.DataSet;return dsrc.Select(DataSourceSelectArguments.Empty);}}

清單 7 中,我們執行個體化了 SqlDataSource 控制項的一個新執行個體。SqlDataSource 的建構函式接受了一個用於資料庫連接字串的參數和一個用於與 select 命令一起使用的命令文本的參數。接著,將 DataSourceMode 屬性的值設為 DataSet(這裡的另一個選項是 DataReader)。最後,在 SqlDataSource 控制項的執行個體上調用 Select 方法,並返回表示來自 Products 資料庫表的所有記錄的 DataView

您可以將清單 7 中的 ProductInfo 類與清單 8 中包含的 ObjectDataSource 控制項一起使用:

清單 8: ShowProducts4.aspx

<html><head><title>Show Products</title></head><body><form id="form1" runat="server"><asp:GridViewID="GridView1"DataSourceID="ObjectDataSource1"Runat="Server" /><asp:ObjectDataSourceID="ObjectDataSource1"TypeName="ProductInfo4"SelectMethod="GetProducts"Runat="Server" /></form></body></html>

在清單 8 中,GridView 控制項綁定到了 ObjectDataSource 控制項上。而 ObjectDataSource 控制項又調用了 ProductInfo4 類的 GetProducts 方法,以檢索由 GridView 顯示的資料。最後,GetProducts 方法使用 SqlDataSource 控制項檢索資料庫資料。

小結

ASP.NET 2.0 Framework 極大地簡化了資料庫訪問,使您可以更輕鬆地產生簡單和複雜的 ASP.NET 應用程式。如果您需要產生一個簡單的資料庫驅動 Web 應用程式,那麼您可以使用新的 SqlDataSource 控制項。如果您需要產生一個更為複雜的應用程式或樣本,您可以在傳統的 3 層應用程式中使用 ObjectDataSource 控制項。

ObjectDataSource 控制項使您能夠繼續在資料驅動頁面中使用中介層組件。其主要優勢在於使您無需編寫任何代碼即可綁定到一個組件,從而極大簡化了您的使用者介面。使用 ObjectDataSource 控制項,我可以在 3 分鐘 20 秒的時間內產生一個可以顯示 Product 資料庫表的組件和頁面。儘管這種方式花的時間比使用 SqlDataSource 控制項長,但我感覺這樣做時頁面的體繫結構要好得多。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.