三層體系結(jié)構(gòu)與數(shù)據(jù)庫編程_第1頁
三層體系結(jié)構(gòu)與數(shù)據(jù)庫編程_第2頁
三層體系結(jié)構(gòu)與數(shù)據(jù)庫編程_第3頁
三層體系結(jié)構(gòu)與數(shù)據(jù)庫編程_第4頁
三層體系結(jié)構(gòu)與數(shù)據(jù)庫編程_第5頁
已閱讀5頁,還剩11頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、三層體系結(jié)構(gòu)和數(shù)據(jù)庫編程(修訂版)在ACCP課程體系中,WinForm高級應(yīng)用程序開發(fā)教材的前三章ADO.NET講述的是C#操作SQL Server 2000數(shù)據(jù)庫,如果能細(xì)心,加耐心地學(xué)習(xí)并總結(jié),自詡“精通數(shù)據(jù)庫編程”也不為過;然而對于大型的數(shù)據(jù)庫應(yīng)用系統(tǒng),或是擁有眾多客戶端的應(yīng)用系統(tǒng),我們需要另外一種“精通”,這就是幾乎每個程序員都聽說過的“三層體系結(jié)構(gòu)”。本文將闡述三層體系結(jié)構(gòu)和數(shù)據(jù)庫編程間的應(yīng)用,共分三個部分:第一部分:理論篇第二部分:實(shí)戰(zhàn)篇第三部分:小結(jié)第一部分:理論篇定義: 所謂三層體系結(jié)構(gòu),是在客戶端與數(shù)據(jù)庫之間加入了一個“中間層”,也叫組件層。這里所說的三層體系,不是指物理上的

2、三層,不是簡單地放置三臺機(jī)器就是三層體系結(jié)構(gòu);三層是指邏輯上的三層,即使這三個層放置到一臺機(jī)器上。 三層體系的應(yīng)用程序?qū)I(yè)務(wù)規(guī)則、合法性校驗(yàn)等工作放到了中間層進(jìn)行處理。通常情況下,客戶端(界面層或表示層,以下都用表示層)不直接與數(shù)據(jù)庫進(jìn)行交互,而是通過中間層建立連接,再經(jīng)由中間層與數(shù)據(jù)庫進(jìn)行交互。從上面的定義中可以分離出三個概念:即表示層,業(yè)務(wù)邏輯層,數(shù)據(jù)訪問層,這三層的功能和之間的關(guān)系并形成三層體系構(gòu)架。表示層:即界面層,表現(xiàn)方式有WinForm界面或Web界面,盡管表示層并不見得比其它層更重要,但是它幾乎得到了全部的榮耀因?yàn)樗俏ㄒ坏挠脩艨梢钥吹降膶印_@個層負(fù)責(zé)與用戶進(jìn)行交互工作。數(shù)據(jù)訪問

3、層:專門負(fù)責(zé)與數(shù)據(jù)庫進(jìn)行交互,對數(shù)據(jù)庫表記錄的增刪改查操作都由該層完成,數(shù)據(jù)訪問層不負(fù)責(zé)對數(shù)據(jù)的判斷和處理。業(yè)務(wù)邏輯層:業(yè)務(wù)邏輯相當(dāng)與一個橋梁的作用,把界面層和數(shù)據(jù)訪問層銜接起來,該層從數(shù)據(jù)訪問層獲取數(shù)據(jù),并根據(jù)表示層的需要來對數(shù)據(jù)進(jìn)行處理。業(yè)務(wù)邏輯層也可以獲得表示層提供的數(shù)據(jù),并根據(jù)數(shù)據(jù)訪問層的需要對其進(jìn)行處理。三層之間的調(diào)用關(guān)系如圖:業(yè)務(wù)邏輯層表示層數(shù)據(jù)訪問層發(fā)送請求處理后發(fā)送響應(yīng)請求處理后返回優(yōu)勢比較-傳統(tǒng)的C/S模式在傳統(tǒng)的數(shù)據(jù)庫應(yīng)用體系中,客戶端與數(shù)據(jù)庫完全分開,在客戶端上運(yùn)行了大部分服務(wù),如數(shù)據(jù)訪問規(guī)則、業(yè)務(wù)規(guī)則、合法性校驗(yàn)等等。每一個客戶端都存在數(shù)據(jù)引擎,并且每個客戶端與數(shù)據(jù)庫服

4、務(wù)器建立獨(dú)立的數(shù)據(jù)庫連接(DB Connection)。 基于該種體系的數(shù)據(jù)庫應(yīng)用系統(tǒng)的優(yōu)勢:開發(fā)周期較短,能夠適應(yīng)大部分中小型數(shù)據(jù)庫應(yīng)用系統(tǒng)的要求。 但是,隨著數(shù)據(jù)庫應(yīng)用的日漸發(fā)展、數(shù)據(jù)容量的不斷增加、客戶端數(shù)量的不斷增加,該種體系結(jié)構(gòu)顯示出了諸多缺陷,主要體現(xiàn)在以下幾個方面: 1、可擴(kuò)充性:對于數(shù)據(jù)庫服務(wù)器端,每當(dāng)建立一個數(shù)據(jù)連接,就會占用大量的系統(tǒng)資源,當(dāng)數(shù)據(jù)連接達(dá)到一定數(shù)量(如20個)時,數(shù)據(jù)庫服務(wù)器的響應(yīng)速度與處理速度將大打折扣。 2、可維護(hù)性:基于傳統(tǒng)C/S的數(shù)據(jù)庫應(yīng)用系統(tǒng),業(yè)務(wù)規(guī)則通常置于客戶端應(yīng)用程序中。如果業(yè)務(wù)規(guī)則一旦發(fā)生變化(隨便舉個例子,如身份證號碼有可能升為19位)時,

5、我們就必須修改客戶端應(yīng)用程序,并且將每個客戶端進(jìn)行相應(yīng)的升級工作。 3、可重用性:采用傳統(tǒng)C/S的設(shè)計模式時,數(shù)據(jù)庫訪問、業(yè)務(wù)規(guī)則等都固化在客戶端應(yīng)用程序中。如果客戶另外提出了B/S的應(yīng)用需求,則需要在WEB服務(wù)器中重新進(jìn)行數(shù)據(jù)庫訪問、業(yè)務(wù)規(guī)則、合法性校驗(yàn)等編碼(例如將數(shù)據(jù)庫訪問寫入ASP代碼),而所做的工作與客戶端應(yīng)用程序中的功能完全重復(fù),從而加大了工作量,又使得程序開發(fā)者心里感到極不舒服。可擴(kuò)充性,可維護(hù)性是檢驗(yàn)軟件質(zhì)量的重要標(biāo)志,代碼可重用性是面向?qū)ο缶幊痰淖罨緝?yōu)勢,三層體系構(gòu)架恰恰彌補(bǔ)了傳統(tǒng)的C/S模式的不足,針對上述的問題,總結(jié)出三層體系構(gòu)架的優(yōu)點(diǎn):1、由于數(shù)據(jù)訪問是通過中間層進(jìn)行

6、的,因此客戶端不再與數(shù)據(jù)庫直接建立數(shù)據(jù)連接。也就是說,建立在數(shù)據(jù)庫服務(wù)器上的連接數(shù)量將大大減少。例如一個500個客戶端的應(yīng)用系統(tǒng),500個客戶端分別與中間層服務(wù)器建立DCOM連接,而DCOM通訊所占用的系統(tǒng)資源極為有限,并且是動態(tài)建立與釋放連接,因此客戶端數(shù)量將不再受到限制。同時,中間層與數(shù)據(jù)庫服務(wù)器之間的數(shù)據(jù)連接通過“連接池”進(jìn)行連接數(shù)量的控制,動態(tài)分配與釋放數(shù)據(jù)連接,因此數(shù)據(jù)連接的數(shù)量將遠(yuǎn)遠(yuǎn)小于客戶端數(shù)量。 2、可維護(hù)性得以提高。因?yàn)闃I(yè)務(wù)規(guī)則、合法性校驗(yàn)存在于中間層,因此當(dāng)業(yè)務(wù)規(guī)則發(fā)生改變時,只需更改中間層服務(wù)器上的某個組件(如某個DLL文件),而客戶端應(yīng)用程序不需做任何處理,有些時候,甚

7、至不必修改中間層組件,只需要修改數(shù)據(jù)庫中的某個存儲過程就可以了。 3、良好的可重用性。同樣,如果需要開發(fā)B/S應(yīng)用,則不必要重新進(jìn)行數(shù)據(jù)訪問、業(yè)務(wù)規(guī)則等的開發(fā),可以直接在WEB服務(wù)器端調(diào)用現(xiàn)有的中間層(如可以采用基于IIS的WebClass開發(fā),或直接編寫ASP代碼)。 第二部分:實(shí)戰(zhàn)篇功能定義: 登入功能是C/S系統(tǒng)中最常見的模塊,針對教務(wù)系統(tǒng)提出如下業(yè)務(wù)要求:A:檢驗(yàn)教師編號是否合法,否則提示“請輸入有效的教師編號”B:教師編號是否存在,否則提示“教師編號不存在”C:如果教師編號存在,檢查密碼是否匹配,否則提示“密碼不匹配”D:教師編號和密碼都匹配,檢查該教師是否有任課,否則提示“該教師還

8、尚未授權(quán)”。E:登入成功,進(jìn)入主窗體業(yè)務(wù)流程圖如下:針對以上業(yè)務(wù),數(shù)據(jù)庫設(shè)計如下:字段名稱說 明教師表: teacherInfoteacherID老師編號必填,主鍵,老師編號規(guī)則和電話號碼一樣,一般前五位代表特定的含義,如某學(xué)?;蚰撤中5龋僭O(shè)該學(xué)校其老師編號格式為:25311 ×××××,中間有個空格隔開。pwd密碼必填,最大不超過32位,默認(rèn)值為888888teacherName老師姓名必填 測試數(shù)據(jù)Insert into teacherInfo values(25311 00000,123456,張三)Insert into teache

9、rInfo values(25311 00001,654321,李四)課程表: courseInfocourseID課程編號自動編號(標(biāo)識列),從1開始,主鍵courseName課程姓名必填,唯一測試數(shù)據(jù)Insert into courseInfo values(C#)Insert into courseInfo values(WinForm)教師課程關(guān)系表: couTeaInfoteacherID老師編號外鍵,必填,表示該課程的任課老師,一個老師可以任多門課courseID課程編號外鍵,必填,表示該老師的任課課程,一個課程可以由多個老師任課測試數(shù)據(jù)Insert into couTeaInfo

10、 values(25311 00000,1)Insert into couTeaInfo values(25311 00000,2)備注:教員“李四”沒有授課下面用三層構(gòu)架在滿足業(yè)務(wù)規(guī)則下,完成登入功能,基本講解過程如下:第一步:搭建最簡單的三層構(gòu)架第二步:建立各層之間的依賴關(guān)系第三步:數(shù)據(jù)訪問層的實(shí)現(xiàn)第四步:業(yè)務(wù)邏輯層的實(shí)現(xiàn)第五步:表示層的實(shí)現(xiàn)第六步:補(bǔ)充以下程序在VS2005下測試通過:第一步:搭建最簡單的三層構(gòu)架打開VS2005,新建C#的Windows應(yīng)用程序,解決方案名稱為“ThreeLayer”,這樣該解決方案下面就有一個1個項(xiàng)目,這個項(xiàng)目構(gòu)成了三層構(gòu)架的表示層。建立業(yè)務(wù)邏輯層:在

11、解決方案資源管理器中,選中第一行的解決方案,單擊右鍵,在彈出的菜單中選擇添加à新建項(xiàng)目,如圖1所示:圖1在彈出來的對話框如圖2所示:圖2項(xiàng)目類型選擇C,模版選擇”類庫“,名稱為”Business“,路徑一般和表示層在同一級目錄下,以便整個項(xiàng)目移植。單擊“確定”,并生成了一個新的項(xiàng)目,這個項(xiàng)目的名稱叫“Business “,這時可以看到,在解決方案資源管理器中,第一行表明一個解決方案有兩個項(xiàng)目了,打開解決方案所在文件夾,該文件夾下多了一個名為” Business “的文件夾,即保存剛才建立的項(xiàng)目信息,這樣就把業(yè)務(wù)邏輯層建立起來了。重復(fù)上述的步驟,在建立一個名為“DataAccess“的

12、類庫項(xiàng)目,把數(shù)據(jù)訪問層的項(xiàng)目也建立起來,這樣并完成了簡單三層構(gòu)架的項(xiàng)目建設(shè)。最終可以看到,解決方案“ThreeLayer “下有三個項(xiàng)目,名稱分別為”ThreeLayer“,”Business “和”DataAccess“。第二步:建立各層之間的依賴關(guān)系第一步只是建立了三個項(xiàng)目,分別構(gòu)建了三層構(gòu)架的不同的層,每個項(xiàng)目都是獨(dú)立,而三層構(gòu)架各層間是緊密結(jié)合,共同完成項(xiàng)目的功能,只是各層的職能不同罷了,它們的關(guān)系如下:A:表示層(ThreeLayer項(xiàng)目)業(yè)務(wù)邏輯層(Business項(xiàng)目),表示層將數(shù)據(jù)交由業(yè)務(wù)邏輯層處理,并通過業(yè)務(wù)邏輯層完成對數(shù)據(jù)的操作B:業(yè)務(wù)邏輯層(Business項(xiàng)目)數(shù)據(jù)訪問

13、層(DataAccess項(xiàng)目),業(yè)務(wù)邏輯層要完成對數(shù)據(jù)的操作,必須借助數(shù)據(jù)訪問層的功能。如何建立各層之間的關(guān)系呢?表示層和業(yè)務(wù)邏輯層建立關(guān)系為例:步驟如下選中項(xiàng)目“ThreeLayer “下的”應(yīng)用“,單擊鼠標(biāo)右鍵,在彈出菜單中選擇”添加應(yīng)用“,如圖3所示:圖3在彈出的對話框如圖4所示:圖4選中項(xiàng)目名稱” Business”單擊確定。這樣就可以看到在項(xiàng)目“ThreeLayer “下的”應(yīng)用“多了”Business “這一項(xiàng)。以同樣的步驟在項(xiàng)目“Business “下的”應(yīng)用“添加對項(xiàng)目”DataAccess “的應(yīng)用,這樣并完成了三層之間的調(diào)用關(guān)系。之后可以看到三層之間的依賴關(guān)系,這里只查看項(xiàng)

14、目”DataAccess “的依賴關(guān)系,選中項(xiàng)目”DataAccess “,右鍵選擇”項(xiàng)目依賴項(xiàng)“,顯示如圖5:圖5.NET Framework不支持循環(huán)依賴,如果項(xiàng)目“Business “依賴項(xiàng)目”DataAccess “,那么項(xiàng)目“DataAccess “就不能依賴項(xiàng)目”Business “及項(xiàng)目”Business “的依賴項(xiàng)(如項(xiàng)目“ThreeLayer “),否則會拋出信息,如圖6:圖6細(xì)心的讀者或許看到了圖5的生成順序,如圖7圖7當(dāng)把項(xiàng)目的依賴設(shè)置好了,那么項(xiàng)目的生成順序也就可以確定了,在.NET Framework下,生成某項(xiàng)目時,如果該項(xiàng)目有依賴項(xiàng),要先生成依賴項(xiàng)的項(xiàng)目,且具有傳

15、遞性。如:1:當(dāng)生成項(xiàng)目DataAccess時,因?yàn)闆]有依賴項(xiàng),可以看到只有一個生成成功2:當(dāng)生成項(xiàng)目Business時,因?yàn)橐蕾嘍ataAccess,所以得先生成DataAccess項(xiàng)目,這樣并看到2個項(xiàng)目生成成功3:當(dāng)生成項(xiàng)目ThreeLayer時,因?yàn)橐蕾嘊usiness,所以得先生成Business項(xiàng)目,但是生成項(xiàng)目Business時,則執(zhí)行2的生成順序,這樣就看到3個項(xiàng)目生成成功所以呈現(xiàn)的項(xiàng)目生成順從如圖7所示。第三步:數(shù)據(jù)訪問層的實(shí)現(xiàn)該層專門負(fù)責(zé)與數(shù)據(jù)庫進(jìn)行交互,為了便于對數(shù)據(jù)庫的操作,數(shù)據(jù)庫訪問類顯得異常重要,該類實(shí)現(xiàn)數(shù)據(jù)庫的各種方法,例如調(diào)用存儲過程,執(zhí)行SQL語句等。下面的S

16、QLHelp類只完成了簡單的操作,希望能以此為基礎(chǔ),進(jìn)行擴(kuò)展和完善。SQLHelp數(shù)據(jù)庫操作類using System;using System.Data;using System.Data.SqlClient;using System.Configuration;namespace DataAccess / <summary> / 數(shù)據(jù)庫訪問支持類 / </summary> class SQLHelp private string _connstr = ConfigurationManager.ConnectionStrings"DBConn".C

17、onnectionString; private SqlConnection _conn; private SqlCommand _cmd; private SqlDataAdapter _sda; public SQLHelp() _conn = new SqlConnection(this._connstr); _cmd = new SqlCommand(); / <summary> / 初始化存儲過程 / </summary> / <param name="procName">存儲過程名稱</param> public

18、void InitProc(string procName) _cmd.CommandText = procName; _cmd.Connection = this._conn; _cmd.CommandType = CommandType.StoredProcedure; / <summary> / 初始化SQL命令 / </summary> / <param name="sqlstr">sql語句</param> public void InitText(string sqlstr) _cmd.CommandText =

19、sqlstr; _cmd.Connection = this._conn; _cmd.CommandType = CommandType.Text; / <summary> / 添加字符串參數(shù) / </summary> / <param name="paraName">參數(shù)名稱</param> / <param name="paraValue">參數(shù)值</param> public void AddPara(string paraName, string paraValue) Sql

20、Parameter para = new SqlParameter(paraName, SqlDbType.VarChar); para.Value = paraValue; _cmd.Parameters.Add(para); / <summary> / 添加整型參數(shù) / </summary> / <param name="paraName">參數(shù)名稱</param> / <param name="paraValue">參數(shù)值</param> public void AddPara

21、(string paraName, int paraValue) SqlParameter para = new SqlParameter(paraName, SqlDbType.Int); para.Value = paraValue; _cmd.Parameters.Add(para); / <summary> / 添加輸出參數(shù) / </summary> / <param name="paraName">參數(shù)名稱</param> / <param name="type">參數(shù)類型名稱<

22、/param> public void AddOutPara(string paraName, string type, int size) SqlParameter para; if (type.ToLower() = "string") para = new SqlParameter(paraName, SqlDbType.VarChar, size); else if (type.ToLower() = "int") para = new SqlParameter(paraName, SqlDbType.Int); else throw ne

23、w Exception("數(shù)據(jù)類型錯誤"); para.Direction = ParameterDirection.Output; _cmd.Parameters.Add(para); / <summary> / 執(zhí)行命令,用于Update,Insert,Delete / </summary> / <returns>影響行數(shù)</returns> public int ExecNonQuery() this._conn.Open(); return this._cmd.ExecuteNonQuery(); / <summ

24、ary> / 執(zhí)行命令,返回一行一列 / </summary> / <returns>一行一列的值</returns> public object ExecScalar() this._conn.Open(); return this._cmd.ExecuteScalar(); / <summary> / 提取參數(shù)的值 / </summary> / <param name="paraName">參數(shù)名稱</param> / <returns>參數(shù)值</returns&

25、gt; public object GetValue(string paraName) return this._cmd.ParametersparaName.Value; / <summary> / 執(zhí)行命令 / </summary> / <returns>返回DataTable對象</returns> public DataTable ExecDT() _sda = new SqlDataAdapter(); _sda.SelectCommand = this._cmd; DataTable dt = new DataTable(); thi

26、s._sda.Fill(dt); return dt; / <summary> / 關(guān)閉數(shù)據(jù)庫連接 / </summary> public void Close() this._conn.Close(); “ConfigurationManager.ConnectionStrings"DBConn".ConnectionString;”是提取配置文件的數(shù)據(jù)庫連接語句,”ConfigurationManager”是”System.Configuration”下的一個類,要在項(xiàng)目”DataAccess”的應(yīng)用下添加”System.Configuratio

27、n”程序集.在默認(rèn)的情況下,系統(tǒng)沒有配置文件,配置文件往往添加在表示層中,步驟是:選中表示層項(xiàng)目“ThreeLayer”,單擊右鍵,選擇添加à新建項(xiàng)。彈出如圖8的窗口:圖8選擇“應(yīng)用程序配置文件”,名稱為“App.config”,這個是系統(tǒng)的默認(rèn)配置文件,然后在配置文件中寫入:<?xml version="1.0" encoding="utf-8" ?><configuration> <connectionStrings> <add name="DBConn" connectionS

28、tring="server=YF82FWLEXAM;database=ThreeLayerDB;uid=sa;pwd=" providerName="System.Data.SqlClient" /> </connectionStrings></configuration>這個配置文件在編譯后,文件名改為“ThreeLayer.exe.config”,即應(yīng)用文件名稱(ThreeLayer.exe)加配置文件的擴(kuò)展名config。配置文件和SQLHelp都完成之后,針對不同的業(yè)務(wù)模塊編寫不同的操作,這里我們需要完成教員信息模塊

29、和課程信息模塊。教員信息模塊,在項(xiàng)目“DataAccess”下建立TeacherInfoDA.cs類,往往這里以DA(DataAccess縮寫)結(jié)尾,表示該類項(xiàng)目“DataAccess”下與teacherInfo表進(jìn)行交互的類。代碼如下:using System;using System.Collections.Generic;using System.Text;namespace DataAccess public class TeacherInfoDA private SQLHelp _sqlhelp = new SQLHelp(); / <summary> / 用戶登入 /

30、</summary> / <param name="teacherID">教師編號</param> / <returns>密碼,空表示出錯或教師編號不存在</returns> public string Login(string teacherID) try /設(shè)置sql語句 this._sqlhelp.InitText("select pwd from teacherInfo where teacherID=teacherID"); /設(shè)置參數(shù)值 this._sqlhelp.AddPara(&

31、quot;teacherID", teacherID); /執(zhí)行sql語句 object obj = this._sqlhelp.ExecScalar(); if (obj = null) return null; else return obj.ToString(); catch(Exception ex) Console.WriteLine(ex.Message); throw ex; finally /關(guān)閉數(shù)據(jù)庫 _sqlhelp.Close(); 課程信息模塊的文件CourseInfoDA.cs表示和表courseInfo進(jìn)行交互的類,代碼如下:using System;us

32、ing System.Data;using System.Collections.Generic;using System.Text;namespace DataAccess public class CourseInfoDA private SQLHelp _sqlhelp = new SQLHelp(); / <summary> / 根據(jù)教師編號查詢?nèi)握n信息 / </summary> / <param name="teacherID">教師編號</param> / <returns>任課信息表集合</re

33、turns> public DataTable CourseByTeacherID(string teacherID) try string sqlstr = "select courseInfo.*,teacherID from couTeaInfo " + "inner join courseInfo " + "on couTeaInfo.courseID=courseInfo.courseID " + "where teacherID='" + teacherID + "'&q

34、uot; /設(shè)置sql語句 this._sqlhelp.InitText(sqlstr); /執(zhí)行,返回任課信息 return this._sqlhelp.ExecDT(); catch (Exception ex) Console.WriteLine(ex.Message); throw ex; finally /關(guān)閉數(shù)據(jù)庫 _sqlhelp.Close(); 這樣并完成了對數(shù)據(jù)訪問層的功能設(shè)計。具體功能可參考注釋。第四步:業(yè)務(wù)邏輯層的實(shí)現(xiàn)業(yè)務(wù)邏輯層,顧名思義,就是對業(yè)務(wù)邏輯進(jìn)行處理,這里只有一個業(yè)務(wù),那并是用戶登入,根據(jù)上述的規(guī)則,編寫TeacherInfoBLL.cs文件,該文件以BLL

35、(Business Logic Layer的縮寫)結(jié)尾,表示該類是項(xiàng)目“Business”下的處理教員業(yè)務(wù)的類。代碼如下:using System;using System.Text.RegularExpressions;using System.Data;using System.Collections.Generic;using System.Text;using DataAccess;namespace Business public class TeacherInfoBLL private string _teacherid; / <summary> / 老師編號 / &l

36、t;/summary> public string TeacherID get return this._teacherid; private set /驗(yàn)證是否為空 if (string.IsNullOrEmpty(value) throw new ArgumentException("教師編號不能為空"); Regex regex = new Regex("25311 d5$"); if (!regex.IsMatch(value)/驗(yàn)證是否符合規(guī)范 throw new ArgumentException("教師編號格式不正確&quo

37、t;); this._teacherid = value; / <summary> / 登入 / </summary> / <param name="teacherID">教師編號</param> / <param name="pwd">密碼</param> / <returns>處理信息,空字符為登入成功</returns> public void TeacherLogin(string teacherID,string pwd) this.TeacherI

38、D = teacherID; /實(shí)例化DataAccess下的TeacherInfoDA TeacherInfoDA teacherinfoda = new TeacherInfoDA(); string returnpwd = teacherinfoda.Login(teacherID); if (returnpwd = null) throw new ArgumentException("用戶名不存在"); else if (returnpwd != pwd) throw new ArgumentException("密碼不正確"); CourseI

39、nfoDA courseinfoda = new CourseInfoDA(); DataTable tempdt = courseinfoda.CourseByTeacherID(teacherID); if (tempdt = null | tempdt.Rows.Count = 0) throw new ArgumentException("還沒有授權(quán),請聯(lián)系管理員"); “using DataAccess;”將數(shù)據(jù)庫訪問層,為方法TeacherLogin調(diào)用數(shù)據(jù)訪問層的類提供前提。從上述代碼中已經(jīng)可以看出業(yè)務(wù)處理過程了。具體請參考注釋。第五步:表示層的實(shí)現(xiàn)表示層是提

40、供用戶交互的界面,根據(jù)業(yè)務(wù)需求,這里需要登入界面和主界面,登入窗口名稱為:frmLogin,主界面窗口名稱為:frmMain,那么在應(yīng)用程序的主入口點(diǎn)的Main方法代碼如下:static void Main() Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); /實(shí)例化登入界面 frmLogin login = new frmLogin(); /以模式窗口顯示 DialogResult dr = login.ShowDialog(); /返回DialogResult.O

41、K,表示登入成功 if (dr = DialogResult.OK) Application.Run(new frmMain(); 登入的業(yè)務(wù)規(guī)則主要通過登入窗口與用戶進(jìn)行交互,界面如圖9:圖9關(guān)鍵代碼如下:using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using Business; /登入按鈕代碼private void bt

42、nLogin_Click(object sender, EventArgs e) try /實(shí)例化Business下的TeacherInfoBLL類 TeacherInfoBLL teacherinfobll = new TeacherInfoBLL(); /接受處理信息 teacherinfobll.TeacherLogin(this.txtTeacherID.Text, this.txtPwd.Text); this.DialogResult = DialogResult.OK; catch (Exception ex) MessageBox.Show(ex.Message, "

43、信息", MessageBoxButtons.OK, MessageBoxIcon.Information); “using Business;”引入業(yè)務(wù)邏輯層,為實(shí)例化TeacherInfoBLL對象做準(zhǔn)備,測試數(shù)據(jù)和測試結(jié)果如下:編號教師編號密碼測試結(jié)果125311 0000123456請輸入有效的教師編號225311 0000312345教師編號不存在325311 000011234密碼不匹配425311 00001654321該教師還尚未授權(quán)525311 00000123456登入主窗口從而驗(yàn)證程序滿足業(yè)務(wù)要求。如果用圖來表示三層之間的調(diào)用順序,看起來會更清楚:如圖10界面層1輸入教師編號和密碼,登入2驗(yàn)證不成功顯示信息3登入主界面業(yè)務(wù)邏輯層1接收參數(shù)2驗(yàn)證有效性3請求驗(yàn)證編號4接收密碼5密碼為空6密碼不匹配7任課驗(yàn)證9接收任課信息10null或空11 返回空,成功登入數(shù)據(jù)訪問層1接收編號參數(shù)2接收驗(yàn)證結(jié)果3發(fā)送驗(yàn)證信息4接收編號參數(shù)5接收任課信息6發(fā)送任課信息數(shù)據(jù)庫

溫馨提示

  • 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

提交評論