資料庫理論與實務

Preview:

DESCRIPTION

資料庫理論與實務. 以 VB6 建立資料庫. 以 VB6 建立資料表. 按滑鼠右鍵將出現快顯功能表. 輸入資料記錄. 滑鼠左鍵連點兩下. 簡易資料庫程式設計. 資料 (Data) 元件. 第一筆 資料. 最後一筆資料. 資料控制項. 上一筆 資料. 下一筆 資料. 資料控制項的常用屬性. Name :資料控制項的名稱 Caption :資料控制項內的標題 BatabaseName :設定連結的資料庫名稱 RecordSource :設定連結的資料表名稱 ReadOnly :設定是否允許修改 - PowerPoint PPT Presentation

Citation preview

資料庫理論與實務

以 VB6 建立資料庫

以 VB6 建立資料表

按滑鼠右鍵將出現快顯

功能表

輸入資料記錄

滑鼠左鍵連點兩下

簡易資料庫程式設計資料 (Data) 元件

第一筆資料

最後一筆資料

上一筆資料

下一筆資料

資料控制項

資料控制項的常用屬性Name :資料控制項的名稱Caption :資料控制項內的標題BatabaseName :設定連結的資料庫名稱RecordSource :設定連結的資料表名稱ReadOnly :設定是否允許修改Connect :設定資料庫的檔案格式,內定為        AccessExclusive :封閉,設定是否可與妻他程式共用      此資料庫

資料感知物件 (Data Aware)具有資料連結功能的控制項統稱為 Data Aware

文字方塊 (TextBox)標籤 (Label)核取方塊 (CheckBox)圖片方塊 (PictureBox)影像 (Image)清單方塊 (ListBox)下拉式清單方塊 (ComboBox)格子 (MSFlexGrid)…

共同重要屬性1. DataSource 決定連結的資料控制項名稱2. DataField 決定鏈結的資料連位名稱

牛刀小試 (1) Label*6

TextBox*6

Data*1

牛刀小試 (1)--- 續重要屬性設定

Data• DatabaseName

– C:\VB6 投影片 \ 第九章範例 \ 牛刀小試 (1)\db-test.mdb

• RecordSource– student

牛刀小試 (1)--- 續重要屬性設定 ( 續 )

Text1(0)~Text1(5)• DataSource

– Data1

Text1(0)~Text1(5)• DataField

– Text1(0) stu_no– Text1(1) name– Text1(2) blood– Text1(3) sex– Text1(4) tel– Text1(5) address

以程式控制移動資料移到第一筆記錄

Data1.Recordset.MoveFirst移到最後一筆記錄

Data1.Recordset.MoveLast移到上一筆記錄

Data1.Recordset.MovePrevious移到下一筆記錄

Data1.Recordset.MoveNext

牛刀小試 (2)同牛刀小試 (1) 僅新增四個 CommandButton

CommandButton*4

牛刀小試 (2)--- 續BOF (Begin Of File)

檔案開頭EOF (End Of File)

檔案結尾

若不加上 BOF 或 EOF 的判斷,將發生下圖情形

新增、刪除、修改資料記錄新增資料記錄

Data1.Recordset.AddNew刪除資料記錄

Data1.Recordset.Delete修改資料記錄 ( 需配合 AddNew 或 Edit)

Data1.Recordset.Update編輯資料記錄

Data1.Recordset.Edit

牛刀小試 (3)同牛刀小試 (2) 再新增三個 CommandButton

牛刀小試 (3)--- 續

查詢資料記錄找出符合資料的第一筆記錄

Data1.Recordset.FindFirst “blood=‘B’”找出符合條件的前一筆記錄

Data1.Recordset.FindPrevious “blood=‘B’”找出符合條件的下一筆記錄

Data1.Recordset.FindNext “blood=‘B’”找出符合條件的最後一筆記錄

Data1.Recordset.FindLast “blood=‘B’”是否找到符合的記錄?

Data1.Recordset.NoMatch• True :找到符合記錄• False :未找到符合記錄

其他查詢資料總筆數

Data1.Recordset.RecordCount查詢資料總欄位數

Data1.Recordset.Fields.Count關閉資料表

Data1.Recordset.Close

牛刀小試 (4)同牛刀小試 (3) 再新增三個 CommandButton

牛刀小試 (4)--- 續

DAO(Data Access Object)

資料存取物件VB6 中的一種資料存取方法,也是一種物件結構(階層物件集合)的方式

• 最大的階層為 DBEngine (Microsoft Jet Database Engine)• 有了 DBEngine 後 VB 就會自動配置一塊記憶體空間即 Workspac

e(0) 工作空間給使用者• 然後使用 OpenDatabase 開啟資料庫• 待資料庫開啟後接著以 OpenRecordset 開啟資料表

使用 DAO 必須先完成下列二項宣告• 資料庫 (Database)• 資料表 (Recordset)

不用 Data 元件的方法

DAO( 續 )DAO 設計的第一步引用 DAO 物件庫

DAO( 續 )DAO 設計的第二步宣告資料庫及資料表

DAO 設計的第三步開啟資料庫及資料表

Dim db As Database ‘ 宣告資料庫Dim rs As Recordset ‘ 宣告資料表

Set db=DBEngine.Workspaces(0).OpenDatabase( 欲開啟的資料庫 ) ‘ 開啟資料庫

Set rs=db.OpenRecordset( 欲開啟的資料表名稱 , dbOpenTable ) ‘ 開啟資料表

DAO( 續 ) 開啟資料表的型式

Constant Description

dbOpenTable Opens a table-type Recordset object ( Microsoft Jet workspaces only).

dbOpenDynamicOpens a dynamic-type Recordset object, which is similar to an ODBC dynamic cursor. ( ODBC

Direct workspaces only)

dbOpenDynaset Opens a dynaset-type Recordset object, which is similar to an ODBC keyset cursor.

dbOpenSnapshot Opens a snapshot-type Recordset object, which is similar to an ODBC static cursor.

dbOpenForwardOnly Opens a forward-only-type Recordset object.

牛刀小試 (5)以 DAO 方式改寫牛刀小試 (4)

宣告 db 為資料庫變數 rs 為資料表變數

設定 db 為開啟資料庫 db-test.mdb而 rs 為以 dbOpenTable 型態來開啟db 中的資料表 student將指標指向第一筆資料錄,並將第一筆記錄顯示在 Text1(0)~(5) 中

當按下「 |< 」鈕時,將第一筆記錄顯示於 Text1(0)~(5) 中當按下「 >| 」鈕時,將最後一筆記錄顯示於 Text1(0)~(5) 中

當按下「 < 」鈕時,將指標指向上一筆記錄,並測試是否為資料檔案的最頂端,假如是的話將指標指向第一筆記錄,將指標所在記錄的資料顯示於 Text1(0)~(5) 中當按下「 > 」鈕時,將指標指向下一筆記錄,並測試是否為資料檔案的最尾端,假如是的話將指標指向最後一筆記錄,將指標所在記錄的資料顯示於 Text1(0)~(5) 中

當按下 Command5 鈕時,假如鈕上的標題為「新增」,則更改名稱為「確定」,同時將「刪除」鈕更名為「取消」,然後呼叫 cleartext 清除 Text1(0)~(5)的內容,並執行 AddNew 的方法;否則,鈕上的標題為「確定」時,更改名稱為「新增」,同時將「取消」鈕更名為「刪除」,並將 Text1(0)~(5) 的內容指派給各個欄位,最後執行 Update 的方法

當按下 Command6 鈕時,假如鈕上的標題為「刪除」,則顯示是否刪除的提示訊息,若確定刪除,則執行Delete 的方法,並執行 Command1 的動作;否則,鈕上的標題為「取消」時,更改名稱為「刪除」,同時將 Command5 鈕的標題更名為「新增」, Command7的標題更名為「修改」

當按下 Command7 鈕時,假如鈕上的標題為「修改」,則更改名稱為「確定」,同時將「刪除」鈕更名為「取消」;否則,鈕上的標題為「確定」時,更改名稱為「修改」,同時將「取消」鈕更名為「刪除」,並將 Text1(0)~(5) 的內容指派給各個欄位,最後執行 Update 的方法

當按下 Command8 鈕時,先關閉以dbOpenTable 型態開啟的資料表,再以 dbOpenSnapshot 型態來開啟student 資料表,然後輸入欲查詢的姓名,以 FindFirst 方法找尋符合的記錄,假如找到的話,將每個欄位分別顯示於 Text1(0)~(5) ,之後關閉資料表,改以 dbOpenTable 重新開啟資料表 student

當按下 Command9 鈕時,顯示資料表的記錄總筆數當按下 Command10 鈕時,顯示資料表的欄位個數

格子控制項 (MSFlexGrid)也許你也發現到了,之前的範例都是在文字盒中顯示資料,假如碰到了同名同姓的狀況,該如何顯示資料?

用 Print敘述來顯示?也許是個好方法,不過似乎太落伍了!用 MSFlexGrid 來顯示?

格子控制項 ( 續 )格子在哪裡?

格子控制項 ( 續 )引入格子控制項

要多大就拉多大

1. 格子由連續的欄與列所組成2. 欄與列交會的地方稱為儲存格 (Cell)3.儲存格分為固定與變動兩部分  a.固定:灰色部分,可用以顯示欄     及列的標題  b. 變動:白色部分,用以顯示圖形     或文字資料

格子控制項 ( 續 )常用的屬性

Text :內容文字Picture :內容圖片Col :目前作用儲存格所在欄Row :目前作用儲存格所在列Cols :格子控制項的總欄位數Rows :格子控制項的總列數ColAlignment :欄位靠齊方式ColWidth :欄位寬度 ( 以點 [point] 為單位 )RowHeight :列的高度 ( 以點 [point] 為單位 )

ColAlignment  欄位靠齊方式

常數 值 描述

flexAlignLeftTop 0 資料行內容靠左、靠上對齊。

flexAlignLeftCenter 1 字串預設值。資料行內容靠左、居中對齊。

flexAlignLeftBottom 2 資料行內容靠左、靠下對齊。

flexAlignCenterTop 3 資料行內容居中、靠上對齊。

flexAlignCenterCenter 4 資料行內容置中、居中對齊。

flexAlignCenterBottom 5 資料行內容置中、靠下對齊。

flexAlignRightTop 6 資料行內容靠右、靠上對齊。

flexAlignRightCenter 7 數字的預設值。資料行內容靠右、居中對齊。

flexAlignRightBottom 8 資料行內容靠右、靠下對齊。

flexAlignGeneral 9 資料行內容採一般對齊方式之一。對於字串是「靠左、居中」對齊,數字則是「靠右、居中」對齊。

牛刀小試 (6)利用 MSFlexGrid 顯示九九乘法表

牛刀小試 (6)--- 續設定格子控制項的總欄位數為 9 ,總列數為 10 ,令目前作用儲存格為第 0 列的 0~8 欄,分別設定欄寬為 500點、文字置中對齊,從第 1 欄開始依序顯示 2~9 的數字為標題

令目前作用儲存格為第 0 欄的 1~9 列,從第 1 列開始依序顯示 1~9 的數字為標題

將九九乘法的結果顯示於 1~8 欄與 1~9列交會的儲存格中

高階資料庫設計

SQL

何謂 SQL 一種與資料庫溝通的共通語言Structured Query Language 唸成 sequel 1970 年在 IBM 工作的 E.F. Codd ,針對關聯式模型 ( relational model ) ,提出了抽象理論因此奠定了關聯式資料系統的基礎演進

SQL-87 、 SQL-89 、 SQL-92 以及目前最新的 SQL 3

SQL 的三大類別為了統一資料庫的基本語法,才訂定出標準的 SQL 語法,提供使用者一致的操作指令一般而言,資料庫的語法 ( SQL ) 分為三大類別

DDL ( Data Definition Language )DCL ( Data Control Language )DML ( Data Manipulation Language )

Data Definition Language

定義資料庫物件使用的語法常見的關鍵字

Create•建立資料庫的物件

Alter•變更資料庫的物件

Drop•刪除資料庫的物件

Data Control Language

控制資料庫物件使用狀況的語法常見的關鍵字

Grant• 賦予使用者使用物件的權限

Revoke• 取消使用者使用物件的權限

Commit• Transaction 正常作業完成

Rollback• Transaction 作業異常,異動的資料回復到 Transaction 開始的狀態

Data Manipulation Language

維護資料庫資料內容的語法常見的關鍵字

Insert•新增資料到 Table 中

Update•更改 Table 中的資料

Delete•刪除 Table 中的資料

Select•選取資料庫中的資料

SELECT 陳述式SELECT-list識別欄位

FROM指定搜尋範圍

WHERE搜尋準則

ORDER BY 排列結果

SELECT 陳述式 (cont.)GROUP BY

將記錄分組統計HAVING

於 GROUP BY 所得的資料集中篩選所需記錄

IN從 SELECT 的結果中再選取資料

SELECT 陳述式 (cont.)選取需要的欄位

若要選取資料表中所有欄位時• SELECT * FROM Student

SELECT field1,field2,….. FROM tablename

field n :需要的欄位tablename :資料表格名稱

SELECT 陳述式 (cont.)篩選記錄 SELECT field1,field2,…..

FROM tablenameWHERE criteria

field n :需要的欄位tablename :資料表格名稱criteria :篩選條件

SELECT Name, Sex, Height FROM Student WHERE Height > 165

SELECT 陳述式 (cont.)篩選特定範圍欄位值

SELECT *FROM tablenameWHERE filedBETWEEN a1 AND a2

tablename :資料表格名稱field :欄位名稱a1,a2 :數值

SELECT * FROM Student WHERE Height BETWEEN 160 AND 175

SELECT 陳述式 (cont.)排序 SELECT field1,field2,…..

FROM tablenameORDER BY sortorder

field n :需要的欄位tablename :資料表格名稱sortorde :排序方式

SELECT Name, Sex, Height FROM Student ORDER BY Height ASCSELECT Name, Sex, Height FROM Student ORDER BY Height DESC

SELECT 陳述式 (cont.)省略重複值

SELECT DISTINCT field1,field2,….. FROM tablename

field n :需要的欄位tablename :資料表格名稱

SELECT DISTINCT Name FROM Student

SELECT 陳述式 (cont.)使用別名

SELECT field1 AS Alias1,field2 AS Alias2,… FROM tablename

field n :需要的欄位alias n :欄位的別名tablename :資料表格名稱

SELECT Name AS Name1 FROM Student

SELECT 陳述式 (cont.)限定選取資料錄的筆數

SELECT TOP n field1,field2,…FROM tablenameORDER BY sortorder

field n :需要的欄位tablename :資料表格名稱sortorde :排序方式

SELECT TOP n PERCENT field1,field2,…FROM tablenameORDER BY sortorder

SELECT 陳述式 (cont.)使用統計函數

SELECT 統計函數 AS Alias FROM tablename 函數 意義

COUNT 統計資料錄的總筆數SUM 統計資料錄的某欄位總和MIN 求取所有資料錄某欄位的最小值MAX 求取所有資料錄某欄位的最大值

STDEV 統計所有資料錄某欄位的標準差VAR 統計資料錄某欄位的變異數

FIRST 求取所有資料錄的第一筆LAST 求取所有資料錄的最後一筆

SELECT 陳述式 (cont.)分組統計

SELECT fieldx,field1,…FROM tablenameGROUP BY fieldx

field x :該分組的欄位

SELECT 陳述式 (cont.)HAVING 條件式

SELECT fieldx,field1,…FROM tablenameGROUP BY fieldxHAVING criteria

field x :該分組的欄位criteria :條件式

SELECT 陳述式 (cont.)子集合查詢

SELECT *FROM tablenameWHERE field IN (ct1,ct2,…)

tablename :資料表格名稱ct n :欄位內容

SELECT * FROM Student WHERE Name IN(’張三’ ,’李四’ )

UPDATE

更新 UPDATE tablenameSET field=newvalue

tablename :資料表格名稱field :欲變更的欄位newvalue :更新值

INSERT INTO

新增

INSERT INTO tablename(field1,field2,…)VALUES (value1,value2,…)

tablename :資料表格名稱field n :欲新增的欄位value n :新增值

DELETE

刪除

DELETE FROM tablenameWHERE criteria

tablename :資料表格名稱criteria :篩選條件

牛刀小試 (7)將牛刀小試 (5) 以 SQL語法改寫

新增的改寫

牛刀小試 (7)--- 續刪除的改寫

牛刀小試 (7)--- 續修改的改寫

牛刀小試 (7)--- 續查詢的改寫

VB6 與 dBase V (.dbf) 的連結與資料庫連結

與資料表連結

Set db = DBEngine.Workspaces(0).OpenDatabase(App.Path, dbDriverNoPrompt, _ False, "dBASE 5.0;DATABASE=" & App.Path)

Set database = workspace.OpenDatabase (dbname, options, read-only, connect)

Set rs = db.OpenRecordset("AMEMBER.dbf", dbOpenTable, _ dbDenyWrite, dbOptimistic)

Set recordset = object.OpenRecordset (source, type, options, lockedits)

範例一 人事管理系統

範例一 人事管理系統 ( 續 )

PictureBox*1

功能表編輯器

範例一 人事管理系統 ( 續 )功能表編輯器內容

範例一 人事管理系統 ( 續 )TextBox*57

Label*57

CommandButton*9

Frame*1

範例一 人事管理系統 ( 續 )Frame*1

OptionButton*7

TextBox*1

CommandButton*2

MSFlexGrid*1

範例一 人事管理系統 ( 續 )

Label*3

Image1*1

CommandButton*1

Shape*2

Frame*1

宣告資料庫、資料表變數 db 與 rs , sel 為選擇軍官或士官兵資料維護

當按下「關於」選項後,顯示 Frame1 ,並於 Image1載入 logo.gif 圖案

結束程式執行 Picture1載入圖案 main.gif並設定資料庫為 dBASE 5.0 型式檔案檔案所在路徑採相對路徑指定

當按下「士官兵資料維護」選項後,令 sel=2 ,清空所有 TextBox 後,顯示Frame2 ,設定開啟的資料表為 BMEMBER.dbf ,然後將指標指到資料表的第一筆記錄,將第一筆記錄的內容選適於螢幕上

當按下「軍官資料維護」選項後,令 sel=1 ,清空所有 TextBox 後,顯示Frame2 ,設定開啟的資料表為 AMEMBER.dbf ,然後將指標指到資料表的第一筆記錄,將第一筆記錄的內容選適於螢幕上

關閉「關於」 (Frame1) 的顯示

當按下「 |< 」按鈕時,清空所有 TextBox將指標指到第一筆記錄,並顯示於螢幕上

當按下「 >| 」按鈕時,清空所有 TextBox將指標指到最後一筆記錄,並顯示於螢幕上

當按下「 < 」按鈕時,清空所有 TextBox將指標指向前一筆記錄,假如為資料表頭,則將指標指到第一筆記錄,並顯示記錄於螢幕上

當按下「 > 」按鈕時,清空所有 TextBox將指標指向後一筆記錄,假如為資料表底,則將指標指到最後一筆記錄,並顯示記錄於螢幕上

清空所有的 TextBox

當按下 Command6 鈕時,假如鈕上的標題為「新增」,則更改名稱為「確定」,同時將「刪除」鈕更名為「取消」,然後呼叫 cleartext 清除 Text1(0)~(56)的內容,並執行 AddNew 的方法;否則,鈕上的標題為「確定」時,更改名稱為「新增」,同時將「取消」鈕更名為「刪除」,並將 Text1(0)~(56) 的內容指派給各個欄位,最後執行 Update 的方法

當按下 Command7 鈕時,假如鈕上的標題為「刪除」,則顯示是否刪除的提示訊息,若確定刪除,則執行 Delete 的方法,並執行 Command3 的動作;否則,鈕上的標題為「取消」時,更改名稱為「刪除」,同時將 Command6 鈕的標題更名為「新增」, Command8 的標題更名為「修改」

當按下 Command8 鈕時,假如鈕上的標題為「修改」,則更改名稱為「確定」,同時將「刪除」鈕更名為「取消」;否則,鈕上的標題為「確定」時,更改名稱為「修改」,同時將「取消」鈕更名為「刪除」,並將 Text1(0)~(56) 的內容指派給各個欄位,最後執行 Update 的方法

當按下 Command9 鈕 ( 查詢 ) 時,顯示 Frame3 ,清空 text2 、 MSFlexGrid1 內容,並起始設定MSFLEXGrid1 的行、列總數及各欄的寬度

當按下 Command10 鈕 (離開 ) 時,關閉資料表並隱藏 Frame2

當按下 Command12 鈕 (放棄查詢 ) 時,隱藏Frame3

當按下各個查詢條件時,將 Text2 與 MSFlexGrid1 清空,並設定總列數為 2

當按下 MSFlexGrid1 中的任一項次時,將 Frame3隱藏,清空所有 Text2 內容,在資料表中以 FindFirst 尋找欄位名稱為 MEMBER_ID 的內容與 MSFlexGrid1 中第 2 欄的內容相同的記錄,並將記錄內容顯示於各個 TextBox 中,關閉資料表,假如之前的選項為「軍官資料維護」則重新以 dbOpenTable 的型式開啟 AMEMBER.dbf 檔,否則開啟 BMEMBER.dbf 檔

當按下「開始查詢」按鈕後,先關閉資料表,重新以 dbOpenSnapshot 型式開啟 AMENBER.dbf (軍官)或BMEMBER.dbf (士官兵),令 ret等於 Text2 中欲查詢的內容,按不同的查詢條件組合成 str1 ,然後在資料表中查詢符合 str1 條件的第一筆記錄,假如找到的話,將內容中的部分欄位顯示於 MSFlexGrid1 中,然後再尋找符合 str1 條件的下一筆記錄,直到不再有符合條件的資料為止

The End

Recommended