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