VS2005和ASP.NET2.0中使用強型別資料

來源:互聯網
上載者:User
asp.net|資料    一、 簡介

  作為開發人員,當我們在學習新技術時,例子可能是我們最大的敵人。而教程往往設計得易於理解,但是同時,它們常常加固了懶惰,低效性,甚至於危險的編碼習慣。再也沒有比ADO.NET樣本更能說明問題的了。在本文中,我們將準備分析一下強型別對象對於你的資料庫開發的意義以及為什麼在沒有例子的情況下你應該在應用程式中盡量使用強型別對象。

  具體地說,我們將分析怎樣在Visual Studio 2005中建立和使用強型別DataSet。正如本文所探討的,相對於其它可選的弱類型化的資料存取技術,強型別DataSet提供了很多優點;並且,藉助於Visual Studio 2005,建立和使用強型別DataSet比以往更為容易。

   二、 強型別對象基礎及優點

  為了理解強型別化的含義,不妨讓我們先考慮一下約會的例子。如果你是一個單身漢,那麼,你盼望與什麼類型的人約會呢?你可能已經有了自己具體的標準,如富裕且吸引人或可能是居住條件優越而性感。無論你的條件如何,當你決定想與誰在一起呆更長的時間時,你都難免有一套自己的約會標準。如果你很明智,可以列出一個經過事先深思熟慮的列表,這樣可以協助你節約不必要的感情付出。把一項"非酗酒"的條件加入到你的約會標準中將會節約你大量的時間,並且允許你把你的時間和精力用於與更好的候選者約會。

  你可能疑惑,這怎麼能與編程進行比較呢?請聽我的解釋。ADO.NET資料存取對象的設計是為了實現最大的靈活性。除非你遇到相當大的麻煩,否則,當你從資料庫讀取資料時,你都會使用大量普通的未經類型化的對象-當然,.NET架構完全允許這樣做。而使用我們的約會類比法,總是把你的關係資料當作泛型對象則有點象承認"我只與滿足我條件的人約會"。難道你不能稍微放寬一些條件嗎?作為你的朋友,我必須建議你"先確定一些標準,再精簡一下你的列表!"也許更好些。

  正如忽視篩選你要約會的人能夠導致未來的關係問題,與你的對象保持"松耦合"能夠給你的代碼帶來錯誤。另外,因為如果你讓任何舊對象"出入"你的子程式的話,那麼,直到你的應用程式在運行時刻執行時,你可能才會知道存在問題。在我們的日期約會類比中,在運行時刻捕獲錯誤很類似於你與你的約會者在一家時髦的意大利餐館進行一場痛苦而尷尬的討論。是的,你發現了這個問題;但是,如果你已經事先計劃好的話,那麼你的結果就不會是"一群用餐者盯著你,而你滿身是意大利烤碎肉卷"。如果你簡單地把一些更緊密的標準應用程式於你的代碼中,那麼在你的應用程式開始運行前(在編譯時間刻)你就能夠捕獲錯誤。例如,請考慮下面的範例程式碼:

string FirstName = myrow.("FirstName").ToString();
  上面的DataRow就是非類型化的;結果,你必須以一個串形式作為你要查詢的列名來存取這個值(或者,使用這個列集合中的列的索引值)。很可能,這個列真正存在。一個DataRow列的資料類型是對象;我們假定FirstName列的基礎資料型別 (Elementary Data Type)是字串,但是,我們必須顯式地把它轉化成一個字串以便使用它。如果列名發生變化(例如,你把它改為PersonFirstName),那麼編譯器是不能通知你的。千萬不要這樣!因此,如果你的代碼看起來更象如下形式,那麼你的生活就會更容易些而你的代碼將更為可靠:

string FirstName = PersonRow.FirstName;


  在第二個例子中,我們擁有一個強型別行,並且我們知道FirstName屬性是字串類型。在此,不會出現雜亂的列名,而且也不存在雜亂的對象轉換問題。編譯器為我們作類型檢查,並且我們可以繼續進行其它任務而不必擔心是否我們已經正確輸入了列名。

  對於所有其它列也是如此;總之,當你能夠使用一個更為具體的類型時,你永遠不應該使用一個泛型對象。但是,請等一下。該強型別對象出自何處?我想我能夠告訴你這些對象是為你自動建立的。然而,正如要建立良好的關係需要時間和精力一樣,強型別化你的對象也需要付出其它努力。好的方面在於,這裡所花費的額外時間是值得的,而且節省了將來更多的花在調試上的時間。

  存在若干種可以實現強型別化的方法,在本文餘下的部分中,我們將討論怎樣在Visual Studio 2005中建立強型別DataSet;當然,還將分析一下這樣做的優點和缺點。

  三、 在VS 2005中建立強型別DataSet

  其實,強型別DataSet是一些提前定義了它們自己的列與表的泛型DataSet,這樣編譯器已經知道它們將會包含什麼內容。不是把你的資料封裝為一個"露指手套",一個強型別DataSet恰似一個"手套"。每一個Visual Studio的後續版本會使得強型別化一個DataSet的過程更為容易。在這個樣本中,我們將使用來自於SQL Server 2005中的AdventureWorks資料庫。這隻要簡單地執行如下步驟:

  1. 開啟Visual Studio,然後建立一個新的ASP.NET網站。

  2. 在Solution Explorer中,占擊以添加一個新項並且選擇DataSet,並命名為AdventureWorks.xsd。Visual Studio推薦把這個DataSet檔案放到App_Code檔案夾下。

  3. 這個AdventureWorks.xsd將在設計模式下開啟,並且啟用"TableAdapter Configuration"嚮導。現在,僅僅點擊一下"Cancel"即可。

  4. 定位到Server Explorer工具箱,導航到你的SQL Server 2005資料庫和AdventureWorks資料庫。(如果你還沒有安裝AdventureWorks資料庫的話,你可以從微軟的SQL Server 2005 Samples and Sample Databases下載頁面下載它,還有另外的SQL Server 2005樣本。)

  5. 把SalesOrderHeader和SalesOrderDetail表拖動到你的DataSet設計器視窗。現在,這個視窗應該類似於下面的螢幕快照。注意,對於我們加入的每個表,Visual Studio都建立一個強型別DataTable(該名稱是基於原始的表)和一個TableAdapter。這個DataTable為我們定義了每一個列。這個表適配器是我們用來填充這個表的對象。預設情況下,我們有一個Fill()方法,由它找到表中的每一行。

  這個強型別DataSet將返回在這兩個表中的所有記錄。既然AdventureWorks資料庫包含大量的訂單資訊,那麼我們為什麼不建立一個更為具體些的查詢呢?我們可以把方法添加到我們的TableAdapter對象來檢索一個更為具體的表的記錄子集。首先,右擊SalesOrderHeaderTableAdapter,並且選擇"Add|Query"。選擇"Use SQL statements"並且點擊Next按鈕。然後,選擇"SELECT which returns rows"並且點擊Next按鈕。最後,在視窗中輸入下列查詢(或使用Query Builder來實現相同的任務):

SELECT
SalesOrderID, RevisionNumber, OrderDate, DueDate, ShipDate,
Status, OnlineOrderFlag, SalesOrderNumber, PurchaseOrderNumber,
AccountNumber, CustomerID, ContactID, SalesPersonID, TerritoryID,
BillToAddressID, ShipToAddressID, ShipMethodID, CreditCardID,
CreditCardApprovalCode, CurrencyRateID, SubTotal, TaxAmt, Freight,
TotalDue, Comment, rowguid, ModifiedDate
FROM Sales.SalesOrderHeader
WHERE (OrderDate > @OrderDate)

  這個SQL查詢是一個簡單的SELECT查詢,它有一個@OrderDate參數以進一步縮小結果範圍。這樣可以防止我們返回資料庫的每一個訂單。點選"Fill a DataTable"和"Return a DataTable"複選框,然後點擊Finish。在添加這個SELECT語句後,你的設計者現在應該有一個外部查詢已經添加到這個SalesOrderHeaderTableAdapter,請參考下面的螢幕快照。

  四、 在一個ASP.NET頁面上使用強型別DataSet

  通過建立強型別DataSet,我們可以僅通過編寫幾行代碼就可以實現容易地在一個ASP.NET頁面顯示這些資料。首先,在你的網站上建立一個ASP.NET頁面並且在設計模式中觀察它。然後,拖放一個GridView控制項到其上,保持其ID為GridView1。開啟ASP.NET頁面的原始碼並且在檔案的頂部匯入AdventureWorksTableAdapters命名空間(在C#中,該文法為:"using AdventureWorksTableAdapters;")。最後,把下列代碼添加到Page_Load事件處理器中:

//建立SalesOrderHeaderTableAdapter
SalesOrderHeaderTableAdapter salesAdapter =
new SalesOrderHeaderTableAdapter();
//得到發生於2004年7月1日之後的訂單
AdventureWorks.SalesOrderHeaderDataTable Orders =
salesAdapter.GetDataBy(new DateTime(2004, 7, 1));
//把訂單結果綁定到GridView
this.GridView1.DataSource = Orders;
this.GridView1.DataBind();

  這段代碼是很簡單的。我們建立SalesOrderHeaderTableAdapter的一個執行個體-我們將使用它來填充DataTable。注意,不是聲明一個泛型DataTable,我們聲明了一個SalesOrderHeaderDataTable類型的對象。為了填充這個DataTable,我們調用GetDateBy()方法並且傳遞給它一個DateTime對象。還要注意,甚至這個檢索命令也是強型別化的,因為我們必須傳遞一個DateTime對象,而不僅僅是一個泛型對象。下面的螢幕快照顯示了上面範例程式碼的清晰結果。

  除了通過代碼把結果綁定到GridView外,你還可以使用一個ObjectDataSource,設定它的TypeName屬性為AdventureWorksTableAdapters.SalesOrderHeaderTableAdapter,並且把它的SelectMethod設定為GetData或GetDataBy。

  五、 使用強型別DataSet插入、更新和刪除資料

  在本文中,我們已經看到了怎樣使用一個強型別DataSet從一個資料庫中選擇資料。然而,你還可以使用這些工具來插入、更新和刪除基本的資料庫資料。

  除了不必編寫代碼來存取資料庫外,使用這個強型別化的DataSet的另外一個很大的優點是,在此不存在編譯器不能檢查的字串列名潛伏在我們的代碼並且我們不必進行任何對象轉換。如果我們曾經改變過我們的資料庫模式,那麼一旦我們更新我們的AdventureWorks.xsd檔案,我們將注意到在編譯期間的存在於我們的應用程式中的所有的巨大變化。

  六、 小結

  其實,除了使用強型別DataSet外,還有另外的方法來實現你的應用程式的強型別化。你可以建立定製類-比DataSet更為輕量級並且能夠正確地響應於你的資料庫。而且,還有一些第三方軟體開發人員提供工具來自動化這一過程。其中,一個特別的產品是LLBLGen Pro,就是我比較喜歡的工具之一,我還寫了有關於它的一本書:《Rapid C# Windows Development: Visual Studio 2005, SQL Server 2005,and LLBLGen Pro》。另外一個流行的工具是CodeSmith。甚至微軟也在使用一個與之類似的工具-DLINQ,它仍處於測試階段,至少在下一年中不會上市。

  如果你使用Visual Studio強型別DataSet方法,那麼你不需要購買任何另外的軟體-這是一個明顯的優點。所有這些解決方案都有其各自不同的特徵和優點,但是強型別化你的關係資料的主要優點還在於:可靠性,更少的錯誤和更少的調試時間花費;另外,分析資料庫模式變化的影響並實現它們也更為容易。最後,非常希望你已經瞭解到強型別化的優點。祝你幸運!



聯繫我們

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