隋東
【摘要】本文嘗試將SQL語言嵌入到VB6.0、VB.NET和C#高級語言中,開發(fā)設(shè)計(jì)一個(gè)具有增、刪、改和查詢功能的學(xué)生成績管理系統(tǒng),對其中運(yùn)用的關(guān)鍵技術(shù)進(jìn)行剖析和對比。并在對各種理論進(jìn)行闡述的同時(shí)配合系統(tǒng)的實(shí)現(xiàn)和關(guān)鍵技術(shù)的應(yīng)用加以說明。
【關(guān)鍵詞】ADO.NET VB6.0 VB.NET C# SQL SERVER T-SQL 類
【中圖分類號】G42 【文獻(xiàn)標(biāo)識(shí)碼】A 【文章編號】2095-3089(2013)05-0243-03
前言
中央廣播電視大學(xué)的數(shù)據(jù)庫應(yīng)用技術(shù)教材是基于VB6.0和SQL SERVER2000實(shí)驗(yàn)環(huán)境下的,這為我們的數(shù)據(jù)庫應(yīng)用技術(shù)教學(xué)實(shí)踐帶來一些困擾和不便,尤其不便于學(xué)生課后更準(zhǔn)確有效地自學(xué)教材。對此問題,筆者借助多年教學(xué)經(jīng)驗(yàn)的積累,將中央電大本門課程的形考任務(wù)“數(shù)據(jù)庫應(yīng)用系統(tǒng)開發(fā)”在VB6.0、VB.NET和C#多種環(huán)境下的實(shí)現(xiàn)進(jìn)行了思考和實(shí)驗(yàn),對不同環(huán)境下的數(shù)據(jù)庫應(yīng)用系統(tǒng)設(shè)計(jì)實(shí)現(xiàn)方法和關(guān)鍵技術(shù)進(jìn)行了比較,能夠有效地指導(dǎo)學(xué)生在不同應(yīng)用程序開發(fā)環(huán)境下,以簡捷的方式、方法,較快地設(shè)計(jì)、實(shí)現(xiàn)一個(gè)具備增、刪、改、查詢功能的小型數(shù)據(jù)庫應(yīng)用系統(tǒng),同時(shí)滿足了學(xué)生接受新事物、新技術(shù)的愿望,激發(fā)了他們搞好畢業(yè)設(shè)計(jì)的創(chuàng)作熱情,為學(xué)生們后續(xù)畢業(yè)設(shè)計(jì)打下了堅(jiān)實(shí)的基礎(chǔ)。
實(shí)現(xiàn)
本系統(tǒng)是基于 C/S 結(jié)構(gòu)的信息管理系統(tǒng),分別使用 VB6.0、VB.NET和C#作為開發(fā)語言,前端應(yīng)用程序通過ADO、ADO.NET技術(shù)來與數(shù)據(jù)庫進(jìn)行連接,優(yōu)點(diǎn)是易于使用、高速度、低內(nèi)存支出和占用磁盤空間較少。
該數(shù)據(jù)庫應(yīng)用系統(tǒng)雖然規(guī)模小,但是已經(jīng)具備增加、修改、刪除、查詢等系統(tǒng)功能。下面介紹一下系統(tǒng)開發(fā)的主要方法:
一、進(jìn)行數(shù)據(jù)庫設(shè)計(jì)
(一)需求分析
1.業(yè)務(wù)流程分析
“學(xué)生成績管理系統(tǒng)”,主要目的是用以實(shí)現(xiàn)學(xué)生、課程以及成績等多項(xiàng)管理。本系統(tǒng)管理的對象簡單,每個(gè)數(shù)據(jù)之間都有較強(qiáng)的關(guān)聯(lián)性,涉及過程并不復(fù)雜。因此,比較適合于數(shù)據(jù)庫管理。
2.數(shù)據(jù)流程分析
圖1學(xué)生成績管理數(shù)據(jù)流程圖
(二)概念結(jié)構(gòu)設(shè)計(jì)
根據(jù)需求分析的結(jié)果,進(jìn)行概念結(jié)構(gòu)設(shè)計(jì),依照收集信息→標(biāo)識(shí)對象(實(shí)體)→標(biāo)識(shí)每個(gè)對象需要存儲(chǔ)的詳細(xì)信息(屬性)→標(biāo)識(shí)對象之間的關(guān)系的步驟,采用E-R圖工具表示,設(shè)計(jì)結(jié)果如圖2所示:
圖2學(xué)生成績管理E-R圖
(三)邏輯結(jié)構(gòu)設(shè)計(jì)和物理實(shí)現(xiàn)
邏輯結(jié)構(gòu)設(shè)計(jì)的方法與步驟,是將概念結(jié)構(gòu)設(shè)計(jì)的結(jié)果E-R圖轉(zhuǎn)換為某個(gè)DBMS所支持的數(shù)據(jù)模型,并對其進(jìn)行優(yōu)化的過程。具體過程為:
將各實(shí)體轉(zhuǎn)化為對應(yīng)的表,將各屬性轉(zhuǎn)化為各表對應(yīng)的列;標(biāo)識(shí)每個(gè)表的主鍵列;在表之間體現(xiàn)實(shí)體之間的映射關(guān)系,遵守參照完整性規(guī)則;根據(jù)范式理論,對表進(jìn)行修改,盡量滿足第三范式。
通過規(guī)范化數(shù)據(jù)庫設(shè)計(jì),可以減少存儲(chǔ)的冗余數(shù)據(jù)量,減輕數(shù)據(jù)維護(hù)工作,減少存儲(chǔ)的要求,提高數(shù)據(jù)庫的完整性。
物理實(shí)現(xiàn)階段的主要工作是,把設(shè)計(jì)好的數(shù)據(jù)庫全局模式轉(zhuǎn)換為相應(yīng)的內(nèi)模式。在此用以上方法建立一個(gè)名稱為“學(xué)生成績管理”的數(shù)據(jù)庫,其中包含3張數(shù)據(jù)表,即學(xué)生情況表、課程情況表、學(xué)生成績表。
二、操縱和訪問數(shù)據(jù)庫的基本SQL語句
SQL是關(guān)系數(shù)據(jù)庫支持的標(biāo)準(zhǔn)查詢語言,也是一種雙重式語言,即用于查詢和更新的交互式數(shù)據(jù)庫語言(Interactive SQL),又是一種應(yīng)用程序進(jìn)行數(shù)據(jù)庫訪問時(shí)所采取的編程式數(shù)據(jù)庫語言,即嵌入式SQL(Embedded SQL)[1]。嵌入式SQL是數(shù)據(jù)庫應(yīng)用程序的一種開發(fā)方法。它要將SQL語句直接嵌入到程序的源代碼中,與其他程序設(shè)計(jì)語言語句混合使用。
開發(fā)的應(yīng)用程序?qū)⑨槍ι鲜鰯?shù)據(jù)庫進(jìn)行管理,主要有插入(insert)、修改(update)、刪除(delete)、查詢(select)和打印(print)等5種基本的操作。
三、界面設(shè)計(jì)
(一)創(chuàng)建項(xiàng)目工程
項(xiàng)目工程名稱為“學(xué)生成績管理”。
(二)創(chuàng)建主窗體
運(yùn)用菜單技術(shù)創(chuàng)建主窗體。
(三)創(chuàng)建增加、刪除、修改、查詢功能窗體
使用標(biāo)簽、文本框、組合框、表格、命令按鈕等控件,添加并創(chuàng)建“查詢記錄”、“增加新記錄”、“修改記錄”、“刪除記錄”等窗體。
四、代碼設(shè)計(jì)
.NET框架的一個(gè)主要組成部分是類庫,這些類被拆分為命名空間,它是類庫的邏輯分區(qū)。類庫所采用的命名空間是層次結(jié)構(gòu),即命名空間下又可以再分成子命名空間,每個(gè)命名空間都包含一組按照功能劃分的相關(guān)的類。
在.NET環(huán)境下,必須指向包含所使用類的命名空間(例如Imports System.Data,Imports System.Data.SqlClient)才能激活相應(yīng)的類;借助于封裝,把常用的數(shù)據(jù)連接、數(shù)據(jù)庫查詢和對數(shù)據(jù)庫操縱的功能模塊定義為公共函數(shù),包括createConn()用于建立數(shù)據(jù)庫連接的函數(shù),sqlUpdate()用于對數(shù)據(jù)庫操縱的函數(shù),sqlfind()用于數(shù)據(jù)庫查詢的函數(shù);使用時(shí)調(diào)用即可,避免相同功能模塊的重復(fù)建設(shè)。針對該系統(tǒng),筆者創(chuàng)建了SqlConnection、SqlCommand公共類的實(shí)例和系統(tǒng)常用的公共函數(shù)。
在不同模塊的設(shè)計(jì)中都可以調(diào)用這些自定義函數(shù),在此不再贅述。
五、報(bào)表設(shè)計(jì)
一個(gè)功能完整的數(shù)據(jù)庫應(yīng)用系統(tǒng),除了具有數(shù)據(jù)維護(hù)、查詢和顯示功能外,還必須具有報(bào)表輸出功能。Visual Studio2005報(bào)表體系結(jié)構(gòu)圖],其ReportViewer控件負(fù)責(zé)解釋RDLC報(bào)表定義、處理報(bào)表參數(shù)并按照各種用戶可選格式提供報(bào)表的“報(bào)表處理器”。它既可以運(yùn)行于“本地模式”也可以運(yùn)行于“遠(yuǎn)程模式”[2]。由用戶編寫的存儲(chǔ)過程負(fù)責(zé)管理連接或運(yùn)行基于參數(shù)的查詢;報(bào)表只駐留以報(bào)表為中心的Parameters集合,尋址遠(yuǎn)程報(bào)表服務(wù)并呈現(xiàn)給用戶。
六、幾種實(shí)現(xiàn)方法的比較
嵌入式SQL在VB6.0下和在VB.NET下使用的基本形式和處理過程對比如下:
(一)在VB6.0環(huán)境下的具體實(shí)現(xiàn)
ADO是微軟公司提出的第三種數(shù)據(jù)庫訪問對象,它把OLE DB封裝在一個(gè)數(shù)據(jù)對象中,使得VB6.0程序可以方便地實(shí)現(xiàn)對數(shù)據(jù)庫的訪問。ADO對象模型共包含7個(gè)對象,即Connection,command,Recordset,Parameter,Property,F(xiàn)ield和Error。
VB6.0應(yīng)用程序中主要用Connection對象建立與數(shù)據(jù)庫的連接,用Recordset和Field對象,對數(shù)據(jù)表進(jìn)行操作,實(shí)現(xiàn)數(shù)據(jù)表增加、刪除、修改等不返回結(jié)果集的操作,語法參閱文獻(xiàn)[1]。
(二)在VB.NET環(huán)境下的具體實(shí)現(xiàn)
ADO.NET是微軟.NET Framework框架中針對與數(shù)據(jù)庫進(jìn)行交互的一組對象類的名稱[3]。ADO.NET提供對Microsoft SQL Server、Oracle等數(shù)據(jù)源以及通過 OLEDB和XML公開的數(shù)據(jù)源的一致訪問,也就是提供與數(shù)據(jù)源進(jìn)行交互的相關(guān)的公共方法。應(yīng)用程序可以使用ADO.NET來連接到這些數(shù)據(jù)源,并檢索、操作和更新數(shù)據(jù)。
ADO.Net比ADO更適用于分布式應(yīng)用環(huán)境,增加了更好的性能;它有更好的可操作性、它可以結(jié)合XML語言來開發(fā)數(shù)據(jù)庫;它有更好的可維護(hù)性、可編程性和可伸縮性。
ADO.NET對象模型中包含五個(gè)主要的組件,即是Connection對象、Command對象、 Dataadapter對象、Datareader對象以及Dataset對象。ADO.NET架構(gòu)圖參見[3]。
其中Connection對象、Command對象、 DataAdapter對象和DataReader對象四個(gè)組件是負(fù)責(zé)建立聯(lián)機(jī)與數(shù)據(jù)操作部分的,被稱為數(shù)據(jù)提供組件 (Managed Providers)。而Dataset對象是ADO.NET非連接架構(gòu)下把數(shù)據(jù)庫中的數(shù)據(jù)映射到內(nèi)存緩存中所構(gòu)成的數(shù)據(jù)容器,是一個(gè)或多個(gè)DataTable 對象的集合。DataSet在使用時(shí)就像駐留在客戶端計(jì)算機(jī)上的一個(gè)小型關(guān)系數(shù)據(jù)庫,但又與任何具體的數(shù)據(jù)庫完全無關(guān)。DataAdapter對象在后臺(tái)數(shù)據(jù)庫和前臺(tái)Dataset對象之間起著橋梁作用。其Fill方法將后臺(tái)數(shù)據(jù)庫的數(shù)據(jù)取到前臺(tái)客戶端的Dataset對象中來。而其Update方法則按相反方向把前臺(tái)對數(shù)據(jù)庫的寫操作寫入數(shù)據(jù)庫中去,它由應(yīng)用程序在Dataset中添加、更改或刪除的行對數(shù)據(jù)庫進(jìn)行更新,在使用DataAdapter時(shí),需要將查出的數(shù)據(jù)起一個(gè)表名放到DataSet中。一個(gè)Dataset可以存放多個(gè)表,而TableAdapter的結(jié)果就是一個(gè)表,不能再繼續(xù)添加表。
DataReader實(shí)現(xiàn)數(shù)據(jù)操作以及對數(shù)據(jù)的快速、只進(jìn)、只讀訪問。Connection對象提供與數(shù)據(jù)源的連接。Command對象能夠訪問用于返回?cái)?shù)據(jù)、修改數(shù)據(jù)、運(yùn)行存儲(chǔ)過程、發(fā)送或檢索參數(shù)信息的數(shù)據(jù)庫命令。DataReader從數(shù)據(jù)源中提供高性能的數(shù)據(jù)流。它需要與數(shù)據(jù)庫保持連接,ExecuteReader()函數(shù)返回一個(gè)SqlDataReader對象或OleDbDataReader對象,通過這個(gè)對象來檢查查詢結(jié)果,它是一種“單向”流,一次只能提供一行數(shù)據(jù),就像高速傳送帶上的一排箱子,一旦它們被放在帶子上,就無法對它們排序或過濾出選定的箱子,也因此占用內(nèi)存少,執(zhí)行效率高。當(dāng)用戶讀取大量數(shù)據(jù)時(shí),可以使用DataReader來提高性能。
根據(jù)應(yīng)用程序所需功能和性能的要求,來確定是使用DataSet還是DataReader。
嵌入式SQL在VB.NET環(huán)境下通過SqlCommand.ExecuteNonQuery()方法,對連接執(zhí)行SQL語句,并返回受影響的行數(shù),當(dāng)行數(shù)大于0時(shí),命令執(zhí)行成功,否則說明對數(shù)據(jù)庫沒產(chǎn)生影響。通過使用SqlCommand.ExecuteScalar()方法來執(zhí)行命令對象的SQL語句,從數(shù)據(jù)庫中檢索單個(gè)值,當(dāng)值大于0時(shí),命令執(zhí)行成功,否則命令執(zhí)行失敗。該方法不接受任何參數(shù),僅僅返回查詢結(jié)果集中的第一行第一列。
在VB.NET環(huán)境下通過調(diào)用以上定義的函數(shù),就可以實(shí)現(xiàn)使用各種嵌入式SQL語句來操縱后臺(tái)數(shù)據(jù)庫的功能。
(三)C#語言環(huán)境下的設(shè)計(jì)實(shí)現(xiàn)
由于C#簡單易學(xué),而且可以跨平臺(tái)使用,因此它正在成為程序開發(fā)人員使用的主流編程語言。[4] 它具有如下諸多優(yōu)點(diǎn):
C#遵守通用語言規(guī)范(common language specification,CLS)。
C#具備自動(dòng)內(nèi)存管理功能:CLR 內(nèi)建垃圾收集器,當(dāng)變量實(shí)例的生命周期結(jié)束時(shí),垃圾收集器負(fù)責(zé)收回不被使用的實(shí)例占用的內(nèi)存空間。
C#具有交叉語言處理能力:由于任何遵守通用語言規(guī)范的程序設(shè)計(jì)語言源程序,都可編譯為相同的中間語言代碼,不同語言設(shè)計(jì)的組件,可以互相通用,可以從其他語言定義的類派生出語言的新類。
C#更加安全:C#語言不支持指針,一切對內(nèi)存的訪問都必須通過對象的引用變量來實(shí)現(xiàn),只允許訪問內(nèi)存中允許訪問的部分,這就防止病毒程序使用非法指針訪問私有成員,也避免指針的誤操作產(chǎn)生的錯(cuò)誤。
C#軟件的安裝更加容易:在.NET 中這些組件或動(dòng)態(tài)連接庫不必在注冊表中注冊,每個(gè)程序都可以使用自帶的組件或動(dòng)態(tài)連接庫,使軟件的安裝更加容易。
C#是完全面向?qū)ο蟮模篊#語言中所有的函數(shù)、變量和常量都必須定義在類中,避免了命名沖突。C#語言不支持多重繼承。
在開發(fā)項(xiàng)目中以類的形式來組織、封裝一些常用的方法和事件,不僅可以提高代碼的重用率,也大大方便了代碼的管理。
本系統(tǒng)中using System.Data.SqlClient命名空間包含有關(guān)專門操作SqlServer數(shù)據(jù)庫的類,如SqlConnection,SqlCommand,SqlDateAdapter等,System.Data命名空間包含數(shù)據(jù)庫操作所需要用到的普通數(shù)據(jù),如數(shù)據(jù)表,數(shù)據(jù)行等;DbHelperSQL類定義了與數(shù)據(jù)庫的連接配置、執(zhí)行SQL語句的公用方法等。調(diào)用并且構(gòu)建這些類的實(shí)例設(shè)計(jì)完成系統(tǒng)主窗體和系統(tǒng)的增、刪、改、查詢功能。
七、結(jié)論
(一)在不同高級語言環(huán)境下創(chuàng)建應(yīng)用程序的過程都一樣。
(二)在不同環(huán)境下使用的SQL語句都完全一樣,可以實(shí)現(xiàn)同樣的數(shù)據(jù)庫操縱功能。
(三)在VB6.0環(huán)境下編寫的應(yīng)用程序,搬到.NET環(huán)境下不能使用。
(四)NET開發(fā)平臺(tái)具有更加強(qiáng)大的內(nèi)部函數(shù)庫,.NET編程很大程度上依靠程序庫中提供的可重用源代碼,.NET框架提供了2500多個(gè)可重用的類。公共語言運(yùn)行時(shí)庫(CLR)提供了執(zhí)行程序的服務(wù),實(shí)現(xiàn)了編程語言的統(tǒng)一。.NET程序需要經(jīng)過兩次編譯才能在CPU上運(yùn)行,首先編譯生成與CPU無關(guān)的中間語言(MSIL)程序,在CLR的支持下,中間語言程序被編譯成由本地CPU指令組成的程序,實(shí)現(xiàn)了.NET跨平臺(tái)運(yùn)行的目標(biāo)。[5]
(五)NET采用ADO.NET數(shù)據(jù)訪問技術(shù),支持離線的數(shù)據(jù)訪問功能,同時(shí)提供了只進(jìn)的、一次只能讀取一條記錄的消耗資源極小的DataReader對象,提高了應(yīng)用程序?qū)?shù)據(jù)庫訪問的性能。更適用于分布式數(shù)據(jù)庫應(yīng)用系統(tǒng)的應(yīng)用。
(六)VB.NET和C#生成的代碼可以完全通用。VB提供了很多類型轉(zhuǎn)換函數(shù)型運(yùn)算符,如CInt(), CSng(), CStr()等,在C#中只要用(int) , (float), (String)即可; VB支持兩種形式的異常,即.net框架的異常和VB自己的錯(cuò)誤號碼,而C#只支持第一種。用到VB自己的錯(cuò)誤號碼的程序幾乎無法移植到C#中。
(七)VB支持模塊,C#不支持。在C#中制造一個(gè)abstract類,共享所有成員,就和模塊一樣了。C#不能像VB一樣直接訪問模塊中的成員,需要使用“類名.成員名”的用法。
(八)C#代碼更加簡潔,像VB.NET一樣簡單,像C++一樣強(qiáng)大, 是第一流的面向組件的語言。C#語言是.NETFrame Work 中新一代的開發(fā)工具,是一種現(xiàn)代的、面向?qū)ο蟮恼Z言,它簡化了C++語言在類、命名空間、方法重載和異常處理等方面的操作,摒棄了 C++的復(fù)雜性,更易使用,更少出錯(cuò)。它使用組件編程,和VB一樣容易使用。C#語法和 C++、JAVA 語法非常相似。所有的.NET Framework中的基類庫(Base Class Library)都由C# 編寫。
參考文獻(xiàn):
[1]劉世峰.數(shù)據(jù)庫應(yīng)用技術(shù)(本科)[M].中央廣播電視大學(xué)出版社,2008,103
[2]顧曉梅.數(shù)據(jù)庫應(yīng)用技術(shù)教程[M],上海電視大學(xué)教材, 2010, 171
[3]呂軍.軟件項(xiàng)目綜合實(shí)訓(xùn)(.NET篇)[M],清華大學(xué)出版社,2010,96~97
[4]明日科技 王小科,王軍,趙會(huì)東.C#項(xiàng)目開發(fā)案例全程實(shí)錄(第2版)[M],清華大學(xué)出版社,2011,前言
[5]龔沛曾.Visual Basic.NET程序設(shè)計(jì)教程(第2版)[M],高等教育出版社,2005,17