段班祥
(廣東科學(xué)技術(shù)職業(yè)學(xué)院計(jì)算機(jī)工程技術(shù)學(xué)院 廣東 珠海 519090)
長(zhǎng)期以來,開發(fā)社區(qū)形成以下格局:面向?qū)ο笈c數(shù)據(jù)訪問兩個(gè)領(lǐng)域長(zhǎng)期分裂,各自為政,編程語(yǔ)言中的數(shù)據(jù)類型與數(shù)據(jù)庫(kù)中的數(shù)據(jù)類型形成兩套體系。LINQ(Language Integrated Query)即語(yǔ)言集成查詢,是一組語(yǔ)言特性和API,使得你可以使用統(tǒng)一的方式編寫各種查詢。查詢的對(duì)象包括XML、對(duì)象集合、SQL Server數(shù)據(jù)庫(kù)等等。LINQ主要包含以下三部分:LINQ to Objects、LINQ to XML、LINQ to ADO.NET。而 LINQ to ADO.NET 主要包含:LINQ to SQL、LINQ to DataSet、LINQ to Entities。
三層結(jié)構(gòu)主要分為:表示層、業(yè)務(wù)邏輯層和數(shù)據(jù)訪問層。表示層主要功能是為用戶提供一種交互式操作界面;業(yè)務(wù)邏輯層是表示層與數(shù)據(jù)訪問層之間的橋梁,負(fù)責(zé)關(guān)鍵業(yè)務(wù)的處理和數(shù)據(jù)傳遞;數(shù)據(jù)訪問層實(shí)現(xiàn)對(duì)數(shù)據(jù)的保存和讀取操作。其主要優(yōu)點(diǎn)是當(dāng)數(shù)據(jù)庫(kù)或用戶界面發(fā)生改變時(shí)不需要重新開發(fā),只做簡(jiǎn)單調(diào)整即可。
下面我們具體使用LINQ和三層結(jié)構(gòu)實(shí)現(xiàn)學(xué)生信息管理系統(tǒng),本系統(tǒng)開發(fā)工具使用Visual Studio 2010,開發(fā)語(yǔ)言使用C#,開發(fā)數(shù)據(jù)庫(kù)使用SQL Server 2008,系統(tǒng)開發(fā)的總體任務(wù)是實(shí)現(xiàn)信息關(guān)系的系統(tǒng)化、規(guī)范化和自動(dòng)化。系統(tǒng)的結(jié)構(gòu)關(guān)系如圖1所示:
系統(tǒng)的結(jié)構(gòu)關(guān)系圖是系統(tǒng)的總體功能分析,是在系統(tǒng)開發(fā)的總體任務(wù)的基礎(chǔ)上完成的。本項(xiàng)目中的學(xué)生信息系統(tǒng)需要完成的功能主要有:有關(guān)學(xué)籍等信息的輸入,包括學(xué)生基本信息、所在班級(jí)、所學(xué)課程和成績(jī)等;學(xué)生信息的查詢,包括學(xué)生基本信息、所在班級(jí)、已學(xué)課程、所有成績(jī)和獎(jiǎng)罰信息等;學(xué)生信息(包括獎(jiǎng)罰信息)修改;班級(jí)管理信息的輸入,包括班級(jí)設(shè)置、年級(jí)信息和班級(jí)輔導(dǎo)員等;班級(jí)管理信息的查詢;班級(jí)管理信息的修改;學(xué)?;菊n程信息的輸入;基本課程信息的修改;學(xué)生課程的設(shè)置和修改;學(xué)生成績(jī)信息的輸入;學(xué)生成績(jī)信息的修改;學(xué)生成績(jī)信息的查詢;學(xué)生成績(jī)的報(bào)表打?。挥脩舻卿浶畔⒌奶砑?、修改和刪除等;用戶登錄的密碼修改;數(shù)據(jù)庫(kù)文件的備份。
圖1 系統(tǒng)結(jié)構(gòu)關(guān)系圖
下面我們以“查詢所有學(xué)生的成績(jī)”模塊為例,說明如何具體使用LINQ和三層結(jié)構(gòu)進(jìn)行設(shè)計(jì)。LINQ提供了LINQ to DATASETS、LINQ to ENTITIES、LINQ to SQL等組件訪問數(shù)據(jù)源,且允許做所有與數(shù)據(jù)庫(kù)相關(guān)的操作。在學(xué)生信息管理系統(tǒng)中,主要使用LINQ to SQL組件訪問數(shù)據(jù)庫(kù),但是其他各組件訪問數(shù)據(jù)源方法與其類似,可將其作為參考。
在數(shù)據(jù)訪問層把LINQ to SQL類增加到項(xiàng)目中,自動(dòng)創(chuàng)建一個(gè)空白的設(shè)計(jì)器,與此同時(shí),創(chuàng)建相關(guān)的dbml.layout文件和 designer.cs文件,并附有服務(wù)器資源管理器的鏈接。打開服務(wù)器資源管理器,建立與MySchool數(shù)據(jù)庫(kù)的鏈接,將所需要的表直接拖放到MySchool.dbml文件的視圖面板中,該文件的類與MySchool數(shù)據(jù)庫(kù)表相對(duì)應(yīng),最后保存dbml文件,此時(shí),dbml文件里已經(jīng)自動(dòng)生成了包含相關(guān)的屬性、方法的DataContext類和實(shí)體類MySchool.dbml文件。
2.2.1 數(shù)據(jù)訪問層ResultService設(shè)計(jì)
查詢學(xué)生成績(jī)涉及到學(xué)生信息表Student、成績(jī)表Result、科目表Subject等三個(gè)表,我們使用LINQ查詢語(yǔ)句中的join子句進(jìn)行聯(lián)接,同時(shí)利用左外聯(lián)接上一聯(lián)接的查詢結(jié)果上再進(jìn)行一次查詢,具體語(yǔ)法如下:
2.2.2 業(yè)務(wù)邏輯層ResultManager和表示層的設(shè)計(jì)查詢學(xué)生成績(jī)功能業(yè)務(wù)邏輯相對(duì)比較簡(jiǎn)單,具體代碼如下:
表示層窗體FrmSearchStu.cs中添加一個(gè)命令按鈕btnSearch、一個(gè)DataGridView控件dgvResult,編寫命令按鈕 “查詢所有學(xué)生的成績(jī)”單擊事件,實(shí)現(xiàn)查詢所有學(xué)生的成績(jī)。
學(xué)生信息管理系統(tǒng)其他功能模塊訪問數(shù)據(jù)庫(kù)所使用的全部實(shí)體類代碼使用Visual Studio 2010集成開發(fā)工具的LINQto SQL設(shè)計(jì)器自動(dòng)生成,僅此一項(xiàng)就可以節(jié)省許多復(fù)雜代碼的編寫工作;LINQ把對(duì)數(shù)據(jù)庫(kù)的操作轉(zhuǎn)化為對(duì)實(shí)體類的操作,使編程思路和程序邏輯更加明確;同時(shí),代碼中LINQ to OBJECT的使用也節(jié)約了大量的代碼編寫工作。由于數(shù)據(jù)訪問層代碼全部采用LINQ來實(shí)現(xiàn),所以在編寫這些代碼時(shí)可以獲得編譯時(shí)的類型檢查和IntelliSense支持,提高了編程效率,大大節(jié)省了開發(fā)時(shí)間和成本。
另外,在軟件開發(fā)過程中,我們使用了三層結(jié)構(gòu),當(dāng)數(shù)據(jù)庫(kù)或用戶界面發(fā)生改變時(shí)不需要重新開發(fā),只做簡(jiǎn)單調(diào)整即可,從而大大提高應(yīng)對(duì)客戶變化的能力以及自身的生產(chǎn)力。
本文通過學(xué)生信息管理系統(tǒng),分析了LINQ及LINQ TO SQL的概念和基本架構(gòu),對(duì)其核心技術(shù)和新特性進(jìn)行了詳細(xì)的描述。結(jié)合三層結(jié)構(gòu),詳細(xì)介紹了LINQ數(shù)據(jù)庫(kù)訪問的基本方法,如查詢、修改、插入、刪除等操作。LINQ to SQL還全面支持事務(wù)、視圖、存儲(chǔ)過程,并且提供簡(jiǎn)單的方式來集成數(shù)據(jù)驗(yàn)證和業(yè)務(wù)邏輯規(guī)則。這些強(qiáng)大的功能和特性還有待在實(shí)際開發(fā)過程中繼續(xù)研究和應(yīng)用。
[1]微軟公司.ADO.NET 3.5數(shù)據(jù)訪問程序開發(fā)[M].北京:人民郵電出版社,2010.
[2]宋智軍,邱仲潘.Visual C#2010 從入門到精通[M].北京:電子工業(yè)出版社,2011.
[3]牟永敏,丁媛,朱緒利,李良杰.基于LINQ技術(shù)的在線考試系統(tǒng)[J].北京信息科技大學(xué)學(xué)報(bào),2011,26(2):19-24.
[4]涂曙光.LINQ 和LINQ 的未來[J].Technical News,2009,2:17.