第十六章 Borland Database Engine
-
Upload
david-wilcox -
Category
Documents
-
view
57 -
download
0
description
Transcript of 第十六章 Borland Database Engine
![Page 1: 第十六章 Borland Database Engine](https://reader035.fdocuments.net/reader035/viewer/2022081418/56812a9b550346895d8e5371/html5/thumbnails/1.jpg)
第十六章 Borland Database Engine
16-1 Form Wizard 16-2 Table 與連繫物件 16-3 Table 屬性與方法 16-4 Query 16-5 資料庫與統計圖
![Page 2: 第十六章 Borland Database Engine](https://reader035.fdocuments.net/reader035/viewer/2022081418/56812a9b550346895d8e5371/html5/thumbnails/2.jpg)
16-1 Form Wizard Form Wizard 是一種精靈的方式,一步
一步指導使用者建立輸出入表單,請看以下範例說明。
![Page 3: 第十六章 Borland Database Engine](https://reader035.fdocuments.net/reader035/viewer/2022081418/56812a9b550346895d8e5371/html5/thumbnails/3.jpg)
範例 16-1a 請使用 Form Wizard 建立一個 fri.db 的輸
出入表單。
![Page 4: 第十六章 Borland Database Engine](https://reader035.fdocuments.net/reader035/viewer/2022081418/56812a9b550346895d8e5371/html5/thumbnails/4.jpg)
16-2 Table 與連繫物件 在資料庫程式設計裡,常見的資料存取方式是
透過本單元的連繫物件,逐一巡覽、編輯資料庫,利用此一方式存取資料可不用寫任何程式,即可完成資料編輯任務,其缺點是只能逐筆由使用者目視搜尋。
另一種資料存取方式是自己寫程式進行資料編輯,這種方式比較彈性,您可以自己下達指令進行記錄的新增、或搜尋後修改、刪除等任務,請看 16-3 節。
![Page 5: 第十六章 Borland Database Engine](https://reader035.fdocuments.net/reader035/viewer/2022081418/56812a9b550346895d8e5371/html5/thumbnails/5.jpg)
資料連繫物件 Delphi 的資料連繫元件,如下圖所示,這些元
件可以配合各種資料源物件(例如 BDE 、 ADO 、 dbExpress 或 InterBase )來展示資料表的記錄,讓程式設計者不用任何程式即可完成資料的編輯動作 。
Delphi 的資料連繫物件有二維表格的 DBGrid(請看範例 16-2a ),個別欄位的連繫物件則有 DBText 、 DBEdit 、 DBMemo 、 DBImage ,讓程式設計者不用寫任何程式即可逐筆瀏覽、新增、修改、刪除含有文字( Alpha )、備註( Memo )及圖形( Graphic )等型態的欄位,請看範例 16-2b 。
![Page 6: 第十六章 Borland Database Engine](https://reader035.fdocuments.net/reader035/viewer/2022081418/56812a9b550346895d8e5371/html5/thumbnails/6.jpg)
範例 16-2a 示範以 Table 物件配合二維表格連繫物件 DBGrid 存取 fri.db 的
內容補充說明 :
1. 以上 Table 、 DataSource 、 DBGrid 、 DBNavigator 元件關係,此即為 Borland 公司軟體 IC 的概念。也就是寫程式也像是組合數位 IC 一樣,是由已完成的模組繼續擴張功能,而不是從零開發,此種軟體 IC 的觀念方能縮短程式設計師開發軟體的時間。
2. 以上使用 DBGrid 作為資料連繫物件,其優點為步驟簡單,但尚無法輸入 Graphic 類型的欄位(本例為 Pic 欄),且輸入資料方式親和性不足,下一個範例將使用 DBEdit 、 DBMemo 、 DBImage 及 DBRadioGroup 等元件展示資料表的內容
3. 使用連繫物件展示資料庫的內容均只要設定 DataSource 屬性指向 DataSource 物件,再將 DataField 屬性指向欲展示的欄位即可
![Page 7: 第十六章 Borland Database Engine](https://reader035.fdocuments.net/reader035/viewer/2022081418/56812a9b550346895d8e5371/html5/thumbnails/7.jpg)
範例 16-2b 示範個別欄位連繫物件的使用。
![Page 8: 第十六章 Borland Database Engine](https://reader035.fdocuments.net/reader035/viewer/2022081418/56812a9b550346895d8e5371/html5/thumbnails/8.jpg)
欄位編輯器 以上都是透過人工的方式連繫資料庫,
Delphi 另有一種資料連繫方式,稱為欄位編輯器,也可以縮短應用程式的開發。
它的優點是程式設計者可以將欄位編輯器的欄位物件直接拖曳到表單,即可完成輸出入表單的製作。
此外,欄位編輯器另有兩種特殊欄位,分別是計算欄位與查閱欄位。
![Page 9: 第十六章 Borland Database Engine](https://reader035.fdocuments.net/reader035/viewer/2022081418/56812a9b550346895d8e5371/html5/thumbnails/9.jpg)
計算欄位 依據資料庫正規化的規則,可計算而得的欄位
不能放入資料庫。所以,若某一欄位可由同一資料庫的某些資料表的某些欄位計算而得,則稱此欄位為計算欄位,則此欄位不能存入資料庫。例如,若某一資料表已有國文、英文與數學成績,則此三科的平均,並不能儲存入資料庫,往後若要求其平均,均要自行計算。
為了減輕程式設計師的負擔, Delphi 便提供“計算欄位”供程式設計師使用。關於計算欄位的使用,請看範例 16-2d 。
![Page 10: 第十六章 Borland Database Engine](https://reader035.fdocuments.net/reader035/viewer/2022081418/56812a9b550346895d8e5371/html5/thumbnails/10.jpg)
查閱欄位 依據資料正規化的規則,為求欄位內容的單一
性,任何欄位均只能同在一資料庫出現一次。所以,若某一欄位需要在不同的欄位重覆引用,則應將此欄位先以代碼表示,然後任一資料表需引用此欄位時,均以代碼表示。例如,學校的成績處理系統,學生的名字已存在學生基本資料表,則每次在輸入成績資料時,便不能再輸入學生姓名,只能以學生代碼與成績的方式輸入,以免造成資料的重覆性。
所以在學生成績資料表中就沒有學生姓名,若要取得學生姓名,則可透過欄位編輯器的查閱欄位至學生基本資料表查閱而得,請看範例 16-2e 。
![Page 11: 第十六章 Borland Database Engine](https://reader035.fdocuments.net/reader035/viewer/2022081418/56812a9b550346895d8e5371/html5/thumbnails/11.jpg)
範例 16-2c 請以欄位編輯器展示 stugrd.db 的內容。
![Page 12: 第十六章 Borland Database Engine](https://reader035.fdocuments.net/reader035/viewer/2022081418/56812a9b550346895d8e5371/html5/thumbnails/12.jpg)
範例 16-2d 同上範例,但增加“平均”欄位,計算
國、英及數三科的平均。
![Page 13: 第十六章 Borland Database Engine](https://reader035.fdocuments.net/reader035/viewer/2022081418/56812a9b550346895d8e5371/html5/thumbnails/13.jpg)
範例 16-2e 同上範例,但增加查閱欄位,印出學生姓名補充說明 :
欲關聯的欄位均需事先索引才能順利取得關聯,如本例 stugrd.db 的 id 欄及 stuname的 id 欄均須事先製作索引。
![Page 14: 第十六章 Borland Database Engine](https://reader035.fdocuments.net/reader035/viewer/2022081418/56812a9b550346895d8e5371/html5/thumbnails/14.jpg)
主要/次要明細( Master/ Detail ) 於學生資料表中,通常一個學生含有許多次的考試成績,或於客戶資料表中,每一個客戶通常都有好幾筆交易,這就是一種一對多的關係,例如 stuname.db 是學生基本資料表, stugrd.db是每位學生的每次考試成績資料表,
以下範例將介紹如何於觀看學生基本資料表( stuname.db )時,能同時顯示指定學生的全部成績,此即為“主要 /次要明細”的功能。
![Page 15: 第十六章 Borland Database Engine](https://reader035.fdocuments.net/reader035/viewer/2022081418/56812a9b550346895d8e5371/html5/thumbnails/15.jpg)
範例 16-2f 以 Table 示範主要 /次要明細表。
![Page 16: 第十六章 Borland Database Engine](https://reader035.fdocuments.net/reader035/viewer/2022081418/56812a9b550346895d8e5371/html5/thumbnails/16.jpg)
16-3 Table 屬性與方法 上一節使用資料庫連繫物件 , 所以不用
任何程式即可瀏覽與編輯資料庫內容。其優點是省時省事 , 但這些功能對實務的進銷存等問題 ,還是不足 , 本章要說明的是 Table 屬性與方法如下 :
![Page 17: 第十六章 Borland Database Engine](https://reader035.fdocuments.net/reader035/viewer/2022081418/56812a9b550346895d8e5371/html5/thumbnails/17.jpg)
資料項屬性自行使用 Table 方法 , 可以使用上一節連繫物件存取資料項 , 若不使用連繫物件 ,則可以使用以下資料項屬性存取資料項。
Table.FieldValue [‘ 欄位名稱 ’ ];
Table [‘ 欄位名稱 ’ ];
Table.FieldByName (‘ 欄位名稱 ’ ). 型態轉換函數 ;
Table.Fields [ 欄位引索 ]. 型態轉換函數 ;
![Page 18: 第十六章 Borland Database Engine](https://reader035.fdocuments.net/reader035/viewer/2022081418/56812a9b550346895d8e5371/html5/thumbnails/18.jpg)
上式型態轉換函式可為 AsVariant 、 AsString 、AsInteger 、 AsFloat 、 AsCurrency 、 AsDateTime 、 AsBoolean ,其目的是將原始資料轉為與目的物件相同的資料型態。而以下式子均可取得 gradl.db 的 Name 欄位。
Edit.Text:=Table.FieldValues[‘ Name ’];
Edit.Text:=Table[‘ Name ’]; Edit.Text:=Table.FieldByName(‘ Name ’).AsString;
Edit.Text:=Table.Fields[0].AsString;
若已將欄位物件 (TField)加入欄位編輯器 , 則可使用欄位物件名稱 ,代表某一項資料項 , 如下式是代表存取 Name 欄位的內容。
Table1Name.ValueTable1Name.AsString
![Page 19: 第十六章 Borland Database Engine](https://reader035.fdocuments.net/reader035/viewer/2022081418/56812a9b550346895d8e5371/html5/thumbnails/19.jpg)
記錄指標 每一個資料集均有一個記錄指標。此記
錄指標的功能即為指向記錄編輯對象,也就是往後資料表的新增、修改與刪除對象均是此記錄指標所指的記錄。
![Page 20: 第十六章 Borland Database Engine](https://reader035.fdocuments.net/reader035/viewer/2022081418/56812a9b550346895d8e5371/html5/thumbnails/20.jpg)
Table 物件移動記錄指標的方式如下表:方法 or屬性 說明
First ( ) 將記錄指標移到資料表的第一筆記錄。 Last( ) 將記錄指標移到資料表的最後一筆記錄。 Next( ) 將記錄指標移到下一筆記錄。 Prior( ) 將記錄指標移到上一筆記錄。 MoveBy(n) 將記錄指標向上 (n < 0)或向下 (n > 0) 移 n筆記錄。
BOF 測試記錄指標是否在檔案開始處。
True :指記錄指標在資料表的第一筆。 False :記錄指標不是在資料表的第一筆。
EOF 測試記錄指標是否在檔案結束處。 True :記錄指標位在資料表的最後一筆。 False :記錄指標不是在資料表的最後一筆。
GetBookmark( ) 將資料表目前的記錄指標位置存入書籤元件內。 GotoBookmark( ) 將記錄指標移到指定的書籤位置。 FreeBookmark( ) 釋放出指定的書籤元件。
![Page 21: 第十六章 Borland Database Engine](https://reader035.fdocuments.net/reader035/viewer/2022081418/56812a9b550346895d8e5371/html5/thumbnails/21.jpg)
開啟或關閉資料表 Table 物件開啟或關閉資料表的方法如下表:Table 元件的方法 說 明Table1.Open ( ) 打開 Table1 資料表Table1.Close ( ) 關閉 Table1 資料表
(關閉資料表才能將已修正的資料回存硬碟)
![Page 22: 第十六章 Borland Database Engine](https://reader035.fdocuments.net/reader035/viewer/2022081418/56812a9b550346895d8e5371/html5/thumbnails/22.jpg)
範例 16-3a 示範各種記錄項屬性的用法與指標的移
動
![Page 23: 第十六章 Borland Database Engine](https://reader035.fdocuments.net/reader035/viewer/2022081418/56812a9b550346895d8e5371/html5/thumbnails/23.jpg)
增加或刪除記錄 增加或刪除一筆記錄的方法如下表:
Table 元件的方法 說 明Table1.Insert() 在目前記錄指標之前插入一筆空
白記錄,且記錄指標移到此記錄Table1.Delete()
刪除記錄指標所指的記錄
Table1.Append()
插入一筆空白記錄至資料表的最後,且記錄指標移到此記錄
![Page 24: 第十六章 Borland Database Engine](https://reader035.fdocuments.net/reader035/viewer/2022081418/56812a9b550346895d8e5371/html5/thumbnails/24.jpg)
編輯 (Edit) 或寫入 (Post)狀態 編輯或寫入狀態的設定方法如下表:
Table 元件的方法 說 明Table1.Edit() 設定資料表為編輯狀態(修改資料
前應先設定)。Table1.Post() 每次修改資料後應執行此敘述,才
會將資料寫入資料表內。
![Page 25: 第十六章 Borland Database Engine](https://reader035.fdocuments.net/reader035/viewer/2022081418/56812a9b550346895d8e5371/html5/thumbnails/25.jpg)
循序查詢(不用索引檔) 不用索引檔的資料查詢方法如下表:
Table 元件的方法 說 明 Table1.Locate()
記錄指標移到合乎條件的記錄
Table1.Lookup()
傳回某一欄位值,但記錄指標沒有移動
![Page 26: 第十六章 Borland Database Engine](https://reader035.fdocuments.net/reader035/viewer/2022081418/56812a9b550346895d8e5371/html5/thumbnails/26.jpg)
索引查詢 使用索引查詢將可縮短查詢時間,索引查詢方法如下表:Table 元件的方法 說 明Table1.FindKey()
記錄指標移到合乎條件的紀錄。
Table1.SetKey()
設定索引欄 (Index Field) 。
Table1.GotoKey()
記錄指標移到合乎條件的紀錄。
![Page 27: 第十六章 Borland Database Engine](https://reader035.fdocuments.net/reader035/viewer/2022081418/56812a9b550346895d8e5371/html5/thumbnails/27.jpg)
範例 16-3b示範 Locate 查詢,並修改記錄內容。
程式說明 : 1. Locate 的語法如下:
Locate (“欲搜尋的欄名”、“欲搜尋的字串”,搜尋參數)
2. 搜尋參數的型態是 TLocateOptions ,如下式:type TLocateOption = (loCaseInsensitive, loPartialKey);
TLocateOptions = set of TLocateOption; loCaseInsensitive:不分大小寫均符合。 loPartialKey:部份字元符合即可。例如輸入“學樂”,若
有“學樂出版社”或 “學樂出版股份有限公司”,均符合搜尋條件。
![Page 28: 第十六章 Borland Database Engine](https://reader035.fdocuments.net/reader035/viewer/2022081418/56812a9b550346895d8e5371/html5/thumbnails/28.jpg)
範例 16-3c 示範 Lookup 查詢。
程式說明 : Lookup僅傳回所要的欄位值,記錄指標
並沒有移動。
![Page 29: 第十六章 Borland Database Engine](https://reader035.fdocuments.net/reader035/viewer/2022081418/56812a9b550346895d8e5371/html5/thumbnails/29.jpg)
範例 16-3d 示範 Gotokey ,並修改記錄內容。
補充說明 : 1. 要先關閉 Table ,才能設定索引欄。 2. 若是要找接近的值,則可將 Gotoke
y 改為 GotoNearest 。 3. 本例已示範如何取記錄的原值、修
改並存回,此方法可應用於銷貨管理中,將原庫存減去銷貨數量。
![Page 30: 第十六章 Borland Database Engine](https://reader035.fdocuments.net/reader035/viewer/2022081418/56812a9b550346895d8e5371/html5/thumbnails/30.jpg)
範例 16-3e 示範 Findkey ,並修改記錄內容。
程式說明 : GotoKey 和 FindKey 均應事先將欲搜尋
的欄位索引,才能使用。
![Page 31: 第十六章 Borland Database Engine](https://reader035.fdocuments.net/reader035/viewer/2022081418/56812a9b550346895d8e5371/html5/thumbnails/31.jpg)
範例 16-3f 示範記錄的新增與刪除。
![Page 32: 第十六章 Borland Database Engine](https://reader035.fdocuments.net/reader035/viewer/2022081418/56812a9b550346895d8e5371/html5/thumbnails/32.jpg)
16-4 Query 前面的 Table 物件是一種程序式的語言,你必須一步一步的告知編繹器你要怎麼作,例如你必須一步一步的移動記錄,然後更正資料,但本節的 Query 物件即可以下達 SQL敘述, SQL敘述的優點為它是非程序性語言,例如你要從 fri.db中取身高大於 160 的記錄,只要下達以下 SQL敘述:
Select * From fri Where Height> 160 //身高的欄位為 Height
至於編繹器取資料的過程如何,你都可以不必了解。 SQL敘述的另一優點是提升執行速度,因為 SQL敘述可以在眾多資料表中只取合乎條件的部份欄位出來,不像 Table 物件會將牽涉到的資料表全部提出,所以只要資料庫系統慢慢龐大之後,使用 Table 物件所撰寫的程式都會造成網路及硬碟很大的負載。使用 SQL敘述的第三優點為 SQL 是一種資料庫廠商標準語言,只要學一次 SQL敘述,下次你換一種程式語言,都不用重新學習,即可以將 SQL敘述,套上新的語言。對於 SQL敘述不熟的讀者請看第十八章。
Query 物件可於設計階段與執行階段下達 SQL敘述,以下我們將分別於設計階段與執行階段說明 Query 物件的使用。
![Page 33: 第十六章 Borland Database Engine](https://reader035.fdocuments.net/reader035/viewer/2022081418/56812a9b550346895d8e5371/html5/thumbnails/33.jpg)
範例 16-4a 如何於設計階段執行 SQL敘述。(本例
欲連結別名為 horng 的資料庫,資料表為 stugrd.db )補充說明 :
若要讓 DBGrid 能修改記錄,請將 Query物件的 RequestLive 屬性點選 True 。
![Page 34: 第十六章 Borland Database Engine](https://reader035.fdocuments.net/reader035/viewer/2022081418/56812a9b550346895d8e5371/html5/thumbnails/34.jpg)
範例 16-4b 同上範例,但於執行階段執行 SQL敘述。
程式說明 : 1. 執行 SQL敘述的步驟如下:
關閉 Query 物件。清除 SQL敘述。加入 SQL敘述。執行 SQL敘述。
![Page 35: 第十六章 Borland Database Engine](https://reader035.fdocuments.net/reader035/viewer/2022081418/56812a9b550346895d8e5371/html5/thumbnails/35.jpg)
範例 16-4c 同上範例,但加上參數的傳遞。
程式說明 : 本例共示範三種資料型態的參數傳遞,分
別是數值、字串及日期型態,其中字串及日期均應於資料兩旁加字串符號( ' ),但 SQL語法又規定,凡字串內須再存有字串者,須用雙引號( " )代替,所以字串及日期的物件變數兩旁要加雙引號( " )。
![Page 36: 第十六章 Borland Database Engine](https://reader035.fdocuments.net/reader035/viewer/2022081418/56812a9b550346895d8e5371/html5/thumbnails/36.jpg)
範例 16-4d 示範如何關聯多個資料表。
程式說明 : 1. SQL敘述內資料表名稱與欄位名稱之間要加點(.)運算子。
2. SQL敘述內字與字之間一定要空一格,若要將字串分開時,也要考慮空白,如本例的 from 與 where前均應加空白。
![Page 37: 第十六章 Borland Database Engine](https://reader035.fdocuments.net/reader035/viewer/2022081418/56812a9b550346895d8e5371/html5/thumbnails/37.jpg)
範例 16-4e 如何新增、刪除及更正資料。
程式說明 : 1. Insert 、 Delete 及 Update因為不傳回資
料集,所以應使用 ExecSQL ,而非 Select 的 Open 。
2. Select 可一次至多個資料表抓取所需的欄位,但 Insert 、 Delete 及 Update僅能至一個資料表修正記錄。
3. Insert 、 Delete 及 Update 不能使用集合性函式,如 SUM 及 AVG 等。
4. 若要一次更動多個資料表應使用 UpdateSQL 物件。
![Page 38: 第十六章 Borland Database Engine](https://reader035.fdocuments.net/reader035/viewer/2022081418/56812a9b550346895d8e5371/html5/thumbnails/38.jpg)
範例 16-4f 如何由使用者於執行階段下達 SQL敘述。
![Page 39: 第十六章 Borland Database Engine](https://reader035.fdocuments.net/reader035/viewer/2022081418/56812a9b550346895d8e5371/html5/thumbnails/39.jpg)
範例 16-4g 同上範例,但設計一個更具親和性的搜
尋資料介面。
![Page 40: 第十六章 Borland Database Engine](https://reader035.fdocuments.net/reader035/viewer/2022081418/56812a9b550346895d8e5371/html5/thumbnails/40.jpg)
16-5 資料庫與統計圖 我們於 10-16 節已介紹 Chart 元件的用法,
其功能為繪製各種統計圖,本節則要介紹資料庫的繪圖元件 DBChart , DBChart 是繼承 Chart 的元件,所以其用法大致與 Chart相同,只是多了連繫屬性 DataSouce 與 ValueSource ,以下將示範如何將 grade.db 的內容以 DBChart 表現,grade.db 內容如下:
![Page 41: 第十六章 Borland Database Engine](https://reader035.fdocuments.net/reader035/viewer/2022081418/56812a9b550346895d8e5371/html5/thumbnails/41.jpg)
範例 16-5a 如何將 grade.db 的內容以 DBChart 表現。
補充說明 : 只有特殊的統計圖才需要 XValues ,如
Fast Line才需要設定 XValues 。
![Page 42: 第十六章 Borland Database Engine](https://reader035.fdocuments.net/reader035/viewer/2022081418/56812a9b550346895d8e5371/html5/thumbnails/42.jpg)
習題 1. 假設有以下的統計資料:
1. 請規劃一個資料表儲存以上資料。2. 可任意輸入某年某月而得該月份銷售王。3. 可任意輸入某年某月而得各業務員的銷售長條圖。4. 可任意輸入某一時間區間而得該區間銷售王,例如輸入 8701~ 8702
而得該區間銷售王。5. 同 4 ,可得該區間所有業務員的銷售長條圖。
姓 名 年 月 銷售數量
張三 8701 2
李四 8701 3
王五 8701 2
王五 8702 1
張三 8702 2
陳六 8702 3
張三 8703 2
陳六 8703 4
![Page 43: 第十六章 Borland Database Engine](https://reader035.fdocuments.net/reader035/viewer/2022081418/56812a9b550346895d8e5371/html5/thumbnails/43.jpg)
2. 請實際觀察任一家保齡球館,並寫程式完成其計分功能;若同一球道可同時 2至 4 人擊球,則其程式設計又如何?
3. 請設計一個樂透對獎程式,其要求如下:1. 可事先輸入已購買的獎卷號碼。2. 可輸入中獎號碼,並核對資料表中各組號碼的中獎情形。
4. 請設計一個樂透程式,其要求如下:1. 可自動產生一個 10000~ 20000 的亂數,此亂數即代表本期彩卷的銷售數量。
2. 根據以上的銷售數量,自動產生以上各組彩卷的號碼,並儲存在資料表中。
3. 電腦自動開獎。4. 電腦列出各獎項的人數。例如,頭獎 1 人,二獎 5 人,三獎 2
02 人,四獎 1221 人,五獎 6123 人