易語言的數(shù)據(jù)庫功能大部分基于XBASE 方式,所以您如果曾經(jīng)接觸過 XBASE 數(shù)據(jù)庫系統(tǒng)中的任何一款,如:DBASE、FOXBASE、FOXPRO等等,就能夠相當快地了解并應(yīng)用易語言的數(shù)據(jù)庫。
所有易語言數(shù)據(jù)庫支持命令的具體解釋請在數(shù)據(jù)庫命令參考手冊中查看,下面介紹一些概念和編程應(yīng)用知識。
一、易語言數(shù)據(jù)庫文件的組成:
.edb | 數(shù)據(jù)庫主文件 |
.edt | 數(shù)據(jù)庫輔助數(shù)據(jù)文件,僅在數(shù)據(jù)庫中存在備注型或者字節(jié)集型字段時 才存在,文件名稱除了后綴外與數(shù)據(jù)庫主文件相同,它必須與.edb文件放在同一目錄中。 |
.enx | 數(shù)據(jù)庫索引文件。使用 B+ 樹結(jié)構(gòu),由用戶根據(jù)需要自行創(chuàng)建,用作加快記錄的查找速度。 |
二、數(shù)據(jù)庫的內(nèi)部結(jié)構(gòu):
易語言數(shù)據(jù)庫由行和列組成,如下面的數(shù)據(jù)庫內(nèi)容:
其中每一行被稱為一條記錄,每一列稱為一個字段。如上面的數(shù)據(jù)庫就有四條記錄和四個字段。
字段具有“名稱”、“類型”、“最大文本長度”三個屬性,有關(guān)介紹如下:
<1>、名稱: 字段名稱文本的長度必須在 16 個字符以內(nèi);(一個英文字母為一個字符長度,一個中文為兩個字符長度)
<2>、類型: 可以為以下常量值之一: 1、#字節(jié)型; 2、#短整數(shù)型; 3、#整數(shù)型; 4、#長整數(shù)型; 5、#小數(shù)型;6、#雙精度小數(shù)型; 7、#邏輯型; 8、#日期時間型; 10、#文本型; 11、#字節(jié)集型; 12、#備注型;
<3>、最大文本長度: 此屬性僅當字段類型為“文本型”時才有效,用作指定文本的最大可能長度,其值范圍必須在 1 到 1024 之間。如果字段類型不為“文本型”,本屬性無效。當寫入數(shù)據(jù)到數(shù)據(jù)庫中的文本型字段內(nèi)時,多出的部分將被自動剪切。
三、系統(tǒng)中的“數(shù)據(jù)庫”菜單功能:
您可以使用“數(shù)據(jù)庫”菜單下的“結(jié)構(gòu)編輯器”來創(chuàng)建一個指定結(jié)構(gòu)的數(shù)據(jù)庫或者修改一個已存在數(shù)據(jù)庫的現(xiàn)有結(jié)構(gòu)。然后,使用“記錄編輯器”可以加入或修改初始記錄數(shù)據(jù)。
值得告訴大家的是:這兩個菜單功能皆通過調(diào)用 dbmanger.exe 文件(由 dbmanger.e 易程序生成)來完成,dbmanger.e 源程序已經(jīng)隨系統(tǒng)一起提供,用戶可以對其進行修改或者擴充,使之更能滿足您的需要。
下面介紹一些數(shù)據(jù)庫應(yīng)用程序中常用的編程知識,首先請下載并查看一下示例工資數(shù)據(jù)庫 工資.edb ,其結(jié)構(gòu)如下:
其中的“實發(fā)”字段在本數(shù)據(jù)庫中并沒有被實際使用,僅用作方便對某些命令進行舉例。
一、編程前的準備工作:
強烈推薦:在開始編寫數(shù)據(jù)庫應(yīng)用程序之前,請將程序中所需使用數(shù)據(jù)庫的名稱及其內(nèi)所有字段名設(shè)置為常量,因為常量可以使用系統(tǒng)內(nèi)部的輸入法來很快地輸入。如:上面數(shù)據(jù)庫內(nèi)具有一個名稱為“姓名”的字段,如果此字段名已經(jīng)被設(shè)置為了常量,那么在程序中需要引用它時可以簡單地輸入 #xm , 而如果沒有設(shè)置為常量,您就必須使用Windows 系統(tǒng)的輸入法來一個字一個字地輸入 “姓名” ,這樣豈非太麻煩了嗎?為了讓您能夠快速地加入所有的相關(guān)數(shù)據(jù)庫常量,在“數(shù)據(jù)庫”菜單下有一個“加入數(shù)據(jù)庫常量”功能,使用此功能可以一次性將指定數(shù)據(jù)庫的名稱及其所有字段名加入為常量。下面的講述中假設(shè)您已經(jīng)做了此準備工作。
二、數(shù)據(jù)庫本身的常用操作:
1、創(chuàng)建數(shù)據(jù)庫:
欲在程序中創(chuàng)建數(shù)據(jù)庫請使用“創(chuàng)建”命令,如欲創(chuàng)建上面的示例工資數(shù)據(jù)庫工資.edb ,可以使用類似以下代碼:
2、打開數(shù)據(jù)庫:
欲打開指定數(shù)據(jù)庫,請使用“打開”命令。可以同時打開多個數(shù)據(jù)庫(其數(shù)目僅受 Windows 操作系統(tǒng)限制)。
注意易語言的數(shù)據(jù)庫拋棄了XBASE 的工作區(qū)概念,以便可以同時打開更多的數(shù)據(jù)庫。
3、置當前數(shù)據(jù)庫:
系統(tǒng)內(nèi)部有一個“當前數(shù)據(jù)庫”狀態(tài)值,它被用來指向某一個已被打開的數(shù)據(jù)庫。絕大部分數(shù)據(jù)庫操作命令都針對當前數(shù)據(jù)庫,譬如:記錄指針的移動、字段的讀寫等等。用戶可以使用“置當前庫”命令來改變系統(tǒng)中“當前數(shù)據(jù)庫”狀態(tài)值的指向。如:
4、關(guān)閉數(shù)據(jù)庫:
欲關(guān)閉當前數(shù)據(jù)庫,請使用“關(guān)閉”命令。欲一次性關(guān)閉已打開的所有數(shù)據(jù)庫,請使用“全部關(guān)閉”命令。(如圖)
三、記錄范圍、字段范圍、數(shù)據(jù)庫表達式:
易語言中很多數(shù)據(jù)庫命令都支持定義記錄范圍和字段范圍,如:“復制記錄”命令能夠?qū)斍皵?shù)據(jù)庫的記錄復制到另外一個數(shù)據(jù)庫文件,其調(diào)用格式的后半部分如下:
復制記錄 (數(shù)據(jù)庫文件名,記錄條件,字段范圍,…)
其中,“記錄條件”參數(shù)即用作讓用戶定義記錄范圍,用戶需要使用一個子語句來提供參數(shù)數(shù)據(jù)。如,將示例數(shù)據(jù)庫中所有姓王的員工記錄都拷貝到新數(shù)據(jù)庫工資表.edb 中:
輸入方法:fzjl("工資表",d(#xm)?="王")
其中:讀 (#姓名) ≈ “王” 即是用作定義記錄范圍的子語句,這與XBASE 的格式基本一樣,只不過在 XBASE 中可以直接使用字段名稱,而易語言由于不是解釋型語言,所以使用讀 (xxx) 替換(其中 xxx 為字段名)。
假如您只想把示例數(shù)據(jù)庫中的“姓名”和“工資”字段復制過去,就需要使用字段范圍參數(shù):
字段范圍參數(shù)一般都為數(shù)據(jù)庫命令的最后一個參數(shù),以便讓用戶通過增加參數(shù)來同時提供多個字段,不過您也可以使用數(shù)組來做同樣的工作:
假如您想把數(shù)據(jù)庫中所有員工的工資都加上 100 元,就需要使用數(shù)據(jù)庫表達式。完成此工作的相關(guān)數(shù)據(jù)庫命令“替換”的調(diào)用格式的后半部分如下:
替換 (替換范圍,字段名稱或替換數(shù)據(jù),… )
其每一個“字段名稱或替換數(shù)據(jù)”參數(shù)對應(yīng)“字段名稱”、“替換數(shù)據(jù)”參數(shù)各一個。
語句如下:
其中,#工資為字段名稱,讀 (#工資)+ 100即為數(shù)據(jù)庫表達式,用作提供“工資”字段替換數(shù)據(jù)的獲取方法。
可以同時替換多個字段,如:
語句可以同時將“扣除”字段清零。
數(shù)據(jù)庫表達式中也可以同時使用多個字段,如:
語句可以計算出每一個員工的實發(fā)工資。
還有很多數(shù)據(jù)庫命令使用了數(shù)據(jù)庫表達式,如:
計算最大的實發(fā)工資并跳到其員工記錄:
根據(jù)實發(fā)工資排序到工資表.edb :
四、當前記錄指針:
每一個被打開的數(shù)據(jù)庫都有一個“當前記錄指針”狀態(tài)值,它指向數(shù)據(jù)庫中的某一條記錄,用作為一些記錄讀寫命令提供位置指示。如:“讀”、“寫”、“刪除”等等。它除了指向正常的記錄外,還可能具有以下狀態(tài)值之一:
1、首記錄前。表明當前記錄指針已經(jīng)移動到了數(shù)據(jù)庫首記錄的前面,此時如果執(zhí)行讀寫當前記錄的命令肯定會失敗,因為無法找到對應(yīng)的記錄讀寫位置。使用“首記錄前”命令可以測試到此狀態(tài)值;
2、尾記錄后。表明當前記錄指針已經(jīng)移動到了數(shù)據(jù)庫最后一條記錄的后面,此時如果執(zhí)行讀寫當前記錄的命令也會失敗。使用“尾記錄后”命令可以測試到此狀態(tài)值;
使用“取記錄號”命令可以取回當前記錄指針所指向記錄的編號(從 1 開始)。如果為 0 ,表示在首記錄前,如果大于最大記錄編號,表明在尾記錄后。
“到首記錄”命令可以將當前記錄指針移動到數(shù)據(jù)庫的首記錄上,“到尾記錄”命令可以將當前記錄指針移動到數(shù)據(jù)庫的最后一條記錄上?!疤^”命令可以相對移動當前記錄指針值。
通過移動當前記錄指針,我們可以遍歷數(shù)據(jù)庫中的所有記錄:
反向遍歷:
五、讀寫字段:
記錄字段的讀寫均在當前數(shù)據(jù)庫的當前記錄處進行,主要為以下命令:
1、“讀”。如:
2、“寫”。如:
3、“讀字段”和“寫字段”可以讀寫非當前數(shù)據(jù)庫內(nèi)的記錄字段;
4、“修改”命令可以一次性修改當前記錄的多個字段。如:
六、添加記錄:
使用“加空記錄”命令可以在當前數(shù)據(jù)庫的尾部添加一條新的空記錄。
使用“加記錄”命令可以同時提供欲添加數(shù)據(jù)。如:
使用“添加”命令可以將其它數(shù)據(jù)庫內(nèi)的記錄添加到本數(shù)據(jù)庫,如: 添加 (“工資表”, ,) 可以將 工資表edb 數(shù)據(jù)庫中的所有記錄添加到當前數(shù)據(jù)庫的尾部;
七、刪除記錄:
與 XBASE 數(shù)據(jù)庫一樣,記錄使用“刪除”命令刪除,但刪除后并不馬上從數(shù)據(jù)庫中清除,僅僅只被加上一個刪除標記,依舊存在并可以正常訪問。只有當執(zhí)行“徹底刪除”命令后,這些被加上刪除標記的記錄才會被從數(shù)據(jù)庫中真正清除。
使用“是否已刪除”命令可以查看當前記錄是否被加上了刪除標記,被加上刪除標記的記錄可以使用“恢復刪除”命令取消其刪除標記。
使用“清空”命令可以徹底刪除當前數(shù)據(jù)庫內(nèi)的所有記錄。
八、查找記錄:
查找記錄有兩種方法:不使用索引和使用索引。
1、不使用索引:
查找在示例數(shù)據(jù)庫中所有姓王的員工記錄的方法類似如下:
到首記錄() 如果當前記錄指針在首記錄上,則不需要此語句。
判斷循環(huán)首 (查找 (讀 (#姓名) ≈ “王”))
進行所需操作。
跳過()
判斷循環(huán)尾 ()
注意與 XBASE 不同的是:易語言的查找從當前記錄開始。
與易語言中的拼音處理類命令結(jié)合可以解決在漢字中極常見的近音搜尋問題:
語句中的“刪全部空”命令用作預先去除字段數(shù)據(jù)中可能存在的全半角空格,如果確定所有記錄的該字段數(shù)據(jù)中都不存在空格,可以去掉此命令。
第一條語句可以查找出當前數(shù)據(jù)庫中所有姓名發(fā)音為“王屋”的員工,如:“王五”、“王舞”等等;第二條語句完成類似的工作,不過使用的是全拼拼音編碼;第三條語句使用的是首拼拼音編碼。
2、使用索引:
可以使用結(jié)構(gòu)管理器預先在 工資.edb上建立索引文件,也可以在程序中創(chuàng)建:
上面的語句建立了一個名為 工資.enx的索引文件,它基于示例數(shù)據(jù)庫的“姓名”字段,您也可以建立基于多個字段的索引文件。
索引只有被打開后才能被使用。使用“新建索引”命令新建的索引會被自動打開并設(shè)置為當前索引。對于已經(jīng)存在的索引文件,您必須在打開數(shù)據(jù)庫時同步打開:
在數(shù)據(jù)庫中搜尋所有姓名為“王五”的員工:
為了解決近音漢字搜尋問題,易語言中可以建立發(fā)音索引文件:
使用發(fā)音索引文件即可進行近音搜尋,如:
在打開數(shù)據(jù)庫時應(yīng)該使用其“索引文件表”參數(shù)同時打開所有的索引文件,以便索引文件能夠得到及時的更新。您也可以使用“更新索引”命令來強制更新當前索引文件。
九、查看數(shù)據(jù)庫命令是否執(zhí)行成功:
大多數(shù)的數(shù)據(jù)庫命令執(zhí)行完畢后都會返回一個邏輯值,表明是否執(zhí)行成功。但是也有一部分命令無法做到這一點,如:“取最大值”等。
您可以在任何數(shù)據(jù)庫命令執(zhí)行完畢后立即調(diào)用“取錯誤碼”命令來查看其是否執(zhí)行成功。如果成功,“取錯誤碼”命令將返回 0 ,否則將返回一個非 0 的錯誤值。
另外,如果發(fā)現(xiàn)命令執(zhí)行失敗,立即調(diào)用“取錯誤信息”命令可以取回對應(yīng)的錯誤信息文本,當然是全中文的。