另外,數(shù)據(jù)表設(shè)計時一般都應(yīng)該有一些標志字段,標志字段可以定義成CHAR(1)或BIT型。建議實際應(yīng)用中定義成CHAR(1)字段可以存儲多種可能的狀態(tài),在最初設(shè)計時,可能我們沒有考慮到的一些情況,在程序后來的開發(fā)中,可以通過設(shè)計標志字段為不同的 值來解決,這樣就避免了修改數(shù)據(jù)庫結(jié)構(gòu)。
數(shù)據(jù)庫初期設(shè)計時一定要謹慎,把所有可能的情況都考慮進去,即使當時沒有用到,也要將它留在數(shù)據(jù)庫中作為備用字段以便將來擴充。
程序一旦開始編碼,就應(yīng)該盡量避免再修改數(shù)據(jù)庫。因為如果數(shù)據(jù)庫結(jié)構(gòu)一旦改變,
所有與修改的數(shù)據(jù)表相關(guān)的業(yè)務(wù)都有可能受到影響,而某些影響還很難看到,這樣就容易形成一個惡性循環(huán)。錯誤越改越多,越改越亂,最終導(dǎo)致程序的失敗。PB的數(shù)據(jù)窗口與其他語言的數(shù)據(jù)控件不一樣,它的很多東西是預(yù)編譯的。即使你一個模塊已經(jīng)調(diào)試無誤,但只要數(shù)據(jù)庫結(jié)構(gòu)改動。相應(yīng)的模塊就一定要重新修改,否則一定會出問題。
圖書借閱管理系統(tǒng)數(shù)據(jù)庫中各個表的設(shè)計結(jié)果如下面幾個表格所示。每個表格表示為數(shù)據(jù)庫中的一個表。
一、 圖書基本信息表(book)
列名 數(shù)據(jù)類型 長度 允許為空
圖書編號 decimal 9 Not null
ISBN varchar 50 Not null
載體形式 tinyint 1 Not null
圖書名稱 varchar 40 Not null
圖書語言 tinyint 1 Not null
圖書類別 int 4 Not null
圖書狀態(tài) tinyint 1 Not null
操作員 varchar 10 Not null
存放位置 int 4
讀者 int 4
借出日期 smalldatetime 4
歸還日期 smalldatetime 4
圖書作者1 varchar 20
圖書作者2 varchar 20
出版社名稱 varchar 50
出版日期 smalldatetime 4
頁數(shù) int 4
關(guān)鍵詞 varchar 40
簡介 varchar 255
等級日期 smalldatetime 4
封面 image 16
備注 varchar 255
2、讀者基本信息表(people)
列名 數(shù)據(jù)類型 長度 允許為空
編號 int 4 Not null
姓名 varchar 10 Not null
密碼 varchar 10 Not null
類別 int 4 Not null
允許借書量 int 4 Not null
已借書量 int 4 Not null
性別 tinyint 1
工作單位 varchar 40
住址 varchar 40
電話 varchar 15
登記日期 smalldatetime 4
照片 image 16
備注 varchar 255
3、圖書形式基本信息表(form)
列名 數(shù)據(jù)類型 長度 允許為空
編號 tinyint 1 Not null
值 varchar 10 Not null4、圖書類別基本信息表(kind)
列名 數(shù)據(jù)類型 長度 允許為空
編號 int 4 Not null
值 varchar 10 Not null5、圖書語言基本信息表(lang)
列名 數(shù)據(jù)類型 長度 允許為空
編號 tinyint 1 Not null
值 varchar 10 Not null6、圖書管理員基本信息表(librarian)
列名 數(shù)據(jù)類型 長度 允許為空
登錄名 varchar 10 Not null
密碼 varchar 10 Not null
權(quán)限 tinyint 1 Not null
姓名 varchar 10 Not null
性別 tinyint 1
出生日期 smalldatetime 4
職務(wù) varchar 10
照片 image 16
備注 varchar 255 7、圖書館地點基本信息表(place)
列名 數(shù)據(jù)類型 長度 允許為空
編號 int 4 Not null
值 varchar 10 Not null8、讀者種類基本信息表(readerkind)
列名 數(shù)據(jù)類型 長度 允許為空
編號 int 4 Not null
值 vrchar 10 Not null
允許借書量 int 4 Not null
借閱天數(shù) int 4 Not null9、圖書狀態(tài)基本信息表(state)
列名 數(shù)據(jù)類型 長度 允許為空
編號 tinyint 1 Not null
值 varchar 10 Not null(1)規(guī)劃有效的索引
1.在組合表的列中創(chuàng)建索引,包括主關(guān)鍵字和外部關(guān)鍵字所在的列。
2.在列或類組合中創(chuàng)建唯一的索引能增強唯一性。
3.瀏覽索引并卸載不使用的索引。索引需要一定硬盤空間和時間來維護。具有較高數(shù)據(jù)插入操作頻率的數(shù)據(jù)庫最好不要索引。有較高讀操作頻率的數(shù)據(jù)庫應(yīng)該有更多的索引。
4.避免在簇索引中包括不必要的列。在可能的情況下,使用較小的數(shù)據(jù)類型,例如用varchar替代char。
5.考慮使用簇索引來支持排序和范圍化查詢。在為數(shù)據(jù)檢索優(yōu)化表時,簇索引必須支持數(shù)據(jù)的分組索引。為簇關(guān)鍵字選擇列或列組,簇關(guān)鍵字以經(jīng)常需要的順序排序數(shù)據(jù)或以必須被一起訪問的記錄而分組記錄。
6.創(chuàng)建支持一般查詢的查找參數(shù)索引。具有高選擇性的列是索引的最好候選列。具有高密度的列是索引糟糕的候選列。
(2)使用約束實現(xiàn)數(shù)據(jù)的完整性
PRIMARY KEY約束在表中定義了主關(guān)鍵字,它是行唯一的標識符,它可以強制實體完整性。在使用PRIMARY KEY約束時考慮以下事實:
1.每個表只能有一個PRIMARY KEY約束。
2.鍵入的值必須是唯一的。
3.不允許有空值。
4.PRIMARY KEY約束在指定的列創(chuàng)建唯一的索引,可以指定簇索引和非
索引(如果 非簇索引先前并不存在,簇索引是默認的)。
UNIQUE約束指定,在一列中的兩行不能有相同的值。該約束使用唯一的索引來強制實體的完整性。在已有一個主關(guān)鍵字時UNIQUE約束很有用,例如雇員號,但是必須保證其他標識符(例如,雇員駕駛證號)也是唯一的。在使用UNIQUE約束時,考慮以下事實;
1.允許有空值。
2.在一個表中可以設(shè)置多個UNIQUE約束。
3.可以將UNIQUE約束運用于具有唯一值的單列或多列,但不能用于表的主關(guān)鍵字。
4.通過在指定的列或列組中創(chuàng)建唯一的索引,可以使UNIQUE索引得到強制
第五章 圖書管理系統(tǒng)的具體實施
第一節(jié) PowerBuilder開發(fā)工具簡介
數(shù)據(jù)庫應(yīng)用是當前計算機應(yīng)用的一個非常重要的方面,而在目前的數(shù)據(jù)庫應(yīng)用技術(shù)中普遍采用的就是客戶機/服務(wù)器體系結(jié)構(gòu),在這種體系結(jié)構(gòu)中,所有的數(shù)據(jù)和數(shù)據(jù)庫管理系統(tǒng)都在服務(wù)器上,客戶機通過采用標準的SQL語句等方式來訪問服務(wù)器上數(shù)據(jù)庫中的數(shù)據(jù)。由于這種體系結(jié)構(gòu)把數(shù)據(jù)和對數(shù)據(jù)的管理都統(tǒng)一放在了服務(wù)器上。就保證了數(shù)據(jù)的安全性和完整性,同時也可以充分利用服務(wù)器高性能的特點。正因為客戶機/服務(wù)器體系結(jié)構(gòu)的這些優(yōu)點,因而得到了非常廣泛的應(yīng)用。
PowerBuilder是完全按照客戶機/服務(wù)器體系結(jié)構(gòu)研制設(shè)計,在客戶機/服務(wù)器結(jié)構(gòu)中,它使用在客戶機中,作為數(shù)據(jù)庫應(yīng)用程序的開發(fā)工具而存在。由于PowerBuilder采用了面向?qū)ο蠛涂梢暬夹g(shù),提供可視化的應(yīng)用開發(fā)環(huán)境,使得我們利用PowerBuilder,可以方便快捷地開發(fā)出利用后臺服務(wù)器中的數(shù)據(jù)和數(shù)據(jù)庫管理系統(tǒng)的數(shù)據(jù)庫應(yīng)用程序。
在當前,網(wǎng)絡(luò)技術(shù)迅速發(fā)展,隨之發(fā)展的還有OLE,OCX,跨平臺等技術(shù),而在PowerBuilder的最新版PowerBuilder 9.0中提供了對這些技術(shù)的全面支持。總之在數(shù)據(jù)庫開發(fā)工具領(lǐng)域,PowerBuilder是其中非常優(yōu)秀的一個,利用它我們可以開發(fā)出功能強大的數(shù)據(jù)庫應(yīng)用程序。
第二節(jié) SQL Server后臺數(shù)據(jù)庫管理系統(tǒng)
本系統(tǒng)的開發(fā)選擇了SQL數(shù)據(jù)庫。SQL是MS SQL Server的簡述,是世界上及國內(nèi)比較流行的關(guān)系數(shù)據(jù)庫管理系統(tǒng)。它適用于中小型事物處理及客戶端/服務(wù)端結(jié)構(gòu)的應(yīng)用系統(tǒng)。它功能強大操作簡便,日益為廣大數(shù)據(jù)庫用戶所喜愛。越來越多的開發(fā)工具提供了與SQL Server的接口。SQL Server 是一個關(guān)系數(shù)據(jù)庫管理系統(tǒng),它最初是由Microsoft、Sybase 和Ashton-Tate三家公司共同開發(fā)的。于1988 年推出了第一個OS/2 版本,在Windows NT 推出后,Microsoft與Sybase 在SQL Server 的開發(fā)上就分道揚鑣了,Microsoft 將SQL Server 移植到Windows NT系統(tǒng)上,專注于開發(fā)推廣SQL Server 的Windows NT 版本。
SQL Server 2000 是Microsoft 公司推出的SQL Server 數(shù)據(jù)庫管理系統(tǒng)的最新版本,該版本繼承了SQL Server 7.0 版本的優(yōu)點,同時又比它增加了許多更先進的功能、具有使用方便、可伸縮性好與相關(guān)軟件集成程度高等優(yōu)點。可跨越從運行Microsoft Windows 98 的膝上型電腦到運行Microsoft Windows 2000 的大型多處理器的服務(wù)器等多種平臺使用。MS SQL Server不但可以應(yīng)用于大中型數(shù)據(jù)庫管理中,建立分布式關(guān)系數(shù)據(jù)庫,并且也可以開發(fā)桌面數(shù)據(jù)庫。事實上,SQL Server數(shù)據(jù)庫處理的基本結(jié)構(gòu),采取關(guān)系型數(shù)據(jù)庫模式,盡管如此,相信大家都可以輕易的發(fā)現(xiàn),在SQL Server的數(shù)據(jù)庫處理方式,則是使用面向?qū)ο蟮牟僮鞣绞脚c精神,也就是說,SQL Server的所有功能,都可以基于系統(tǒng)已經(jīng)建立好的一些對象來達成,是相當OO(面向?qū)ο?的一個系統(tǒng)結(jié)構(gòu)。
SQL Server 企業(yè)管理器是 SQL Server 的主要管理工具,它提供了一個遵從 MMC 標準的用戶界面,使用戶得以:
定義 SQL Server 實例組。
將個別服務(wù)器注冊到組中。
為每個已注冊的服務(wù)器配置所有 SQL Server 選項。
在每個已注冊的服務(wù)器中創(chuàng)建并管理所有 SQL Server 數(shù)據(jù)庫、對象、登錄、用戶和權(quán)限。
在每個已注冊的服務(wù)器上定義并執(zhí)行所有 SQL Server 管理任務(wù)。
通過喚醒調(diào)用 SQL 查詢分析器,交互地設(shè)計并測試 SQL 語句、批處理和腳本。它支持中小型數(shù)據(jù)庫,多用戶的高性能和事物處理,支持分布式數(shù)據(jù)庫和分布處理,能夠?qū)崿F(xiàn)安全性和完整性控制,具有可移植性、可兼容性和可聯(lián)結(jié)性,它具有良好的數(shù)據(jù)管理能力和良好的開發(fā)性。
第三節(jié) Powerbuilder 9應(yīng)用程序開發(fā)的基本步驟
我們要開發(fā)應(yīng)用程序時,首先要對它進行分析。無論哪種、哪方面的應(yīng)用程序,都要先建立一個應(yīng)用對象。下面我們介紹以下PowerBuilder 9應(yīng)用程序開發(fā)的基本步驟:
(1)首先要建立應(yīng)用對象。
(2)創(chuàng)建窗口。在窗口里放置各種控件和編寫事件響應(yīng)的腳本。
(3)創(chuàng)建菜單。窗口里的菜單可包括菜單條,下拉式菜單,級聯(lián)菜單和彈出式菜單為菜單編寫事件響應(yīng)的腳本。
(4)創(chuàng)建用戶對象。如果想要重復(fù)使用某個控件的功能,可以把窗口上經(jīng)常放置的控件定義為用戶對象。
(5)創(chuàng)建數(shù)據(jù)窗口。數(shù)據(jù)窗口可以檢索數(shù)據(jù)庫中的數(shù)據(jù),可以建立各種報或統(tǒng)計表,可以修改數(shù)據(jù)庫。
(6)創(chuàng)建函數(shù)、結(jié)構(gòu)、事件。為了能夠更好地支持腳本,編寫自定義的函數(shù),定義結(jié)構(gòu)類型變量,也可以為對象和控件定義自己的事件。
(7)運行與調(diào)試。可以在開發(fā)環(huán)境中隨時運行應(yīng)用程序,發(fā)現(xiàn)錯誤后,可以用調(diào)試工具進行調(diào)試。
(8)當應(yīng)用程序開發(fā)完畢后,可以把它編譯成可執(zhí)行的文件,讓用戶比較容易地建立應(yīng)用系統(tǒng)的運行環(huán)境。
第四節(jié) 編碼規(guī)范
在軟件開發(fā)過程中 ,為了減少在軟件開發(fā)過程中的錯誤,應(yīng)該遵守一定標準。
給對象命名要有一定的規(guī)范,部件名稱可以達到40個字符,窗口的命名:W_功能代碼_功能描述。數(shù)據(jù)窗口的命名:DW_功能代碼_功能描述。菜單命名:W_功能代碼_功能描述。
標識符命名時,應(yīng)該使標識符有一定的字面含義,有助于程序的調(diào)試和腳本的可讀性的提高。本系統(tǒng)中使用的命名規(guī)范為:變量作用域+變量類型+”_”+具有一定字面含義的名稱。例如:li_selectrow反映出的含義:”l”代表是本地變量,是local的縮寫,”i”代表是integer類型的變量,selectrow表示該變量是用來記錄一個行號的計數(shù)器。
第五節(jié) 創(chuàng)建祖先窗口和全局函數(shù)
為充分利用PB的面向?qū)ο蟮奶匦。程序開發(fā)時一般創(chuàng)建幾個模板窗口。將功能窗口上的某些常用功能封裝在模板窗口中。然后將這些模板窗口作為祖先窗口。所有的子孫窗口都可以通過繼承的方法來生成。這樣就減少了代碼的書寫量。使得整個程序界面保持整齊。當修改祖先窗口時,所有的子孫窗口都會自動修改。所以,祖先窗口的確定要十分謹慎。
全局函數(shù)與局部函數(shù)的作用類似。唯一不同的是全局函數(shù)的作用域是整個程序周期。不論你在任何一個模塊的代碼中都可以調(diào)用它。所以我們可以把某些常用功能寫成全局函數(shù)。在程序的其他地方反復(fù)調(diào)用。
一、 函數(shù)setmenu(character lev)
功能介紹:通過傳入的gi_right值,將某些菜單項設(shè)為“非使能”,以限制某些功能的使用。gi_right值即不同職責(zé)的權(quán)限(讀者-1、普通圖書管理員1、高級圖書管理員 2、 超級管理員3)。
二、 函數(shù)countday
countday (date date1,date date2)
功能介紹:通過傳入的date1(起始日期)值與date2(結(jié)束日期)值,計算出中間相差的天數(shù),返回值為integer型。
代碼分析:
int day
day=(integer(year(date2)) - integer(year(date1)))*365 +&
(integer(month(date2)) - integer(month(date1)))*30 +&
(integer(day(date2)) - integer(day(date1)))*1
return day
第六節(jié) 應(yīng)用程序?qū)ο?App_librarain
功能介紹:PB程序由一個應(yīng)用程序開始,即每個PB程序在開始運行時,先執(zhí)行應(yīng)用程序?qū)ο蟮腛pen事件。在Open事件中連接數(shù)據(jù)庫,并打開登陸窗口w_login。
代碼分析:
SQLCA.DBMS = "MSS Microsoft SQL Server"
SQLCA.Database = "ch4ckgl"
SQLCA.LogPass =ProfileString(".\data.dat",&
"SQLCA","LogPass","super1234") //從參數(shù)文件得到登錄密碼
SQLCA.ServerName = ProfileString(".\data.dat",&
"SQLCA","ServerName","localhost") //從參數(shù)文件得到數(shù)據(jù)庫服務(wù)器名
SQLCA.LogId ="sa"
SQLCA.AutoCommit = False
SQLCA.DBParm = ""
connect;
open(w_login)
第六章 具體窗口的實現(xiàn)
第一節(jié) 登錄窗口
圖6.1 登陸窗口
功能介紹:本窗口主要是檢查操作員輸入的用戶名及密碼是否正確,如果正確,允許登錄。如果錯誤,顯示出錯誤提示。
操作方法:填寫“用戶名”與“密碼”后,點擊“登錄”按鈕進行驗證,點擊“取消”退出。
第二節(jié) 主窗口
功能介紹:本窗口作為菜單及其他子窗口的容器。
窗口設(shè)置;本窗口為容器窗口。表示本窗口為多文檔界面,可以有菜單、工具欄與狀態(tài)欄。
圖6.2 主窗口界面
第三節(jié) 新書入庫窗口
圖6.3 新書入庫
功能介紹:增加信息。
操作方法:
點擊“出庫入庫”按鈕,填寫圖書信息,完成后點擊“保存”按鈕
代碼分析:
“保存”按扭事件:
long ll_id,ll_i
//得到最大的圖書編號
select max(圖書編號) into :ll_id from book;
if sqlca.sqlcode=0 then //成功
il_amount=dw_2.getitemnumber( 1,"圖書編號")
dw_2.setredraw( false) //不自動刷新數(shù)據(jù)窗口
for ll_i=1 to il_amount
ll_id=ll_id+1
dw_2.setitem( 1,"圖書編號", ll_id)
//必須對數(shù)據(jù)窗口的狀態(tài)進行設(shè)置才能多次插入數(shù)據(jù)
//只有將行設(shè)置為NewModified!才能插入,設(shè)置列列不行的
dw_2.setitemstatus( 1,0, Primary!,NewModified!)
if dw_2.update( )<>1 then
messagebox("錯誤","插入圖書記錄失敗!",stopsign!)
rollback;
return //退出
end if
commit;
next
dw_2.setitem( 1,"圖書編號",il_amount)
dw_2.setredraw( true)
else
messagebox("錯誤","查找最大的圖書編號時出現(xiàn)錯誤!",stopsign!)
end if
il_startid=(ll_id - il_amount)+1 //如果沒有出現(xiàn)錯誤,則得到起始編號
messagebox("成功","圖書入庫成功!")
cb_refresh.triggerevent( clicked!)
this.enabled=false
第四節(jié) 舊書出庫窗口
圖6.4 圖書出庫窗口
功能介紹:刪除圖書信息。
操作方法:首先通過圖書編號檢索出圖書信息,然后點擊“出庫”按鈕注銷圖書。
第五節(jié)讀者類型管理窗口
圖6.5 讀者類型管理窗口
功能介紹:管理讀者類型信息。
操作方法:可以通過”添加”、“刪除“、“保存”等按扭對讀者類型做相應(yīng)的操作。
代碼分析:
“刪除”按扭事件:
integer li_row,li_re
string ls_name
li_row=dw_1.getrow( )
ls_name=dw_1.getitemstring( li_row, "值")
li_re=messagebox("提示","是否刪除用戶類型:"+ls_name+"?",Question!,YesNO!)
if li_re=1 then
dw_1.deleterow( li_row)
li_re=dw_1.update( )
if li_re=1 then
commit;
else
messagebox("提示","刪除用戶類型:"+ls_name+"失敗!")
rollback;
end if
end if
第六節(jié) 借閱人管理窗口
圖6.6 讀者維護管理窗口
功能介紹:增加、查詢、刪除、修改借閱人等信息
操作方法:其中添加按扭類同“新書入庫窗口”的入庫按扭,其它都是對圖書做簡單的修改、查詢和刪除按扭。詳細代碼在此不一一列舉。
第七節(jié) 圖書維護窗口
圖6.7圖書維護窗口
功能介紹:查詢、添加、修改、刪除圖書基本信息。
操作方法:類同其它信息添加、修改和刪除功能。