国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

.NET 2.0里使用強類型數據創建多層應用

2019-11-17 04:41:03
字體:
來源:轉載
供稿:網友

  .NET 2.0正式版的正式發布,對我們程序開發人員來說無疑是一件很大的喜事,已經很多的人開始了解并使用.NET 2.0。Visual Studio 2005 的一些新的增強功能和ADO.NET 2.0的新特性讓我們開發高可伸縮的多層數據庫應用程序更加簡單和快捷。
本文將帶領大家使用Visual Studio 2005來創建一個N層數據庫應用的示例,并介紹一些NET 2.0和 Visual Studio 2005相關的知識。

  在.NET 1.1下就可以使用強類型數據集,可是在Visual Studio 2003里開發起來還是有一些不方便,在Visual Studio 2005里對DataSet的設計視圖做了很大的改進,因為ADO.NET 2.0增加了TableAdapter對象,所以現在也可以在DataSet設計視圖里添加DataTable的表適配器。以前的typedDataSets只是一些數據實體(啞對象,只有屬性的類)的集合,并不能很方便的自我治理持久化,以及數據完整性驗證等?,F在可以很方便的實現這些。

  我們今天示范的這個例子是做一個顯示消費者列表,并可以查看每個消費者訂單細目的一個小程序。先用Visual Studio 2005創建一個typedDatasetSample.lib的類庫項目,這個類庫項目呢,我們主要保存一些強類型數據集,我們給這些強類型數據集加上一些自我持久的方法以及一些業務邏輯。然后呢我們就可以在構建桌面程序或者Web程序的時候使用它了,它就相當于我們的業務邏輯層,以后也許是通過Remoting來發布,也許通過Web服務發布,也許直接拷貝DLL來發布,一般把它放在application Server上,以方便你的前臺Smart Client,asp.net,以及移動應用來實例并使用。

  這是一個企業應用的核心,所以我們先構建它,然后就可以用Composite UI Application Block (CAB)來創建Smart Client界面,用ASP.net 2.0和微軟的EnterPRiseLibrary November 2005 CTP創建Web應用界面和移動應用界面。Asp.net 2.0加入了WebPart,MastPage,ObjectDataSource這幾個控件大大簡化了創建Web界面應用的過程,大大提高了開發者的用戶體驗(個人感覺是這樣的,使用起來非常的舒適)。Asp.Net 2.0的設備自適應功能,設備過濾器讓開發者構建移動應用和構建普通Web應用統一了起來,寫一段程序可能不用任何修改就即可以在Internet EXPlorer上顯示,也可以在Inernet Explorer for Pocket PC上顯示,也可以在Openwave WAP Emulator上顯示,新的MultiView,View,Pager控件也對你快速開發移動應用提供了很大的幫助。我推薦大家盡量使用微軟推薦的工具和技術來實現自己的企業應用,究竟微軟還是更值得信賴的。

  項目建好了,先刪掉默認的Class1.cs,右鍵單擊解決方案選擇【Add】【New Item】添加一個名為Customer.xsd的數據集。Ctrl+Alt+S打開Server Explorer,右鍵單擊【Data Connections】選擇【Add Connection】,在打開的窗口里的【Server Name】輸入框里輸入“localhost/sqlexpress”,選中【Use Windows Authentication】單選框,在【Select or enter a database name】選擇框里選擇“Northwind”數據庫,點擊【Test Connection】,測試成功后單擊【OK】按鈕。這樣我們就新建了一個數據連接。

  在Server Explorer里展看依次展開localhost/sqlexpress節點,Tables節點,并把Customers表拖到數據集設計視圖上。我們可以看到Visual Studio自動給我們添加了一個Customers的強類型數據集和一個叫CustomersTableAdapter的表適配器,并給這個表適配器自動添加了一個Fill的方法,這個方法是用來填充Customers數據集的。細心的朋友也許會發現在properties文件夾下添加了一個Settings.settings的文件,雙擊它可以看到里面保存了一個數據庫連接字符串,這也是.NET 2.0的新特性,以后還可以以編程的方式來訪問它,假如感愛好也可以看看它自動生成的Settings.Designer.cs文件。

  右鍵在CustomersTableAdapter最上面單擊并選擇【Add Query】,選擇【Use SQL statements】,點擊【next】按鈕這個選項是我們直接編寫SQL語句,下面兩個選項分別是創建一個新的存儲過程或者使用一個新的存儲過程。下一個界面是讓你選擇查詢的類型,是插入操作還是刪除操作還是更新操作等,我們先創建一個插入操作,選擇【Insert】進入下一步,點擊【Query Bulider】來可視化的生成SQL語句,這個查詢生成器我想大家都很熟悉吧,比我的wawaCodePro要靈活多了,你可以很方便的創建出多表連接的復雜查詢語句,以可以手動創建一些定制的Insert,Update等SQL語句,大家不要以為自己手工寫復雜的SQL語句是很酷的事情,其實這個會使用這個查詢生成器才厲害呢,access里就有的。創建完語句后可以點擊下面的【Excute Quert】按鈕來測試你的語句是否正確,因為我們是一個需要參數的SQL語句,所以會彈出【Query parameters】窗口來讓你輸入參數。最后我們生成的語句如下。


INSERT INTO Customers
(CustomerID, CompanyName, ContactName, ContactTitle, Address, City, Region, PostalCode, Country, Phone, Fax)
VALUES (@CustomerID,@CompanyName,@ContactName,@ContactTitle,@Address,@City,@Region,@PostalCode,@Country,@Phone,@Fax)
  點擊下一步鍵入自定義的方法名字“NewCustomer”,點【next】【finish】。假如要修改已經生成的查詢,可以在要修改的查詢上右鍵選擇【Configure】以向導的方式來重新生成查詢,或者選擇相應查詢,在【properties】面板里設置它的屬性。分別以相同的方式添加刪除和修改的查詢。刪除的語句如下:

DELETE FROM Customers WHERE (CustomerID = @Original_CustomerID)
  刪除的方法鍵入“DeleteCustomerByCustomerID”。

  修改的語句如下:

UPDATE Customers

SET CompanyName = @CompanyName, ContactName = @ContactName, ContactTitle = @ContactTitle, Address = @Address, City = @City,

Region = @Region, PostalCode = @PostalCode, Country = @Country, Phone = @Phone, Fax = @Fax

WHERE (CustomerID = @Original_CustomerID)
  修改的方法鍵入“UpdateCustomerByCustomerID”。
  大家有愛好可以看看自動在Customers.Designer.cs文件里生成的代碼,一切的一切Visual Studio都給你生成了。
定位到NewCustomer()方法可以看到它有個[System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Insert, false)]屬性,這是設置讓ObjectDataSource,BindSource等數據源控件自動綁定相應操作的屬性,估計用的是一種Ioc(控制反轉)的機制來實現的,你在設置ObjectDataSource的時候它的插入方法會自動綁定到這個方法上,一會兒就會看到。

  以上我們把顯示消費者列表,以及消費者的修改,刪除,添加等持久化操作代碼生成了,我們還沒有寫一行代碼,包括SQL語句哦。我們的數據實體(強類型數據集的ROW)雖然是啞對象,但是我們的表適配器可以以托管的形式來對這些實體進行CRUD持久化操作,類似于CMP(容器托管持久化,這里的表適配器就相當于容器)模式,然后我再告訴大家如何給數據實體添加自定義業務邏輯的方法(也許一個方法不能算是一個Case,但我感覺獲取消費者的訂單至少是一個Action吧)。當然了,我這里告訴大家的只是一種緊耦合的方法,假如你想設計靈活度比較高的高度可伸縮的應用,盡量使用一些Interface,Service,Event,properties(自定義屬性)等技術來實現數據實體和數據實體具體操作的松散耦合,這樣就可以做到我在UI層只引用Customer這個業務實體,然后調用Customer.GetOrderDetails()方法的時候,也許是在本地DLL里實現,也許是在用Rmorting方式連接到Application Server來實現,也許是通過一個叫做GetOrderDetailsByCustomerID的Web服務來實現的。

  現在我們來做一個訂單細目的業務實體以及獲取某個消費者訂單細目的操作,因為Northwind數據庫里沒有這么一個直接的表來直觀的顯示訂單細目,Orders只是一個交叉引用表,Order Details表也是一個交叉引用表,而我們的訂單細目要顯示訂單號,消費者名稱,產品名稱,購買數量,單價,雇員名稱等信息,而這些信息分布在多個表中,我們不能簡單的把一個表拖放到數據集設計視圖來生成相應的業務實體和表適配器。我們可以在數據集設計視圖里的空白處右鍵選擇【Add TableAdapter】,然后按向導在【Quert Builder】里把Customers,Orders,Order Details,ProcUCts,Employees五個表拖到數據表欄上,然后他們之間的外鍵關系會自動的可視化的指定,然后分別用鼠標選擇幾個表的某些字段,最后生成語句如下。

SELECT Customers.CustomerID, Customers.ContactName, [Order Details].UnitPrice, [Order Details].Quantity, Products.ProductName, Orders.OrderID,

Orders.OrderDate, Employees.FirstName + Employees.LastName AS fullname

FROM Customers INNER JOIN

Orders ON Customers.CustomerID = Orders.CustomerID INNER JOIN

[Order Details] ON Orders.OrderID = [Order Details].OrderID INNER JOIN

Products ON [Order Details].ProductID = Products.ProductID INNER JOIN

Employees ON Orders.EmployeeID = Employees.EmployeeID

WHERE (Customers.CustomerID = @CustomerID)

ORDER BY Customers.CustomerID DESC
  方法名修改成“GetOrderDetailsByCustomerID”,并把生成的強類型表重命名為OrderDetails。

  另外在表適配器向導里有一個【advert】按鈕,點擊打開后可以設置本查詢是否支持樂觀并發鎖定等處理,因為在一個多用戶的數據應用里進行刪除和修改操作的時候要考慮并發問題的,這個是個很棘手的問題,Visual Studio也幫我們解決了(具體原理我還不太清楚,我沒有具體研究數據集自動生成的代碼,一般是用時間戳列或者 一長串where子句來處理并發的。)

  目前為止,我們仍然一行代碼也沒有寫,不過現在要寫一些了。雙擊空白處,打開Customers.cs文件??梢钥吹紺ustomer類有個partial修飾符,這也是.NET 2.0的新特性,因為Customer這個類一半在Customer.Desinger.cs里,而另一半分布在Customer.cs里,你重新修改了表適配器,會自動同步Customer.Desinger.cs里代碼,而你自己寫在Customer.cs里的代碼不會給你覆蓋,看來.NET 2.0的新特性考慮還是很體貼的。以前我們只能由代碼生成器生成一個基類,然后手工把自定義代碼寫到一個子類里,以防止代碼生成器重新生成代碼的時候把你自己寫的代碼覆蓋掉,對框架和架構感愛好的朋友也許看過《.NET企業應用高級編程》里的那個WEO體系結構和ObjectBuilder代碼生成工具。我們可以在Customer類里添加OnColumnChanging,OnRowChanging等方法來進行數據完整性的驗證,詳見MSDN,這里不做重點講解。

  因為默認生成的GetOrderDetails方法是一個非靜態方法,使用起來有些不方便,為了便于使用,我們在Customer.cs里加入一下語句。用一個靜態方法來重寫(我也不知道是重載還是重寫了)非靜態方法GetOrderDetails。


partial class CustomersTableAdapter
{
 public static Customer.OrderDetailsDataTable GetOrderDetails(string CustomerID)
 {
  typedDatasetSample.lib.CustomerTableAdapters.OrderDetailsTableAdapter o = new typedDatasetSample.lib.CustomerTableAdapters.OrderDetailsTableAdapter();
  return o.GetOrderDetailsByCustomerID(CustomerID);
 }
}
  因為默認生成的業務實體類是CustomersRow,我們來改進它,給它加一個自定義方法。(但是我感覺CustomersRow這個名字不好聽,假如做一個它的子類叫CustomersEntity的話,可是子類又不能引用父類,所以這個問題我也不知道如何解決,所以先用分割類來添加一個新方法,而不是繼續CustomersRow類然后給子類添加一個新方法)

partial class Customer
{
 partial class CustomersRow
 {
  public Customer.OrderDetailsDataTable GetOrderDetails()
  {
   return CustomersTableAdapter.GetOrderDetails(this.CustomerID);
  }
 }
}
  好了,這個類庫就做到這里了,你當然可以添加其它一些業務邏輯,關閉這個項目?,F在我們先創建一個typedDatasetSample.Web的網站。在解決方案里點擊右鍵選擇【Existing project】把剛才的數據集類庫添加到網站解決方案里。然后在網站項目里右鍵選擇【Add Reference】把typedDatasetSample.lib項目引用一下。

  打開Default.aspx的設計視圖,在ToolBox里拖放一個DetailView控件進來,重命名為CustomerDetailsView。點擊右上角的小三角Choose Data Source,選擇new data source,選擇【object】就是添加一個ObjectDataSource,命名為CustomerObjectDataSource。點擊【next】按鈕后【choose your business object】里選擇CustomersTableAdapter,下一步后選擇CRUD操作的映射方法,前面我們說過一些方法加上[System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Insert, false)]屬性就會自動在這里綁定,所以我們直接在這里設置一下就行了。因為在系統自動生成了一些CRUD方法,我們不用它們,我們用我們的自定義查詢和方法,比如說NewCustomer()方法,而不是默認的Insert()方法,因為這個不直觀。然后把Enable Paging,Instering,Editing,Deleteing的勾打上。因為Customers表里數據太多,我們把ObjectDataSource的FilterExpression屬性設置成“ContactTitle='Owner'”以減少檢索的數據,其實CustomerObjectDataSource就相當于一個實際的數據源,它有好多模擬數據源的特性,大家可以具體看看。在asp.net 2.0里可以讓你不知不覺就使用了MVC模式。

  好了,我們又沒有寫一行代碼,按F5運行一下??匆幌绿砑?,刪除,修改,瀏覽是不是都能用了呀,就是這么簡單。其實假如我們把添加,刪除,修改等業務邏輯用Oracle實現一遍,其實我們的asp.net程序幾乎不用修改代碼,只重新換一下objectdatasource就可以了。

  下面拖放一個GridView控件,命名為OrderDetailGridView。選中CustomerDetailsView然后在屬性窗口,點擊屬性表頭的閃電按鈕,所有可用的時間就顯示了,雙擊DataBound會在Default.cs文件里添加CustomerDetailsView_DataBound方法,這個事件是在Detail控件數據綁定的時候觸發的,修改成以下的代碼。

protected void CustomerDetailsView_DataBound(object sender, EventArgs e)
{
 //獲取當前的數據綁定項并強制轉換為DataRowView類型
 DataRowView drv = (DataRowView)CustomerDetailsView.DataItem;
 //假如當前是添加新項目狀態的話,不會獲取DataRowView引用,所以要加一個IF判定。
 if (drv != null)
 {
  //獲取row并強制轉換成CustomerEntity業務實體類

  typedDatasetSample.lib.Customer.CustomersRow customer =(typedDatasetSample.lib.Customer.CustomersRow)drv.Row;

  //運行業務實體類的一個自定義方法并把返回結果作為GridView的數據源

  OrderDetailGridView.DataSource = customer.GetOrderDetails();

  //綁定GridView

  OrderDetailGridView.DataBind();
}
  F5運行一下,看看GridView是不是自動綁定了,翻頁看看GridView是不是顯示每個客戶的訂單細目呢。

  Asp.net的應用就開發完了,下面我們來開發一個桌面程序。關閉網站解決方案,創建一個typedDatasetSample.Win的windows應用程序,然后把typedDatasetSample.lib項目包含進去,并引用到typedDatasetSample.Win項目里。然后把一個DataGridView拖進來命名為customersDataGridView,并把Dock屬性設置為fill,讓它能填布滿窗體。再拖一個BindSource進來命名為customersBindingSource,再拖一個CustomerTableAdapter進來并命名為ta,Visual Studio 2005支持幾個簡單從重構手段,其中包括重命名,所以你重命名控件名稱的時候,它會自動幫你修改一些相關的代碼,比較智能的。然后選擇窗體,在事件窗格里雙擊Load事件,鍵入如下代碼。


private void Form1_Load(object sender, EventArgs e)
{
 this.customersBindingSource.DataSource = ta.GetData();
 this.customersBindingSource.Filter = "ContactTitle='Owner'";
 this.customersBindingSource.Sort = "Country DESC, Address ASC";
 this.customersDataGridView.DataSource = customersBindingSource;
}
  好了,按F5運行以下,看看DataGridView是不是被數據填充了呢。因為我個人對桌面程序不是太感愛好,也沒有很多經驗,所以只演示一個數據填充的業務邏輯,其它的持久操作以及自定義操作,對WinForm感愛好的朋友可以自己做一做,我這里是以寫代碼的方式來完成的數據填充,其實也可以以可視化的操作來完成數據網格的填充。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 汉寿县| 饶平县| 平陆县| 永寿县| 普安县| 两当县| 福泉市| 剑阁县| 靖州| 文登市| 昂仁县| 千阳县| 工布江达县| 湖口县| 淮滨县| 宁河县| 文成县| 崇仁县| 杨浦区| 安溪县| 通道| 黑山县| 黔西县| 莲花县| 宜川县| 高雄市| 清远市| 五寨县| 应用必备| 清原| 高清| 玉屏| 南木林县| 宁远县| 建德市| 新竹市| 祁连县| 汝阳县| 琼海市| 孟连| 绥宁县|