c三層架構(gòu)講稿和學(xué)生選課管理完整(整理)_第1頁
c三層架構(gòu)講稿和學(xué)生選課管理完整(整理)_第2頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、模塊概述 1本模塊工作任務(wù) 2本模塊學(xué)習(xí)目標(biāo) 2任務(wù) 3-1 :三層架構(gòu)劃分 2 效果與描述 2 相關(guān)知識與技能 23-1-1 三層架構(gòu)的劃分原理 23-1-2 ORM (對象關(guān)系映射)3 任務(wù)的設(shè)計思路 4 任務(wù)的實施 4 舉一反三 4任務(wù) 3-2:數(shù)據(jù)訪問層 5效果與描述 5 相關(guān)知識與技能 53-2-1 泛型集合的定義與使用113-2-2 數(shù)據(jù)訪問層的設(shè)計思路5任務(wù)的設(shè)計思路 錯誤!未定義書簽。 任務(wù)的實施 6 舉一反三 8任務(wù) 3-3:業(yè)務(wù)邏輯層的實現(xiàn)8效果與描述 8 相關(guān)知識與技能 93-3-1 業(yè)務(wù)邏輯層的設(shè)計思路 9 任務(wù)的設(shè)計思路 錯誤!未定義書簽。 任務(wù)的實施 錯誤!未定義書

2、簽。 舉一反三 14任務(wù) 3-4:表示層的實現(xiàn) 錯誤!未定義書簽。 效果與描述 錯誤!未定義書簽。 相關(guān)知識與技能 錯誤!未定義書簽。3-4-1 界面層的設(shè)計思路 錯誤!未定義書簽。 任務(wù)的設(shè)計思路 錯誤!未定義書簽。 任務(wù)的實施 錯誤!未定義書簽。 舉一反三 錯誤!未定義書簽。本模塊小結(jié) 14本模塊作業(yè) 15模塊三 基于3層架構(gòu)的課程管理模塊概述在上個模塊:單層的課程管理中,已實現(xiàn)數(shù)據(jù)庫的連接、命令的執(zhí)行、不同數(shù)據(jù)集的 應(yīng)用,并利用應(yīng)用程序配置文件,和自定義的數(shù)據(jù)操作類,對程序進(jìn)行了優(yōu)化重構(gòu)。實現(xiàn) 一個管理信息系統(tǒng)所需要的技術(shù),似乎已全了。 但是,如果應(yīng)用程序的功能需求不是這么簡單,而是有非

3、常復(fù)雜的流程。那么,如果按照上個模塊的做法,在最后的重構(gòu)中設(shè)計了一些功能實現(xiàn)方法,并且在同一層調(diào)用,界面層 的代碼就會很長而無序。并且,一旦用戶需求改變,則對這么長的代碼進(jìn)行重寫,是不可 行的。這種做法對于大型的軟件是不能承受的。因此,目前通用的做法是:將應(yīng)用程序的實現(xiàn)分布在從底向高的三個層。數(shù)據(jù)訪問層實現(xiàn) 對數(shù)據(jù)庫記錄的操作,這對于特定DBMS 是固定的,不需更改的;業(yè)務(wù)邏輯層利用數(shù)據(jù)訪問層實現(xiàn)業(yè)務(wù)邏輯,這層是關(guān)鍵,如果用戶的業(yè)務(wù)需求改了,可以在這層中修改,因為這 層有很多獨(dú)立的方法,而且,改某個功能不會影響到別的功能,這種改動就比較科學(xué);界 面層調(diào)用業(yè)務(wù)邏輯層實現(xiàn)用戶的功能,只要業(yè)務(wù)邏輯層

4、有這個功能,就可以調(diào)用,界面層 只需提供輸入輸出和提示等。這就是基于3 層架構(gòu)的應(yīng)用程序體系結(jié)構(gòu),是目前最通用的架構(gòu)模式。本模塊工作任務(wù)任務(wù) 3-1:三層架構(gòu)劃分任務(wù) 3-2:數(shù)據(jù)訪問層的實現(xiàn)任務(wù) 3-3:業(yè)務(wù)邏輯層的實現(xiàn)任務(wù) 3-4:表示層的實現(xiàn)本模塊學(xué)習(xí)目標(biāo)1、掌握三層架構(gòu)的劃分原理2、掌握各層的設(shè)計思路,和層之間的調(diào)用關(guān)系3、利用三層架構(gòu)實現(xiàn)對課程管理模塊的重構(gòu)4、鞏固 OOP 的基本概念和 OOP 的編程思路任務(wù)3-1:三層架構(gòu)劃分效果與描述圖 3.1 包含多個工程的 3 層架構(gòu)解決方案本任務(wù)要求學(xué)生能夠?qū)⒃瓉淼闹挥?1 個工程的課程管理模塊,重構(gòu)為 工程的 3 層架構(gòu)的模塊,并進(jìn)行恰

5、當(dāng)?shù)某跏蓟阅軐崿F(xiàn)課程記錄的添加、 瀏 此過程中理解3層架構(gòu)的劃分原理,各層的任務(wù),本任務(wù)的業(yè)務(wù)流程:圖 3.2 單層轉(zhuǎn)化為3層架構(gòu)的業(yè)務(wù)流 相關(guān)知識與技能3-1-1 三層架構(gòu)的劃分原理 三層架構(gòu)的劃分如下圖:圖 3.3 三層架構(gòu)原理圖1、各層的任務(wù)數(shù)據(jù)訪問層:使用 ADO.NET 中的數(shù)據(jù)操作類,為數(shù)據(jù)庫中的每個表,設(shè)計 1 個數(shù)據(jù)訪 問類。類中實現(xiàn):記錄的插入、刪除、單條記錄的查詢、記錄集的查詢、單條記錄的有無 判斷等基本的數(shù)據(jù)操作方法。對于一般的管理信息軟件,此層的設(shè)計是類似的,包含的方 法也基本相同。此層的任務(wù)是:封裝每個數(shù)據(jù)表的基本記錄操作,為實現(xiàn)業(yè)務(wù)邏輯提供數(shù) 據(jù)庫訪問基礎(chǔ)。業(yè)務(wù)

6、邏輯層:為用戶的每個功能模塊,設(shè)計1 個業(yè)務(wù)邏輯類,此時,需要利用相關(guān)的5 個t 間的調(diào)系業(yè)務(wù)邏輯層數(shù)據(jù)訪問層數(shù)據(jù)訪問層類中,記錄操作方法的特定集合,來實現(xiàn)每個邏輯功能。界面層:根據(jù)用戶的具體需求,為每個功能模塊,部署輸入控件、操作控件和輸出控 件,并調(diào)用業(yè)務(wù)邏輯層中類的方法實現(xiàn)功能。2、 層之間的調(diào)用關(guān)系 數(shù)據(jù)訪問層的類,直接訪問數(shù)據(jù)庫,實現(xiàn)基本記錄操作。 業(yè)務(wù)邏輯層的類,調(diào)用相關(guān)的數(shù)據(jù)訪問類,實現(xiàn)用戶所需功能。 界面層:部署控件后,調(diào)用業(yè)務(wù)邏輯層的類,實現(xiàn)功能。將應(yīng)用程序的功能分層后,對于固定的DBMS,數(shù)據(jù)訪問層基本可以不變,一旦用戶的需求改變,首先修改業(yè)務(wù)邏輯層,界面層稍做改動即可。這

7、種做法使程序的可復(fù)用性、 可修改性,都得到了很好的改善,大大提高了軟件工程的效率。3-1-2 ORM (對象關(guān)系映射)在圖 3.1 中看到,除了界面層、業(yè)務(wù)邏輯層和數(shù)據(jù)訪問層之外,還有2 個工程。其中, Common 工程中一般放的是公用文件,如數(shù)據(jù)操作類 DBHelper 等,被數(shù)據(jù)訪問層的類 調(diào)用,其必要性在上個模塊已述。 Modal 工程中存放的是實體類。所謂的對象關(guān)系映射Object Relational Mapping,簡稱 ORM,是為了解決面向?qū)ο蟮念?,與關(guān)系數(shù)據(jù)庫的表之間,存在的不匹配的現(xiàn)象,通過使用描述對象和關(guān)系之間映射的 元數(shù)據(jù),在程序中的類對象,與關(guān)系數(shù)據(jù)庫的表之間建立持

8、久的關(guān)系,用于在程序中描述 數(shù)據(jù)庫表。本質(zhì)上就是將數(shù)據(jù)從一種形式轉(zhuǎn)換到另外一種形式。ORM 是一個廣義的概念,適應(yīng)于關(guān)系數(shù)據(jù)庫與應(yīng)用程序之間的各類數(shù)據(jù)轉(zhuǎn)換,目前有 許多自動轉(zhuǎn)換工具可用,如 codesmith 等。在本教材中,利用手工書寫代碼的形式,實現(xiàn) ORM。如對于學(xué)生選課管理系統(tǒng)數(shù)據(jù)庫中的課程表course,其設(shè)計視圖如下:圖 3.4 Course 表設(shè)計視圖 可以這樣設(shè)計類來描述它:publicclass Course privatestring courseId。publicstring CourseIdget return courseId。 set courseId = valu

9、e。 privatestringcourseName。publicstring CourseName get return courseName。 set courseName = value。 privateint courseCredit。publicint CourseCreditget return courseCredit。 set courseCredit = value。public Course() public Course( string courseId, string courseName, int courseCredit)this .courseId = cours

10、eId。this .courseName = courseName。this .courseCredit = courseCredit。將表中的每個字段抽取為類的字段(注意類型匹配),并封裝成屬性,設(shè)計構(gòu)造函 數(shù),來將表抽取為類。這種類就稱為實體類。這個抽取過程稱為對象關(guān)系映射ORM。在 Modal 工程中,為數(shù)據(jù)庫的每個表,都設(shè)計一個相應(yīng)的實體類,這樣,就相當(dāng)于對 每個表實體,在 .NET 程序中,都可以通過類對象來應(yīng)用。在上面介紹的3 層中,通常都會用到實體類對象。綜上所述,這 5 個工程之間的關(guān)系是這樣的:圖 3.5 三層架構(gòu)中 5 個工程之間的關(guān)系圖 任務(wù)的設(shè)計思路1、在上個模塊基于單

11、層的課程管理的基礎(chǔ)上,將原有的WINDOWS 窗體應(yīng)用程序的工程,設(shè)置為界面層,改名為UI,界面層的控件部署不用改變,并設(shè)置為啟動工程;2、 在解決方案中添加業(yè)務(wù)邏輯層工程BLL 數(shù)據(jù)訪問層工程DAL、Common 工程、Modal 工程,他們都是類庫型的工程;3、將 DBHelepr 類移到 Common 工程中;4、在 Modal 工程中,為學(xué)生選課管理系統(tǒng)的每個表,設(shè)計對應(yīng)的實體類。5、設(shè)置好引用關(guān)系后,運(yùn)行,可實現(xiàn)課程記錄的添加和瀏覽。注意:此時, 3 層結(jié)構(gòu)雖已架設(shè)好,運(yùn)行也可實現(xiàn)課程管理的記錄添加和瀏覽功能。 但是運(yùn)行的仍是界面層代碼,其余層的代碼尚未設(shè)計。任務(wù)的實施1、 在原來的

12、版本中,用 1 個 WINDOWS 窗體應(yīng)用工程就實現(xiàn)了課程管理,在3 層架構(gòu)體系中,當(dāng)然,這個工程就是界面層。首先,把原有的工程改名為UI,右擊此工程,改名即可。然后,右擊解決方案,選擇“設(shè)置啟動工程”,即可將界面層工程設(shè)置為啟動工程。2、 右擊解決方案,分別生成4 個新的工程,這些工程均是類庫工程,按照慣例,數(shù)據(jù)訪問層工程起名為 DAL,業(yè)務(wù)邏輯層工程起名為BLL,另外 2 個工程起名為 Common 和Modal。3、 右擊 Common,選擇添加”里的現(xiàn)有項”,將DBHelpe 啖添加入此工程。右擊UI 下原有的 DBHelper 類文件,選擇從工程中排除”。就實現(xiàn)了將DBHelep

13、啖移到 Common工程中。將命名空間改為 BFCourse.Common,其中 BFCourse 為解決方案名。以后每個工程中 的每個文件,都需要在前面加上解決方案名,這樣,就都處于同一個命名空間BFCourse。4、在 Modal 工程中,選擇添加新建項,參考課程表的抽取方法,為學(xué)生選課管理系 統(tǒng)的每個表,設(shè)計對應(yīng)的實體類。同理,命名空間改為 BFCourse.Modal。5、 此時,界面層代碼會顯示 DBHelper 找不到,因為移到了 Common 工程。所以,必 須在界面層工程 UI 中添加對 Common 工程的引用。然后,整個系統(tǒng)就可以運(yùn)行了。當(dāng) 然,雖然形式是 3 層的,但實際

14、運(yùn)行的是 UI 和 Common 中的代碼。舉一反三1、把選課系統(tǒng)數(shù)據(jù)庫的另外3 張表,學(xué)生表、選課表和用戶表,都進(jìn)行對象關(guān)系映射,為其生成實體類。2、在包含 5 個工程的 3 層架構(gòu)的系統(tǒng)中,為 DAL、BLL 工程添加類文件,只需添加空 文件,但命名方式按各層的功能需求設(shè)計,將所有需要的類文件添加齊全。任務(wù)3-2:課程添加的3層實現(xiàn)效果與描述效果圖仍然如圖 2.1 所示,實現(xiàn)課程記錄的添加。但需要用3 層的技術(shù)來實現(xiàn)。首先,回顧一下,記錄添加的業(yè)務(wù)流程,如圖 2.14 所示。要判斷輸入的完整性;然后 判斷輸入的課程號主鍵在數(shù)據(jù)庫中是否已有;若無,則插入記錄到數(shù)據(jù)庫中。然后,根據(jù)業(yè)務(wù)需求,從

15、底到高來設(shè)計每層。單純的判斷記錄有無、單純的記錄添加 操作,就可以放在數(shù)據(jù)訪問層。記錄添加的邏輯功能:判斷輸入的課程號主鍵在數(shù)據(jù)庫中 是否已有,若無,則插入記錄到數(shù)據(jù)庫中,則由業(yè)務(wù)邏輯層調(diào)用數(shù)據(jù)訪問層的添加方法來 實現(xiàn);最后,在界面層,其控件部署不用改變,只需判斷文本框的輸入完整性,然后調(diào)用 業(yè)務(wù)邏輯層的添加方法就可以了。本任務(wù)的設(shè)計流程如下 :圖 3.6 數(shù)據(jù)添加的 3 層設(shè)計流程 相關(guān)知識與技能3-2-1 數(shù)據(jù)訪問層的方法設(shè)計 一般為系統(tǒng)數(shù)據(jù)庫中的每個表設(shè)計一個數(shù)據(jù)訪問類,實現(xiàn)基本的記錄操作。為了實 現(xiàn)課程記錄的添加,目前,可在數(shù)據(jù)訪問類包含如下方法:1、 判斷某主鍵的記錄是否存在 方法名

16、: Exist 形參:代表主鍵的變量 返回值: bool 方法內(nèi)代碼設(shè)計:( 1) 設(shè)計語句 select * from 表 where 主鍵名 =形參( 2) 利用 using 語句,調(diào)用 DBHelper 類,生成一個 datareader 對象( 3) 利用 HasRows 屬性判斷此 datareader 對象是否有行,若有,返回真,否則 返回假。應(yīng)用場合:在插入記錄前判斷,若有則不用再插;在刪除記錄前判斷,若有則不 能刪。2、方法名: AddXX 形參:代表此表實體類的對象 返回值: int 方法內(nèi)代碼設(shè)計: ( 1) 設(shè)計語句 insert(2) 調(diào)用 DBHelper 類,用 E

17、xeccuteNonQuery ()方法執(zhí)行此語句并返回。 應(yīng)用場合:在表中添加一條記錄,根據(jù)返回值是否大于 0 判斷執(zhí)行成功否。3-2-2 業(yè)務(wù)邏輯層的方法設(shè)計 一般為系統(tǒng)中的每個功能模塊設(shè)計 1 個業(yè)務(wù)邏輯層的類,實現(xiàn)此模塊的所有業(yè)務(wù)邏輯。在課程添加中,所需要的業(yè)務(wù)邏輯為課程添加。首先,由于需要調(diào)用數(shù)據(jù)訪問類CourseAccess 因此,在類內(nèi)設(shè)計 1 個字段為此類對象:CourseAccess courseAccess = newCourseAccess()。其次,此類需要設(shè)計如下方法:1、添加課程 方法名: AddXX 形參:課程類對象 返回值: void 方法內(nèi)代碼設(shè)計:(1)調(diào)用

18、 CourseAccess 類對象的 Exist()方法,判斷形參所表示的課程類對象是 否存在,若存在方法返回;(2)調(diào)用 CourseAccess 類對象的 AddCourse()方法,添加課程,并利用返回值判 斷添加是否成功。3-2-3 界面層的設(shè)計 界面層的設(shè)計,首先需要根據(jù)用戶的功能需求部署恰當(dāng)控件,這些控件部署在第2 模塊已實現(xiàn),不用改變。然后,把功能實現(xiàn)代碼放在恰當(dāng)控件的恰當(dāng)事件中,在這些代碼 中,需要調(diào)用業(yè)務(wù)邏輯層的方法實現(xiàn)。課程添加時,界面上主要的功能如下:1、 按下添加按鈕,實現(xiàn)課程記錄的插入(1)代碼放在按鈕的 CLICK 事件中;(2)代碼設(shè)計思路:首先進(jìn)行控件的輸入正確

19、性驗證;其次利用控件的輸入值,生成1 個課程實體類對象;利用此對象,調(diào)用業(yè)務(wù)邏輯類對象的AddCourse ()方法,插入記錄;最后刷新瀏覽。任務(wù)的設(shè)計思路1、 在 DAL 工程中新建針對課程表的數(shù)據(jù)訪問類文件,將所需的2 個方法設(shè)計在內(nèi)。2、在 BLL 工程中新建針對課程管理的業(yè)務(wù)邏輯類文件,并設(shè)計相關(guān)方法。3、優(yōu)化界面層代碼,調(diào)用業(yè)務(wù)邏輯層類的方法,實現(xiàn)添加。4、 在 DAL 工程中,要用到 DBHelper 類和課程實體類 Course,分別位于 Common 和Modal 工程中,所以,必須在工程中加入對此2 個工程的引用。同理,BLL 工程中,要用到CourseAccess 類和課程

20、實體類 Course,分別位于 DAL 和 Modal 工程中,所以,必須在工程 中加入對此 2 個工程的引用。UI 工程中,要用到 CourseBiz 類和課程實體類 Course,分別 位于 BLL 和 Modal工程中,所以,必須在工程中加入對此2 個工程的引用。任務(wù)的實施1、 右擊 DALX程,選擇新建類文件,命名為:CourseAccess.cs 命名空間改為BFCourse.DAL 右擊工程,選擇添加引用,選中工程里的Common 和 Modal,然后添加引用語句:using BFCourse.Modal。using BFCourse.Common2、CourseAccess 類中

21、判斷某課程記錄是否存在的方法:/根據(jù)課號判斷此課程是否存在/ /publicbool Exist( string courseId)string strSql = string .Format( select * from course where courseId=0 ,courseId)。using ( OleDbDataReader dr = DBHelper.GetReader(strSql)if (dr.HasRows) returntrue。else returnfalse。3、CourseAccess 類中添加課程的方法,注意形參是課程對象/利用課程對象添加課程/ publici

22、nt AddCourse( Course course)string strSql = string .Format( insert into coursevalues(0,1,2) ,course.CourseId,course.CourseName,course.C ourseCredit)。return DBHelper.ExecNonQuery(strSql)。4、 右擊 BLL 工程,選擇新建類文件,命名為: CourseBiz.cs。命名空間改為BFCourse.BLL 右擊工程,選擇添加引用,選中工程里的DAL 和 Modal,然后添加引用語句:using BFCourse.Mo

23、dal。using BFCourse.DAL。5、CourseBiz 類部分代碼publicclass CourseBizCourseAccess courseAccess = newCourseAccess()。/判斷邏輯,插入課程/publicvoid AddCourse( Course course)if (courseAccess.Exist(course.CourseId)M e s s a g e B ox.Show( 此課程號已存在,請重新輸入)。return。if (courseAccess.AddCourse(course) 0)M e s s a g e B ox.Show

24、( 添加成功)。elseM e s s a g e B ox.Show( 添加失敗)。6、右擊 UI 工程,命名空間改為 BFCourse.U。右擊工程,選擇添加引用,選中工程里的BLL 和 Modal,然后添加引用語句:using BFCourse.Modal。using BFCourse.BLL。7、界面層重構(gòu)的部分代碼private void buttonAdd_Click(object sender, EventArgs e)if (textBox1.Text = String .Empty)MessageBox.Show(請輸入課程編號)。return。if (textBox2.Te

25、xt = String .Empty)MessageBox.Show(請輸入課程名稱)。return。if (textBox3.Text = String .Empty)MessageBox.Show(請輸入課程學(xué)分)。return。string courId = textBox1.Text.Trim()。string courName = textBox2.Text.Trim()。int courCredit = Convert .ToInt32(textBox3.Text.Trim()。Course course = newCourse(courId, courName, courCred

26、it)。CourseBizcb= newCourseBiz()。cb.AddCourse(course)。此時運(yùn)行系統(tǒng),記錄添加的部分就是由這 3 層實現(xiàn)的,界面層按下“添加”按鈕后,調(diào)用 BLL 層的 void AddCourse(Course course)方法, 此方法又調(diào)用 DAL 層的 bool Exist(string courseld)和 int AddCourse(Course course)方法,它們再調(diào)用 DBHelper 中的具體數(shù)據(jù)記錄操作 方法。是一個標(biāo)準(zhǔn)的 3 層架構(gòu)調(diào)用機(jī)制??偨Y(jié): 3 層架構(gòu)設(shè)計時,根據(jù)功能需求,從下而上設(shè)計,實際運(yùn)行時,從上而下調(diào) 用。圖 3.

27、7 課程添加的 3 層調(diào)用流程舉一反三任務(wù)3-3:課程刪除的3層實現(xiàn)效果與描述圖 3.8 添加課程刪除功能后的課程管理界面效果圖如圖 所示,為了實現(xiàn)課程記錄的刪除,需要按主鍵刪除,所以添加了課程號的 文本框和刪除按鈕。用 3 層的技術(shù)來實現(xiàn)。首先,也需要理順記錄刪除的業(yè)務(wù)流程,如下圖所示。圖 3.9 課程刪除的業(yè)務(wù)流程要判斷輸入的完整性;然后判斷輸入的課程號主鍵在數(shù)據(jù)庫中是否已有;若有,則刪 除該主鍵的記錄。然后,根據(jù)業(yè)務(wù)需求,從底到高來設(shè)計每層。單純的判斷記錄有無,已在上個任務(wù)實 現(xiàn);單純的記錄刪除操作,就可以添加在課程表的數(shù)據(jù)訪問層類。記錄刪除的邏輯功能: 判斷輸入的課程號主鍵在數(shù)據(jù)庫中是

28、否已有,若有,則刪除記錄,由業(yè)務(wù)邏輯層添加調(diào)用 數(shù)據(jù)訪問層的刪除方法來實現(xiàn);最后,在界面層,只需判斷文本框的輸入完整性,然后調(diào) 用業(yè)務(wù)邏輯層的刪除方法。本任務(wù)的設(shè)計流程如記錄添加的設(shè)計流程,不再贅述。相關(guān)知識與技能3-3-1 數(shù)據(jù)訪問層的方法設(shè)計在上個任務(wù)的 CourseAccess 類中,為了實現(xiàn)刪除,需要添加的方法有:1、刪除記錄方法名: DelXX形參:代表主鍵的變量課程號返回值: int方法內(nèi)代碼設(shè)計:( 1) 設(shè)計語句 delete( 2) 調(diào)用 DBHelper 類,用 ExeccuteNonQuery ()方法執(zhí)行此語句并返回 應(yīng)用場合:在表中刪除一條記錄,根據(jù)返回值是否大于 0

29、 判斷執(zhí)行成功否。3-3-2 業(yè)務(wù)邏輯層的方法設(shè)計在上個任務(wù)的 CourseBiz 類中,為了實現(xiàn)刪除,需要添加的方法有:1、刪除課程方法名: DelXX形參:代表主鍵的變量課程號返回值: void方法內(nèi)代碼設(shè)計:(1)調(diào)用 CourseAccess 類對象的 Exist()方法,判斷形參的課程類對象是否存在,若不存在方法返回;(2)調(diào)用 CourseAccess 類對象的 DelCourse()方法,刪除課程,并利用返回值判斷添加是否成功。3-3-3 界面層的設(shè)計界面層的設(shè)計,部署恰當(dāng)控件后,把功能實現(xiàn)代碼放在恰當(dāng)控件的恰當(dāng)事件中。課程 刪除時,界面上主要的功能如下:1、 按下刪除按鈕,實現(xiàn)

30、課程記錄的刪除(1)代碼放在按鈕的 CLICK 事件中;(2)代碼設(shè)計思路:首先進(jìn)行控件的輸入正確性驗證;將控件的值放在某變量中;利 用此變量作為實參,調(diào)用業(yè)務(wù)邏輯類對象的DelCourse ()方法,刪除記錄;最后刷新瀏覽。任務(wù)的設(shè)計思路1、在 DAL 工程中 CourseAccess 類,添加刪除課程的方法。2、在 BLL 工程中 CourseBiz 類,添加課程刪除相關(guān)方法。3、優(yōu)化界面層代碼,調(diào)用業(yè)務(wù)邏輯層類的方法,實現(xiàn)刪除。 任務(wù)的實施1、 在 CourseAccess 類中,添加如下方法: 刪除課程,注意形參是課程號/根據(jù)課程號刪除課程/publicint DelCourse( s

31、tring courseId)string strSql = string .Format( delete from course where courseId=0 , courseId)。return DBHelper.ExecNonQuery(strSql)。2、在 CourseBiz 類中,添加如下方法:/判斷邏輯,刪|除課程/publicvoid DelCourse( string courseId)if (!courseAccess.Exist(courseId)MessageBox.Show( 此課程號不存在,請重新輸入)。return。if (courseAccess.DelCo

32、urse(courseId) 0)MessageBox.Show( 添加成功)。elseMessageBox.Show( 添加失敗)。3、界面層重構(gòu)的代碼如下:privatevoid buttonDel_Click( object sender, EventArgs e) if (textBox4.Text = String .Empty)MessageBox.Show( 請輸入課程編號)。return。string courId = textBox4.Text.Trim()。CourseBiz cb= newCourseBiz()。cb.DelCourse(courId)。此時運(yùn)行系統(tǒng),記錄

33、刪除的部分就是由這 3 層實現(xiàn)的,界面層按下“刪除”按鈕后, 調(diào)用 BLL層的 void DelCourse(string courseld)方法,此方法又調(diào)用DAL 層的 bool Exist(stringcourseld)和 int DelCourse(string courseId)方法,它們再調(diào)用 DBHelper 中的具體數(shù)據(jù)記錄操作 方法。也是一個標(biāo)準(zhǔn)的 3 層架構(gòu)調(diào)用機(jī)制。圖 3.10 課程刪除的 3 層調(diào)用流程舉一反三1、任務(wù)3-4:課程瀏覽的3層實現(xiàn)效果與描述在上面 2 個任務(wù)中,利用 3 層架構(gòu),實現(xiàn)了課程記錄的添加和刪除。在記錄添加和刪 除后,都需要重新刷新課程表的瀏覽;

34、在窗體加載時,也需要在數(shù)據(jù)網(wǎng)格中瀏覽課程表當(dāng) 前所有記錄。基于 3 層架構(gòu)的課程記錄瀏覽還未實現(xiàn)。記錄瀏覽的業(yè)務(wù)流程比較簡單,就是再窗體加載時,添加、刪除記錄后,瀏覽課程表 當(dāng)前的而所有記錄。記錄瀏覽在本質(zhì)上就是:給數(shù)據(jù)網(wǎng)格提供數(shù)據(jù)源。數(shù)據(jù)源要求是1 個數(shù)據(jù)表 DateTable,或者是 1 種集合:如數(shù)組、集合、泛型集合等。根據(jù)業(yè)務(wù)需求,從底到高來設(shè)計每層。在課程表的數(shù)據(jù)訪問層類,添加瀏覽方法,將 課程表的當(dāng)前所有記錄取出,并放入集合。在課程管理的業(yè)務(wù)邏輯層類,添加瀏覽方法, 調(diào)用數(shù)據(jù)訪問層的新方法,取得此集合;最后,在界面層,在恰當(dāng)控件的恰當(dāng)事件里,調(diào) 用業(yè)務(wù)邏輯層的瀏覽方法。本任務(wù)的設(shè)計

35、流程如記錄添加的設(shè)計流程,不再贅述。相關(guān)知識與技能在本任務(wù)中,需要用到新的知識點(diǎn):集合和泛型集合。3-4-1 泛型集合的定義與使用 集合好比容器,將一系列相似的對象組合在一起,集合中包含的對象稱為集合元 素。 .NET 中 , 集合 可分為 泛型集 合類 和非泛 型集合 類。 泛 型集 合類一 般位于 system.Collections.Generic 命名空間,非泛型集合類位于 System.Collections 命名空間,除此 之外,在 System.Collection. Specialized 命名空間中也包含了一些有用的集合類。1、非泛型集合 System.Collections

36、 命名空間下的.NET 非泛型集合類如下所示: System.Collection s.ArrayList :數(shù)組集合類System.Collections.BitArray :布爾集合類System.Collectio ns.Queue :隊歹 USystem.Collections.Stack:堆棧System.Collectio ns.Hashtable:哈希表System.Collecti on s.SortedList :排序集合類非泛型集合操作直觀,但由于集合中的對象是 Object 類型,如果集合中需要存放其它 類型的對象,則每次使用都必須進(jìn)行繁瑣的類型轉(zhuǎn)換。因此,一般情況下,泛

37、型集合用的 比較多。2、泛型泛型就好比 Word 中的模板, 在定義 Word 模板時, 對具體編輯哪種類型的文檔是未知 的。 在 .NET中,泛型提供了類、結(jié)構(gòu)、接口和方法的模板,定義泛型時的具體類型也是未 知的。例如,可以定義一個泛型類:class FX private T x。public FX() public FX(T x) this .x = x。 public T num() return x。此類表示一種模板,此模板中包含一個字段, 2 個構(gòu)造函數(shù),和一個返回字段值的方 法,字段和方法的類型都是未知的。實例化此類可以是:FX f=new FX(3)。 表示用整型來實例化,并為字

38、段賦值為3。也可以這樣實例化:FX g = new FX(3.4)。 表示用實型進(jìn)行實例化,并為字段賦值3.4 。所以,實例化泛型類必須在 內(nèi)填上確定的類型,表示此模板目前作用于什么類型。3、泛型集合在 3 層結(jié)構(gòu)的應(yīng)用程序中,用到的泛型集合 System.Collections.Generic 命名空間下 的 .NET 泛型集合類主要是: System.Collections.Generic .List 類。查閱 msdn 的 List(Of T) 類, 對泛型集合進(jìn)行定義和使用。(1)定義ListvT 集合名=new ListvT ()。表示定義 1 個 List 類的泛型集合,集合中對象

39、的類型為T。其中的 T 就是所要使用的類型,既可以是簡單類型,如string、int,也可以是用戶自定義類型如 course 類。(2)屬性Cou nt:獲取集合中實際包含的元素數(shù)Item :獲取或設(shè)置指定索引處的元素(3)方法Add(T item):將對象添加到 List 的結(jié)尾處。例如以下代碼:class Personprivate string name 。private int age 。public Person() public Person(string name, int age)=name。 this.age=age。 privatevoid button1

40、_Click( object sender, EventArgs e)List pList = newList ()。string name = textBox1.Text.Trim()。intage = Convert .ToInt32(textBox2.Text.Trim()。Person p = newPerson(name,age)。pList.Add(p)。dataGridView1.DataSource = pList。定義了 1 個 Person 類的泛型列表后,可以將 Person 類的對象放入此集合,并作為 數(shù)據(jù)網(wǎng)格的數(shù)據(jù)源。3-4-2 數(shù)據(jù)訪問層的方法設(shè)計 在上個任務(wù)的 C

41、ourseAccess 類中,為了實現(xiàn)瀏覽,需要添加的方法有: 1、獲取此表的所有記錄 方法名: GetXXList 形參:無 返回值:此表實體類的泛型集合 方法內(nèi)代碼設(shè)計:(1)設(shè)計語句 select * from 表(2)定義此表實體類的泛型集合對象(3)利用 using 語句,調(diào)用 DBHelper 類,生成一個 datareader 對象(4)利用 Read()方法讀此 datareader 對象的所有行,每讀 1 行,取到此表實體類的對象中,添加入泛型集合,返回泛型集合對象。 應(yīng)用場合:取整個表的所有記錄,作為數(shù)據(jù)展示控件(如數(shù)據(jù)網(wǎng)格)的數(shù)據(jù)源。3-4-3 業(yè)務(wù)邏輯的方法設(shè)計在上個任

42、務(wù)的 CourseBiz 類中,為了實現(xiàn)瀏覽,需要添加的方法有:1 、課程瀏覽 方法名: GetXXList形參:無返回值: void方法內(nèi)代碼設(shè)計:(1)調(diào)用 CourseAccess 類對象的 GetCourseList ()方法,返回課程泛型集合類。3-4-3 界面層代碼的重構(gòu) 課程瀏覽時,界面上主要的功能如下:1、 窗體加載時,代碼放在LOAD 事件中,調(diào)用業(yè)務(wù)邏輯類對象的GetCourseList()方法,實現(xiàn)瀏覽。2、添加或刪除記錄成功后, 在原有代碼中添加, 調(diào)用業(yè)務(wù)邏輯類對象的 GetCourseList ()方法,實現(xiàn)瀏覽。任務(wù)的設(shè)計思路1、在 DAL 工程中 CourseA

43、ccess 類,添加瀏覽課程的方法。2、在 BLL 工程中 CourseBiz 類,添加課程瀏覽相關(guān)方法。3、 優(yōu)化界面層代碼,調(diào)用業(yè)務(wù)邏輯層類的方法,在3 個場合實現(xiàn)瀏覽。任務(wù)的實施1、在 CourseAccess 類中,添加如下方法:/獲取課程列表/ public List GetCourseList()string strSql = string .Format( select * from course)。List list= newList ()。using ( OleDbDataReader dr = DBHelper.GetReader(strSql)while (dr.Read()public List GetCourseList()return course

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論