欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
Builder.com.cn-編程-Visual Studio 2005 中的新的 DataSet 功能

Visual Studio 2005 中的新的 DataSet 功能
作者: Jackie Goldstein
2005-10-11 11:40 AM

除非另有說(shuō)明,否則本文的內容基于 Visual Studio 2005 的 2004 年 12 月的 CTP(社區技術(shù)預覽)版。

引言

在上一篇文章 ADO.NET 2.0 中的新增 DataSet 功能中,我介紹了即將對 ADO.NET 的 DataSet 類(lèi)及相關(guān)類(lèi)(例如 DataSet、DataTable 和 DataView)進(jìn)行的更改及改進(jìn)。所有這些類(lèi)都是 Microsoft .NET Framework 基類(lèi)庫的一部分。

在本文中,我將重點(diǎn)介紹從 Microsoft Visual Studio 2005 開(kāi)發(fā)環(huán)境中使用這些類(lèi)以及衍生類(lèi)進(jìn)行開(kāi)發(fā)的問(wèn)題。本文特別討論了對 Visual Studio 2005 生成的類(lèi)型化的 DataSet 類(lèi)和新的類(lèi)型化的 TableAdapter 類(lèi)所做的更改。本文還介紹了一些設計器和工具,它們?yōu)殚_(kāi)發(fā)以數據為中心的應用程序功能提供了極大的靈活性和效率。為了解釋不同的概念和功能,我將逐步介紹開(kāi)發(fā)人員在實(shí)現應用程序的數據部分時(shí)通常會(huì )經(jīng)歷的過(guò)程。本文中的代碼示例使用 Northwind 數據庫,該數據庫是 Microsoft SQL Server(及 MSDE)7.0 和 2000 附帶的示例數據庫。

數據源

Visual Studio 2005 引入了項目的數據源概念。數據源表示可供應用程序使用的數據。這些數據不一定來(lái)自數據庫,用來(lái)定義數據源的“數據源配置向導”允許您從三個(gè)不同的來(lái)源獲得數據:

1.數據庫 - 可以是基于服務(wù)器的數據庫,例如 SQL Server 或 Oracle;也可以是基于文件的數據庫,例如 Access 或 SQL Server Express。Visual Studio 可以自動(dòng)生成類(lèi)型化的 DataSet 和其他類(lèi),并將它們添加到您的項目中。

2.對象 - 具有公共屬性的任何對象都可以作為數據源,不需要實(shí)現任何特殊的接口。 3.Web 服務(wù) - 通過(guò) Web 服務(wù)創(chuàng )建數據源將創(chuàng )建一些與 Web 服務(wù)返回的數據類(lèi)型相對應的對象。

數據源的用途包括兩方面。首先,它作為一種方法,使指定、設計和生成強類(lèi)型的類(lèi)(用于表示應用程序的數據)變得更容易。其次,它提供了一種靈活但統一的機制,可以快速創(chuàng )建豐富且功能強大的 WinForm 和 WebForm 用戶(hù)界面。閱讀本文后,就會(huì )了解此過(guò)程是多么快速、簡(jiǎn)單和靈活。

在本文中,我們將重點(diǎn)介紹如何創(chuàng )建數據庫 (DataSet) 數據源,以及如何在 WinForm 應用程序中使用它們。但是,記住以下兩點(diǎn)很重要:

創(chuàng )建數據源后,不管它的數據來(lái)自何處,使用它的方式都是相同的。也就是說(shuō),就像您可以輕松(且圖形化)地將基于數據庫的數據源綁定到一個(gè)網(wǎng)格或一組控件一樣,實(shí)際上來(lái)自 Web 服務(wù)或自定義業(yè)務(wù)對象的數據也是如此。

數據源以相同的方式進(jìn)行定義,不管它們將要用在 WinForm 應用程序還是 WebForm 應用程序中。不同的數據提供程序還可以抽象化,所以如果只使用 DataSet 和 TableAdapter 提供數據訪(fǎng)問(wèn),要更改實(shí)際的數據庫,只需更改連接字符串并重新生成類(lèi)即可。

類(lèi)型化的 DataSet 和 TableAdapter

一個(gè)數據庫數據源是一個(gè)強類(lèi)型的 DataSet 與一對或多對強類(lèi)型的 DataTable 和 TableAdapter 的組合。類(lèi)型化的 DataSet 并不是一個(gè)新概念,我們曾在 Visual Studio 2002/2003 中討論過(guò)它。類(lèi)型化的 DataSet 是一個(gè)生成的類(lèi),是從 .NET Framework 的一般 DataSet 類(lèi)衍生來(lái)的,但具有已定義的架構以及特定于該架構的屬性和方法。同時(shí),對于 DataSet 中的每個(gè)表,還生成了特定于該 DataSet 的三個(gè)附加衍生類(lèi):DataTable、DataRow 和 DataRowChangeEvent。每個(gè)類(lèi)都為相關(guān)的表提供了特定的架構、屬性和方法。例如,如果我定義一個(gè)基于 Northwind Employees 表的數據源,最后會(huì )生成以下類(lèi):

• NorthwindDataSet

EmployeesDataTable

• EmployeesDataRow

• EmployeesRowChangeEvent

這四個(gè)類(lèi)組成了類(lèi)型化的 DataSet。在 Visual Studio 2005 中,還會(huì )生成第五個(gè)類(lèi),即名為 EmployeesTableAdapter 的類(lèi)型化的 TableAdapter 類(lèi),我們稍后會(huì )進(jìn)行討論。當然,如果您動(dòng)態(tài)定義查詢(xún),則不能生成類(lèi)型化的 DataSet,而需要使用標準的 DataSet。

為什么非要使用類(lèi)型化的DataSet 呢?除了強迫您事先仔細考慮數據架構的問(wèn)題,而不是只“隨便想想”之外,類(lèi)型化的 DataSet 還提供了以下幾個(gè)具體的優(yōu)點(diǎn):

1.DataSet、DataTable、DataRow 和 RowChangeEvent 特定于要處理的架構。

2.表、列和關(guān)系是作為命名屬性提供的,而不是作為一般的集合元素。

3.作為第 (2) 條的結果,您可以從 Visual Studio 代碼編輯器中獲得全部的 IntelliSense 和語(yǔ)句完成支持。

4.同樣作為第 (2) 條的結果,使編譯時(shí)類(lèi)型檢查成為可能(例如,可以在編譯時(shí)而不是運行時(shí)捕獲字段名稱(chēng)拼寫(xiě)錯誤)。

5.代碼更簡(jiǎn)潔、可讀性更強,不會(huì )出現這樣的代碼:

country = dsNorthwind.Tables ("Employees").Rows (row) ("Country")

相反,代碼應是:

country = dsNorthwind.Employees (row).Country

最基本的是,類(lèi)型化的 DataSet 提供的設計時(shí)和編譯時(shí)幫助不僅可以大大減少最初的開(kāi)發(fā)時(shí)間,還可以大大減少調試和穩定應用程序所需的時(shí)間。

而 TableAdapter 對 Visual Studio 2005 來(lái)說(shuō)則是一個(gè)全新的概念。它隱含的意思是,強類(lèi)型的 TableAdapter 是標準 DataAdapter 的強類(lèi)型的等價(jià)物。您使用 TableAdapter 連接數據庫并對該數據庫執行查詢(xún)(或存儲過(guò)程),然后用數據填充相關(guān)的 DataTable。每個(gè) DataTable-TableAdapter 對簡(jiǎn)稱(chēng)為一個(gè) TableAdapter。

注意:在 2004 年 12 月的 CTP 中,DataTable-TableAdapter 對被稱(chēng)為數據組件。但是,Visual Studio 已不再使用此術(shù)語(yǔ),以后的版本中只會(huì )將該對稱(chēng)為 TableAdapter。本文只使用術(shù)語(yǔ) TableAdapter。

TableAdapter 實(shí)質(zhì)上是標準 DataAdapter 的包裝程序,它具有以下幾個(gè)優(yōu)點(diǎn):

• 同一個(gè) TableAdapter 類(lèi)可用于多個(gè)表單或組件中,使查詢(xún)/命令的任何更改都能自動(dòng)反映在所有實(shí)例中。這與現狀是不同的,現在,訪(fǎng)問(wèn)數據庫的每個(gè)組件都必須具有自己?jiǎn)为毰渲玫?DataAdapter。這使 DataTable 和 DataAdapter 之間的同步更容易實(shí)現。

• TableAdapter 使您可以輕松地為一個(gè)給定的 DataTable 定義多個(gè)命令,而不必使用多個(gè) DataAdapter(或手動(dòng)編寫(xiě)的切換代碼)為一個(gè) DataTable 定義多個(gè)查詢(xún)/命令。

• 填充命令具有可讀(友好)的名稱(chēng),而且 TableAdapter 包含的代碼能夠自動(dòng)將所有參數的類(lèi)型和值信息填充到這些命令方法中。您不用再擔心如何傳遞提供程序特定的數據類(lèi)型(例如 SqlInt)。

一個(gè)簡(jiǎn)單的代碼片斷將有助于說(shuō)明這些功能。在 Visual Studio 2002/2003 中,即使使用類(lèi)型化的 DataSet,使用兩個(gè)參數執行一個(gè)簡(jiǎn)單查詢(xún)的代碼對查詢(xún)來(lái)說(shuō)也很重要:

SELECT FirstName, LastName from Employees WHERE Country = @country AND City = @city

我們必須編寫(xiě)如下所示的代碼:

Me.SqlAdapter1.SelectCommand.Parameters ("@country").value =
Me.CountryListbox.SelectedValue.Trim()
Me.SqlAdapter1.SelectCommand.Parameters ("@city").value =
Me.CityTextbox.Text.Trim()
Me.SqlAdapter1.Fill (Me.NorthwindDataSet.Employees)

當然,隨著(zhù)參數數量的增加,代碼的行數也會(huì )增加。更重要的是,正確記住并鍵入每個(gè)參數名稱(chēng)的可能性大大降低。即使參數名稱(chēng)正確,我還需要記住該參數的數據類(lèi)型。最慘的是,如果我輸入了錯誤的字段名稱(chēng)或者嘗試指定了錯誤類(lèi)型的值,直到運行時(shí)才能發(fā)現這個(gè)錯誤!

使用 Visual Studio 2005 中的 TableAdapter,定義命令 FillByCountryAndCity 之后,我只需編寫(xiě)一行代碼(用于傳遞參數值),即可在任意位置使用該命令:

Me.EmployeesTableAdapter.FillByCountryAndCity ( _
Me.NorthwindDataSet.Employees, Me.CountryListbox.SelectedValue.Trim(), _ Me.CityTextbox.Text.Trim() )

請務(wù)必注意,我們不僅是從一個(gè) TableAdapter 中獲取多個(gè)命名命令,而且這些命令是強類(lèi)型的。這意味著(zhù)在 Visual Studio 中編寫(xiě)代碼時(shí),我們可以獲得全部的 IntelliSense,能夠將這些命令視為 TableAdapter 的方法。我們還可以對這些命令的參數進(jìn)行編譯時(shí)類(lèi)型檢查,還可以獲得帶有方法和參數類(lèi)型定義的工具提示以幫助我們處理各種情況。TableAdapter 可以有多個(gè)方法,用來(lái)執行不同的命令并接受不同的參數。我們將在稍后創(chuàng )建示例表單時(shí)進(jìn)一步介紹 TableAdapter。

入門(mén) - 創(chuàng )建數據源

在本文中,我們將創(chuàng )建一個(gè)表單,用來(lái)顯示 Northwind 數據庫中每個(gè)訂單的訂單信息。打開(kāi)一個(gè)新的 Visual Basic WinForm 項目后,首先要做的是在該項目中添加一個(gè)新的數據源(我們將使用 Visual Basic 逐步介紹此過(guò)程,但所有內容同樣適用于 C#)。

添加數據源的步驟:

1.從 Visual Studio 主菜單的 Data(數據)菜單項中選擇 Show Data Sources(顯示數據源),以顯示 Data Sources(數據源)窗口(如果尚未顯示)。

2.在 Data Sources(數據源)窗口中,單擊 Add New Data Source(添加新數據源)工具欄按鈕。將啟動(dòng) Data Source Configuration Wizard(數據源配置向導),該向導合并了 DataAdapter Configuration Wizard(DataAdapter 配置向導)的大多數功能與 Visual Studio 2002/2003 中的 DataSet 生成工具。

3.如果您的 Visual Studio 版本仍然包含向導的 Welcome(歡迎)頁(yè)面,請選擇“下一步”。將顯示 Choose a Data Source Type(選擇數據源類(lèi)型)頁(yè)面。

4.選擇 Database(數據庫)。

5.選擇 Next(下一步)。將顯示 Choose Your Data Connection(選擇您的數據連接)頁(yè)面。

6.選擇 New Connection(新建連接)。將顯示 Add Connection(添加連接)對話(huà)框。

7.輸入連接 SQL Server 或 MSDE 實(shí)例及 Northwind 數據庫所需的信息。

8.選擇 OK(確定)關(guān)閉該對話(huà)框。

9.請注意,連接字符串現在被保存為設置屬性,可以通過(guò)以下字符串進(jìn)行訪(fǎng)問(wèn):

My.Settings.NorthwindConnectionString

在 C# 中,該字符串應為:

VSDataSets.Properties.Settings.Default.NorthwindConnectionString;

10.選擇 Next(下一步)。將顯示 Choose Your Database Objects(選擇您的數據庫對象)頁(yè)面。

11.請注意,您可以從 Tables(表)、Views(視圖)、Stored Procedures(存儲過(guò)程)或 Functions(函數)中進(jìn)行選擇。

展開(kāi) Tables(表)節點(diǎn),然后選擇 Orders 和 Order Details 表。我們將使用表中的所有列,但您可以只選擇您的應用程序需要的那些列。

12.選擇 Finish(完成)退出向導。

圖 1 顯示了生成的 Data Sources(數據源)窗口,其中的 Order Details 表已展開(kāi)以顯示表中的所有列。

圖 1:Data Sources(數據源)窗口中的 Order Details 表

如果要重新打開(kāi) Data Source Configuration Wizard(數據源配置向導)以進(jìn)行某些更改,可以從 Data Sources(數據源)窗口的工具欄或者從右鍵單擊該窗口中的任意元素后顯示的上下文菜單中選擇 Configure DataSet with Wizard(使用向導配置 DataSet)。但是,還有一個(gè)更強大的工具可用來(lái)編輯生成的 DataSet 和 TableAdapter,那就是 DataSet 設計器。 DataSet 設計器

Visual Studio 2005 附帶了 DataSet設計器,此工具實(shí)際上是為指定和編輯 DataSet 及其相關(guān)的 TableAdapter 而設計的。這是針對 Visual Studio 2002/2003 中的問(wèn)題做出的重大改進(jìn),在 Visual Studio 2002/2003 中,我們必須使用 XML 架構編輯器來(lái)定義強類(lèi)型的 DataSet。在 Visual Studio 2005 中,DataSet 和 TableAdapter 定義仍然保存在 .XSD 文件中,而且仍然提供了 XML 編輯器,以便在您確實(shí)需要編輯 XML 架構時(shí)使用。但是,新舊版本之間的相似性?xún)H限于此。目的不在于使 DataSet設計器支持任意 XSD 文件,而是為了說(shuō)明它只是一種方便的文件格式。

要打開(kāi) DataSet 設計器,請從 Data Sources(數據源)窗口的工具欄或者從右鍵單擊該窗口中的任意元素后顯示的上下文菜單中選擇 Edit DataSet with Designer(使用設計器編輯 DataSet)。設計 DataSet 及其 DataTable 時(shí),您可能覺(jué)得設計器與您以前設計數據庫時(shí)使用的其他工具很相似。您可以通過(guò)以下方法從要連接的數據庫中添加一個(gè)表:將數據庫對象(例如表、視圖或存儲過(guò)程)從 Server Explorer(服務(wù)器資源管理器)中拖到設計器上,或者從設計器上下文菜單的主 Data(數據)菜單項中選擇 Add TableAdapter(添加 TableAdapter)以啟動(dòng) TableAdapter Configuration Wizard(TableAdapter 配置向導)。由于 DataSet 也可以包含直接加載且未與數據庫連接的表,因此您也可以通過(guò)從菜單中選擇 Add DataTable(添加 DataTable)來(lái)添加獨立的表。當然,您也可以在編輯器中添加和/或重命名列。另一個(gè)靈活的功能是,編輯器可以自動(dòng)識別數據庫中各表之間的關(guān)系,并為您定義 DataSet 中各表之間的對應關(guān)系。

圖 2 顯示了 DataSet 設計器中的數據源,它由 Orders 表和 Order Details 表組成。請注意,與每個(gè) DataTable 密切相關(guān)的是對應的 TableAdapter,它的作用是用數據填充表并用這些數據的更改更新數據庫(后者可選)。

圖 2:數據源中的 Orders 和 Order Details 表

TableAdapter Configuration Wizard(TableAdapter 配置向導)

要在 DataSet 設計器中啟動(dòng) TableAdapter Configuration Wizard(TableAdapter 配置向導)(在 Visual Studio 2005 的 2004 年 12 月的 CTP 版中仍然稱(chēng)為 Data Component Configuration Wizard [數據組件配置向導]),請從主 Data(數據)菜單或從右鍵單擊設計器中的任意 TableAdapter 時(shí)出現的上下文菜單中選擇 Add Query(添加查詢(xún))或 Configure(配置)(現有查詢(xún))。此向導與 Visual Studio 2002/2003 中的 DataAdapter Configuration Wizard(DataAdapter 配置向導)基本相同,只是多提供了兩個(gè)頁(yè)面。第一個(gè)是圖 3 所示的 Choose a Query Type(選擇查詢(xún)類(lèi)型)頁(yè)面。由于 TableAdapter 是給定表中所有命令的中心點(diǎn),因此它不僅允許您定義多個(gè) Select/Fill 命令,還允許您運行任意類(lèi)型的查詢(xún)(更新、插入、刪除)或只返回一個(gè)值的查詢(xún)。請注意,這些更新查詢(xún)是 TableAdapter 的命名方法,必須直接調用。它們是您執行 TableAdapter 的 Update 方法(就像 DataAdapter.Update 方法一樣)時(shí)自動(dòng)調用的更新查詢(xún)的補充。

向導中的第二個(gè)附加頁(yè)面是 Choose Methods to Generate(選擇要生成的方法)頁(yè)面。在此頁(yè)面上,您可以為您定義的每個(gè)查詢(xún)/命令方法選擇名稱(chēng)。向導為每個(gè)命令都提供了 Fill 和 Get 方法,如圖 3 所示。Fill 方法要求您指定要填充的 DataTable,而 Get 方法將返回新創(chuàng )建和填充的 DataTable。

圖 3:Choose Methods to Generate(選擇要生成的方法)頁(yè)面上的 Fill 和 Get 方法

通常情況下,您會(huì )為一個(gè) TableAdapter 定義多個(gè) Fill 命令,這些命令返回相同的架構(列),但卻具有不同的 WHERE 子句。這就是默認情況下向導為方法名稱(chēng)提供 FillBy 和 GetDataBy 前綴的原因。當然,您也可以為方法指定您選擇的任意名稱(chēng)。

盡管一個(gè) TableAdapter 可以有多個(gè) Fill 命令,但調用 TableAdapter 的 Update 方法時(shí),只執行一組更新命令。這些命令是基于 TableAdapter 的主查詢(xún)自動(dòng)生成的。首次創(chuàng )建 TableAdapter 時(shí)定義的查詢(xún)被認為是 TableAdapter 的主查詢(xún)。如果以后定義的任何查詢(xún)返回的架構與主查詢(xún)返回的架構不同,設計器將使用消息框提醒您。此外,如果您修改主查詢(xún)的架構,Visual Studio 將轉到并修改其他查詢(xún)以匹配該架構。

使用 TableAdapter Configuration Wizard(TableAdapter 配置向導)添加新命令

下面,我們將另一個(gè)命令添加到 Orders 表的 TableAdapter 中。

1.從 Data Sources(數據源)窗口的工具欄中選擇 Edit DataSet with Designer(使用設計器編輯 DataSet),以打開(kāi) DataSet 設計器。

2.選擇 Orders 表的 TableAdapter,然后從其上下文菜單中選擇 Add Query(添加查詢(xún))。

3.如果您的 Visual Studio 版本中仍然存在 Welcome(歡迎)頁(yè)面,請單擊該頁(yè)面上的 Next(下一步)。將顯示 Choose a Command Type(選擇命令類(lèi)型)頁(yè)面。

4.選擇 Next(下一步),接受默認的 SQL 語(yǔ)句。將顯示 Choose a Query Type(選擇查詢(xún)類(lèi)型)頁(yè)面。

5.選擇 Next(下一步),接受默認的 SELECT 語(yǔ)句。將顯示 Specify a SQL SELECT Statement(指定 SQL SELECT 語(yǔ)句)頁(yè)面。

6.輸入以下 SQL 語(yǔ)句: SELECT OrderID, CustomerID, EmployeeID, OrderDate, RequiredDate, ShippedDate, ShipVia, Freight, ShipName,
ShipAddress, ShipCity, ShipRegion, ShipPostalCode, ShipCountry
FROM Orders
WHERE CustomerID = @CustID

將為查詢(xún)返回由 @CustID 參數指定的客戶(hù)的所有訂單。

7.選擇 Next(下一步)。將顯示 Choose Methods to Generate(選擇要生成的方法)頁(yè)面。

8.將兩個(gè)復選框保留為選中狀態(tài)。將兩個(gè)方法名稱(chēng)分別修改為 FillByCustomer 和 GetDataByCustomer。

9.選擇 Next(下一步),然后選擇 Finish(完成)以完成該過(guò)程。

如果您查看 DataSet 設計器中的 OrdersTableAdapter,就會(huì )看到現在顯示了第二對命令 FillByCustomer 和 GetDataByCustomer,它們使用 CustomerID 值作為參數。此方法參數的 (.NET) 類(lèi)型是什么?讓我們看一看。

后臺查看

在 DataSet 設計器或任何相關(guān)的向導中進(jìn)行更改時(shí),Visual Studio 將轉到并為一組類(lèi)型化的類(lèi)生成代碼。具體來(lái)說(shuō),它會(huì )生成以下類(lèi):

1.DataSet 類(lèi)
2.DataTable 類(lèi)
3.TableAdapter 類(lèi)
4.DataRow 類(lèi)
5.DataRowChangeEvent 類(lèi)

除了 DataSet 類(lèi)(每個(gè)數據源只有一個(gè))外,DataSet 中定義的每個(gè)表都有其他四個(gè)類(lèi)。您可以通過(guò)執行以下操作來(lái)查看這些類(lèi)的代碼:

1.在 Solution Explorer(解決方案資源管理器)窗口中,單擊工具欄上的 Show All Files(顯示所有文件)按鈕,以顯示與項目相關(guān)的所有文件。

2.展開(kāi) NorthwindDataSet.xsd 文件的節點(diǎn)。

3.雙擊 NorthwindDataSet.Designer.vb 的文件節點(diǎn)。這就是為實(shí)現構成 DataSet 的類(lèi)而生成的代碼。

4.打開(kāi)代碼窗口左上方的列表框。您可以從中看到此文件中的類(lèi)列表:

NorthwindDataSet

Order_DetailsDataTable
OrdersDataTable
Order_DetailsRow
OrdersRow
Order_DetailsRowChangeEvent
OrdersRowChangeEvent
Order_DetailsTableAdapter
OrdersTableAdapter

5.從左側列表框中選擇 OrdersTableAdapter 類(lèi)。

6.從右側列表框中選擇 FillByCustomer 方法。將顯示此方法的代碼,如下所示:

Public Overloads Overridable Function FillByCustomer(ByVal dataTable
As NorthwindDataSet.OrdersDataTable, ByVal CustID As String) As Integer
Me.Adapter.SelectCommand = Me.CommandCollection(1)
If (CustID Is Nothing) Then
Throw New System.ArgumentNullException("CustID")
Else
Me.Adapter.SelectCommand.Parameters(0).Value = CType(CustID,String)
End If
If (Me.m_clearBeforeFill = true) Then
dataTable.Clear
End If
Dim returnValue As Integer = Me.Adapter.Fill(dataTable)
Return returnValue
End Function

我們可以從這段代碼中了解幾個(gè)問(wèn)題。

• FillByCustomer 方法實(shí)際上使用兩個(gè)參數,一個(gè)是要填充的 OrdersDataTable,另一個(gè)是作為字符串的 CustID 參數。

• 不必查看文件中的所有代碼就可以看出 TableAdapter 類(lèi)維護一個(gè)命令集,它自動(dòng)從該集中將正確的命令指定給 .NET DataAdapter,DataAdapter 實(shí)際上用來(lái)與數據庫通信。

• 方法用于檢查狀態(tài)參數的實(shí)例是否已傳遞給方法(如果參數的 AllowDBNull 屬性設置為 False)。

• CustID 參數值被指定給 DataAdapter 的 SelectCommand 屬性的預配置參數。

• 所有內容都設置好之后,將調用標準 DataAdapter.Fill () 方法以填充 OrdersDataTable。 請記住,您不需要自己編寫(xiě)這段代碼,所有內容都已經(jīng)生成并配置好了?;ㄐr(shí)間瀏覽一下為其他類(lèi)生成的代碼,您將會(huì )更廣泛且更深入地理解這些類(lèi)是如何實(shí)現的,可能還會(huì )學(xué)到一兩個(gè)好的編碼方法!

注意:盡管類(lèi)型化的 DataSet 及其相關(guān)的類(lèi)(包括 TableAdapter)都在一個(gè)源文件中生成,但 TableAdapter 在一個(gè)單獨的名稱(chēng)空間中生成。這反映了這樣一個(gè)事實(shí):實(shí)體對象 (DataSet) 與實(shí)際的數據訪(fǎng)問(wèn)對象 (TableAdapter) 應分開(kāi)。

創(chuàng )建以數據為中心的表單

現在已經(jīng)生成了一個(gè)類(lèi)型化的 DataSet,下面我們要創(chuàng )建一個(gè)顯示這些數據的表單。盡管我不會(huì )介紹 .NET Framework 2.0 和 Visual Studio 2005 中的 WinForm 和數據綁定的所有細節和新功能(要介紹的內容有很多),但這是一個(gè)好機會(huì ),可以了解為了更輕松靈活地創(chuàng )建以數據為中心的功能表單已經(jīng)完成的某些操作。

工具箱中的數據組件

如果您習慣于從工具箱的 Data(數據)選項卡上的標準數據組件開(kāi)始創(chuàng )建以數據為中心的代碼,那么打開(kāi) Visual Studio 2005 后看不到這些標準組件會(huì )讓您有點(diǎn)失望和迷茫。當然,這是“故意的”,Microsoft 要促使我們利用新的類(lèi)型化的 DataSet 和 TableAdapter。如果您非常希望使用舊的、非類(lèi)型化的組件,則可以手動(dòng)將它們添加回工具箱中。強烈建議您不要這樣做,通過(guò)利用新的 TableAdapter 以及局部類(lèi)技術(shù),新的類(lèi)型化的 DataSet 和 TableAdapter 將更容易使用和展開(kāi)。

您可以從 Visual Basic 團隊網(wǎng)絡(luò )日志中了解有關(guān)這些問(wèn)題和其他設計決策(以及做出這些決策的想法)的詳細信息。

尤其應閱讀 Steve Lasker 的兩個(gè)帖子:Why are the Data Components no longer on the Toolbox? 和 Why can‘t I drag from Server Explorer to my form?

在 Visual Studio 設計器中打開(kāi)一個(gè)表單時(shí),Visual Studio 工具箱中將顯示一個(gè)標有您的項目名稱(chēng)的選項卡。將數據源添加到項目中并且至少編譯一次后,此選項卡上將包含您創(chuàng )建的類(lèi)型化的 DataSet 和 TableAdapter。盡管您可以將這些組件拖到表單設計器中,但您通??赡懿粫?huì )這樣做(但是,如果您要使用設計器實(shí)現數據訪(fǎng)問(wèn)組件,這卻是一個(gè)不錯的方法)。您通常會(huì )使用三種不同方法中的一種來(lái)創(chuàng )建以數據為中心的表單。我們先來(lái)詳細介紹第一種方法,這是最簡(jiǎn)單的,可能也是最常用的方法。這就是所謂的“一次拖動(dòng)”數據綁定。

1.雙擊 Solution Explorer(解決方案資源管理器)中的“Form1.vb”,在 Visual Studio 表單設計器中打開(kāi) Form1。

2.在 Data Sources(數據源)窗口中,展開(kāi) Orders 表的節點(diǎn)。

請注意,DataSet 中的每個(gè)表和每個(gè)列都有一個(gè)相關(guān)的圖標。這些圖標表示將表或列拖放到表單中時(shí),用來(lái)綁定到數據的 WinForm 控件的類(lèi)型(或“拖放類(lèi)型”)。通過(guò)選擇一個(gè)項目并從相關(guān)的下拉列表中選擇一個(gè)控件,可以更改控件的類(lèi)型。請注意,下拉列表中包括選項 None(無(wú),表示未顯示任何內容)和 Customize(自定義,表示可以指定任意控件)。

只有當前活動(dòng)的窗口為表單(或組件)設計器時(shí),這些圖標和拖放類(lèi)型列表才可見(jiàn)。否則,您將無(wú)法從 Data Sources(數據源)窗口中拖放控件,這些圖標也會(huì )發(fā)生變化,向您指明這一點(diǎn)。

3.將 Orders 表的控件類(lèi)型從 DataGridView 更改為 Details。這意味著(zhù)當您將整個(gè) Orders 表拖動(dòng)到一個(gè)表單上時(shí),系統將創(chuàng )建一個(gè)逐行顯示詳細信息的表單,而不是創(chuàng )建一個(gè)在一個(gè)網(wǎng)格中顯示所有數據(一次顯示所有行)的表單。對于 Details(詳細信息)視圖,將為每一列添加一個(gè)標簽和一個(gè)控件,控件的類(lèi)型在 Data Sources(數據源)窗口中指定。

4.將 Orders 表從 Data Sources(數據源)窗口拖動(dòng)到設計器中的 Form1 上。

5.選擇最后七 (7) 個(gè)字段(以及它們的標簽),然后將這些字段拖到前七 (7) 個(gè)字段的旁邊,使表單如圖 4 所示。

圖 4:設計器中的 Form1

6.啟動(dòng)應用程序,然后使用表單頂部的工具欄上的導航按鈕逐個(gè)查看記錄,驗證該應用程序能否正常工作。

我們來(lái)看一看將 Data Source 表拖到表單上后,Visual Studio 執行了哪些操作。查看表單下面的組件欄,可以看到它向表單中添加了四個(gè)組件。我們已經(jīng)了解(或許已經(jīng)喜歡上)其中的兩個(gè)組件:NorthwindDataSet 和 OrdersTableAdapter。OrdersTableAdapter 用于使用數據庫中的數據填充 NorthwindDataSet 的 OrdersDataTable。甚至執行此 Fill 操作的一行代碼也已經(jīng)編寫(xiě)并自動(dòng)添加到 Form1 的 Load 事件處理程序中。

Me.OrdersTableAdapter.Fill(Me.NorthwindDataSet.Orders)

用于數據綁定的關(guān)鍵類(lèi)是 BindingSource 類(lèi),它在本例中被明確命名為 OrdersBindingSource。BindingSource(在 Beta 1 中稱(chēng)為 DataConnector)提供將控件綁定到表單所需要的服務(wù)。它在數據源和綁定到該數據源的控件之間提供了一個(gè)非直接層。通過(guò)設置 BindingSource 的 DataSource 和 DataMember 屬性,將 BindingSource 附著(zhù)到一個(gè)數據源上;然后通過(guò)添加到控件的 DataBindings 集合中,將這些控件綁定到 BindingSource。與數據進(jìn)行的所有交互(例如記錄的導航、排序、篩選和編輯)都是通過(guò) BindingSource 完成的。BindingSource 還通過(guò) List、Item 和 Current 屬性允許訪(fǎng)問(wèn)基礎數據。

添加的另一個(gè)組件是 OrdersBindingNavigator。BindingNavigator 類(lèi)是一個(gè)工具欄,它為導航和操作表單上的數據提供了一個(gè)標準的用戶(hù)界面。BindingNavigator(在 Beta 1 中稱(chēng)為 DataNavigator)是一個(gè) ToolStrip 控件,它具有一組預配置的按鈕。它附著(zhù)到作為其數據源的 BindingSource 上,并提供控制導航可用數據的工具欄按鈕。但是,如果您不想控制導航,而是希望響應某些導航事件,則應連接 BindingSource 對象的這些事件。

創(chuàng )建一個(gè)“主表單-詳細信息”表單

現在,我們已經(jīng)創(chuàng )建了一個(gè)可以顯示一個(gè)表中的數據的表單,那么以“主表單-詳細信息”的格式顯示第二個(gè)相關(guān)表中的數據容易(或困難)嗎?只需繼續在 Form1 中執行以下步驟: 1.現在,我們將使用“連接點(diǎn)”數據綁定來(lái)創(chuàng )建表單,并將一個(gè)控件從工具箱中拖放到該表單上,然后將 Data Source(數據源)窗口中的一個(gè)元素拖放到該控件上,將控件和元素連接起來(lái)。

2.從工具箱的 All Windows Forms(所有 Windows 表單)選項卡上選擇 DataGridView 控件。將該控件拖放到 Form1 上,使其占據表單下半部分的大部分空間。

3.返回到 Data Source(數據源)窗口,如圖 5 所示。請注意,Order Details 表實(shí)際上在該窗口中出現兩次。第一次,它作為 NorthwindDataSet 的直接子控件和 Orders 表的同級控件。第二次,它顯示為 Orders 表的子控件,表明它是一個(gè)相關(guān)表。如果要在表單上單獨顯示 Order Details 表,則可以選擇直接位于 NorthwindDataSet 下的 Order Details 表的實(shí)例。但在本例中,我們要顯示與(主)Orders 表相關(guān)的 Order Details 表,因此,我們應選擇顯示直接位于 Orders 表下的 Order Details 表的實(shí)例。

圖 5:Data Source(數據源)窗口中的 Order Details 表

4.選擇 Orders 表下的 Order Details 表,然后將其拖動(dòng)到 Form1 中的 DataGridView 上。

5.請注意,Order_DetailsBindingSource 和 Order_detailsTableAdapter 已被添加到 Form1 的組件欄中。

6.運行應用程序,并使用 BindingNavigator 瀏覽 Orders 表中的記錄,如圖 6 所示。請注意,DataViewGrid 中顯示的 Order Details 記錄將自動(dòng)發(fā)生變化,以便只顯示與當前 Order 記錄相關(guān)的那些記錄。

圖 6:Orders 表中的 BindingNavigator

由于某些原因,“連接點(diǎn)”數據綁定在 Visual Studio 2005 的 2004 年 12 月 CTP 版中是斷開(kāi)的。但是,它在 Visual Studio 2005 以前和以后的版本中都能正確工作。如果您使用的是 12 月的 CTP 版,只需將 Order Details 表(位于 Orders 表下)拖放到 Form1 中。

自定義生成的代碼

在前面我們查看 DataSet 的類(lèi)的代碼時(shí),您可能已經(jīng)注意到了實(shí)際上有兩個(gè) Visual Basic 代碼文件:NorthwindDataSet.Designer.vb 和 NorthwindDataSet.vb。如果沒(méi)有 NorthwindDataSet.vb 文件,請返回到 DataSet 設計器,雙擊該設計器的背景以創(chuàng )建該文件。

這兩個(gè)文件都用來(lái)實(shí)現構成 DataSet 的類(lèi)。存在兩個(gè)文件的原因在于,我們要利用一個(gè)新的、簡(jiǎn)單但很強大的功能,稱(chēng)為局部類(lèi)。局部類(lèi)是一個(gè)編譯器功能,它允許將類(lèi)(或結構)的定義拆分到幾個(gè)聲明中。不同的聲明可以位于不同的源代碼文件中,只要這些聲明都位于相同的程序集和名稱(chēng)空間中就可以。Visual Studio 廣泛使用此功能,將設計器和開(kāi)發(fā)人員為同一個(gè)類(lèi)生成/編寫(xiě)的代碼分開(kāi)。例如,在 Visual Studio 2002/2003 中,表單的代碼可能是該表單的類(lèi)聲明的所有內容,例如:

Public Class Form1
Inherits System.Windows.Forms.Form

該表單的初始化代碼(包括該表單上放置的所有控件)都由 Visual Studio 生成。這段代碼位于 InitComponent () 方法中,默認情況下,出現在名為“Windows 表單設計器生成的代碼”代碼區域中用戶(hù)編寫(xiě)的代碼之前。此區域通常是閉合的,以便最大程度地減少這段代碼對您實(shí)際要編寫(xiě)的代碼造成的混亂和干擾。在 Visual Studio 2005 中,這段代碼造成的干擾更少,因為它包含在一個(gè)名為 Form1.Designer.vb 的完全不同的文件中!同樣,如果您愿意,仍然可以查看該文件的內容:?jiǎn)螕?Solution Explorer(解決方案資源管理器)工具欄上的 Show All Files(顯示所有文件),展開(kāi) Form1.vb 節點(diǎn),然后雙擊 Form1.Designer.vb,使其顯示在代碼編輯器中。文件 Form1.vb 中只包含您作為開(kāi)發(fā)人員為 Form1 類(lèi)編寫(xiě)的代碼。

對于 DataSet 及相關(guān)類(lèi)的代碼,使用局部類(lèi)和不同的文件將設計器代碼和開(kāi)發(fā)人員代碼相分離就變得更加重要。除了更加有序外,這種分離還解決了在 Visual Studio 2002/2003 中使用類(lèi)型化的 DataSet 時(shí)存在的一個(gè)大問(wèn)題。

您經(jīng)常希望對系統自動(dòng)為 DataSet 及其相關(guān)類(lèi)生成的代碼進(jìn)行擴展或添加,例如添加附加屬性或自定義驗證代碼。盡管您仍然可以向生成的代碼中添加這些內容,但當您更改架構并且需要重新生成 DataSet 代碼時(shí),將會(huì )遇到問(wèn)題。在 Visual Studio 2002/2003 中,由于您的代碼只是添加到包含生成的代碼的文件中,因此在重新生成代碼時(shí),您添加的所有附加代碼都將被刪除。由于使用了局部類(lèi),Visual Studio 2005 中不會(huì )再出現此問(wèn)題。新生成的代碼將覆蓋擴展名為 .Designer.vb 的文件中的現有設計器代碼,但是 .vb 文件中由開(kāi)發(fā)人員編寫(xiě)的代碼則保持不變。

使用局部類(lèi)擴展 DataSet 功能的方法之一就是添加自定義驗證代碼。這是向生成的類(lèi)型化的 DataSet 中添加某些應用程序特定的邏輯的機會(huì )。我們向 NorthwindDataSet 中的 Orders 表的新行中添加自定義驗證和初始化。添加新行時(shí),需要檢驗傳遞的郵政編碼值是否確實(shí)屬于傳遞的城市。如果不是,就要將 ShipPostalCode 字段的值更改為 Invalid。如果提供的郵政編碼確實(shí)屬于提供的城市,則假設有一個(gè)函數實(shí)現返回 True,如下所示:

Function IsPostalCodeInCity (ByVal PostalCode as string, ByVal City as string) As Boolean

我們可以通過(guò)執行以下操作將該項檢查添加到我們的 NorthwindDataSet 中:

1.在 Data Sources(數據源)窗口的工具欄中選擇 Edit DataSet with Designer(使用設計器編輯 DataSet),以打開(kāi) DataSet 設計器。

2.雙擊設計器背景中的空白區域。將在代碼編輯器中打開(kāi) NorthwindDataSet.vb 文件。

3.輸入以下代碼而不是默認代碼:

Partial Public Class NorthwindDataSet
Partial Class OrdersDataTable
Protected Sub ValidateNewRow(ByVal sender As Object, _
ByVal e As System.Data.DataTableNewRowEventArgs) _
Handles Me.TableNewRow
‘ 創(chuàng )建行的類(lèi)型化實(shí)例
‘ 這可以幫助我們避免將代碼放在引號中,
‘ 例如 e.Row("ShipPostalCode")
Dim ordersRow As NorthwindDataSet.OrdersRow
ordersRow = e.Row
If Not ordersRow.IsShipPostalCodeNull And _
Not ordersRow.IsShipCityNull Then
If Not IsPostalCodeInCity(ordersRow.ShipPostalCode, _
ordersRow.ShipCity) Then
‘ 設置 ShipPostalCode 的值
ordersRow.ShipPostalCode = "Invalid"
‘ 通常,更改用戶(hù)數據是不好的用戶(hù)體驗
‘ 因此使用 ErrorProvider 指明錯誤
‘ 這里我們介紹了兩種方法
ordersRow.SetColumnError( _
ShipPostalCodeColumn.ColumnName, "Invalid Postal Code")
Else
‘ 當值為 valid 時(shí),我們總是需要重置錯誤
ordersRow.SetColumnError( _
ShipPostalCodeColumn.ColumnName, String.Empty)
End If
End If
End Sub
End Class
Private Shared Function IsPostalCodeInCity(ByVal postalCode As String, _
ByVal city As String) As Boolean
‘ 這是一個(gè)存根,只是為了驗證功能
If city = "Rio de Janeiro" Then
Return False
Else
Return True
End If
End Function
End Class

請注意,DataSet 的所有相關(guān)類(lèi)(例如 OrdersDataTable)都是作為 DataSet 中的嵌套類(lèi)實(shí)現的。前面代碼中顯示的局部類(lèi)聲明反映了這種實(shí)現。

為了獲得錯誤提供程序指示的錯誤,除了將郵政編碼值更改為 Invalid 外(也可以不更改),還需執行以下操作:

1.將 Error Provider 控件從工具箱拖到 Form1 上,將其放在 Ship Postal Code 文本框的右側。

2.在 Error Provider 的屬性窗口中,將 DataSource 屬性設置為 OrdersBindingSource。 運行應用程序,然后導航到城市 Rio de Janeiro 的記錄,查看當前運行的驗證代碼,如圖 7 所示。

圖 7:Error Provider 控件

這個(gè)示例只是為了說(shuō)明如何輕松地擴展 Visual Studio 自動(dòng)生成的類(lèi)型化的 DataSet 及相關(guān)類(lèi)的功能。您可能還需要向生成的類(lèi)中添加其他方法和屬性。在設計應用程序和使用 DataSet 時(shí),您會(huì )想到更多的可能性。需要記住的關(guān)鍵點(diǎn)是,由于 Visual Studio 2005 中使用了局部類(lèi),您編寫(xiě)的代碼位于一個(gè)單獨的文件中,重新生成 DataSet 類(lèi)時(shí)不會(huì )受到影響。

小結

使用 Visual Studio 2005 生成的類(lèi)型化的 DataSet 比以往更容易、更靈活。DataSet設計器為定義 DataSet 提供了一個(gè)更容易、更自然的工具。新的 TableAdapter 類(lèi)(可以在 DataSet設計器中進(jìn)行配置)提供了一個(gè)集中的機制,使您可以對特定的數據表輕松地維護和執行多個(gè)不同的查詢(xún)和命令。使用局部類(lèi)編譯器功能使設計器生成的代碼與開(kāi)發(fā)人員編寫(xiě)的代碼完全分離,重新生成 DataSet 類(lèi)時(shí)將不會(huì )影響為了擴展這些類(lèi)而編寫(xiě)的任何自定義代碼。最后,新的 .NET 數據綁定類(lèi)和機制與 Visual Studio 2005 提供的工具相結合,使開(kāi)發(fā)以數據為中心的應用程序變得更容易、更快捷。

感謝 Steve Lasker 以及 Microsoft 的 Alan Griver 和 Pablo Castro 為本文的誕生提供的幫助。

關(guān)于作者

Jackie Goldstein 是 Renaissance Computer Systems的負責人,該公司專(zhuān)門(mén)從事 Microsoft 工具和技術(shù)的咨詢(xún)、培訓和開(kāi)發(fā)。Jackie 是 Microsoft 的一位區域總監,還是Israel Visual Basic User Group 的創(chuàng )始人以及國際開(kāi)發(fā)人員事件(包括 TechEd、VSLive!、Developer Days 和 Microsoft PDC)的專(zhuān)題演講者。他還是《Database Access with Visual Basic.NET》(Addison-Wesley,ISBN 0-67232-3435)一書(shū)的作者以及 INETA Speakers Bureau 的成員。2003 年 12月,Microsoft 授予了 Jackie“.NET 軟件傳奇人物”的稱(chēng)號!

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
VS2005和ASP.NET2.0中使用強類(lèi)型數據
創(chuàng )建數據訪(fǎng)問(wèn)層VB
C#
11.2 向DataSet對象中填充數據
TableAdapter、Dataset與BindingSource的關(guān)系
Coding4Fun: 一個(gè)簡(jiǎn)單的 RSS 源
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久