Visual Basic 程式設計範例教本

第14章 ADO.NET的資料庫存取





14-1
14-2
14-3
14-4
14-5
資料庫與ADO.NET的基礎
新增資料來源
DataReader與DataAdapter物件
SQL資料庫語言
應用實例:iPods產品管理程式
14-1 資料庫與ADO.NET的基礎



14-1-1 什麼是資料庫
14-1-2 ADO.NET的基礎
14-1-3 ADO.NET物件模型
14-1-1 什麼是資料庫-說明


一般來說,我們所泛稱的「資料庫」
(Database),正確的說只是「資料庫系統」
(Database System)的一部分,資料庫本身
如同是一個電子檔案櫃,它是一種資料儲存單位,
內容是經過組織的資料集合。
在資料庫儲存的資料是企業能夠正常運作的關鍵。
想想看!銀行如果沒有帳戶和交易記錄的資料庫,
客戶存款和提款要如何運作。航空公司需要依賴
訂票系統的資料庫,才能讓旅行社訂機票,旅客
才知道班機是否已經客滿。
14-1-1 什麼是資料庫-資料庫系
統(說明)


資料庫系統(Database Systems)是由資料庫
(Database)和「資料庫管理系統」
(Database Management Systems)組成,
例如:SQL Server Express和Access是資料庫
管理系統,iPods.mdf和iPods.mdb檔案是資料
庫。
目前主流的資料庫管理系統是關聯式資料庫管理
系統(Relational Database Management
Systems),例如:Access、MySQL、SQL
Server和Oracle等。Visual Basic資料庫應用程
式的架構。
14-1-1 什麼是資料庫-資料庫系統
(圖例)

應用程式存取資料是下達SQL(Structured
Query Language)語言給資料庫管理系統後,
資料庫管理系統依指令來查詢、新增、刪除和更
新資料庫的資料。
14-1-1 什麼是資料庫-資料庫的組成:
資料表、記錄與欄位(說明)

資料庫主要的目的是儲存資料,資料是儲存在資
料庫的「資料表」(Tables),每一個資料表使
用「欄位」(Fields)分類成很多群組,每一個
群組是一筆「記錄」(Records),例如:通訊
錄資料表的記錄,如下表所示:
14-1-1 什麼是資料庫-資料庫的組成:
資料表、記錄與欄位(索引)


資料庫可以擁有多個資料表,為了加速資
料存取,資料表可以使用「索引」(Index)
技術將資料系統化整理,以便在大量資料
能夠快速找到所需的資料或進行排序。
例如:在通訊錄資料表使用編號欄位建立
主索引鍵,或稱為「主鍵」(Primary
Key),如此就可以透過編號來加速資料表
記錄的搜尋和排序功能。
14-1-2 ADO.NET的基礎-說明


ADO.NET目前版本是2.0版,它是微軟的
資料存取技術,可以使用一致的物件模型
存取資料來源的資料,也就是一致的資料
處理方式,至於資料來源並不限資料庫,
幾乎任何資料來源都可以。
以Visual Basic應用程式來說,使用
ADO.NET主要的目的是建立資料庫應用程
式。在ADO.NET元件的眾多類別是以名稱
空間或稱命名空間(Namespace)的類別
架構來組織,屬於一種階層架構(進一步
說明請參閱第17章)。
14-1-2 ADO.NET的基礎-名稱空間

ADO.NET的主要名稱空間的說明,如下表
所示:
名稱空間
System.Data
說明
提供 DataSet、DataTable、DataRow、DataView、
DataColumn 和 DataRelation 類別,可以將資料庫的記
錄資料儲存到記憶體
System.Data.OleDb
OLE DB 的.NET 提供者,提供 OleDbCommand、
OleDbConnection、OleDbDataReader 類別來處理 OLE
DB 資料來源的資料庫
System.Data.SqlClient SQL 的.NET 提供者,提供 SqlCommand、SqlConnection、
SqlDataReader 類別來處理微軟 Microsoft SQL Server 7.0
以上版本的資料庫
14-1-3 ADO.NET物件模型-圖例

ADO.NET主要類別物件有:Connection、
Command、DataReader和DataSet,
其物件模型如下圖所示:
14-1-3 ADO.NET物件模型-說明1

Connection物件:建立與資料來源間的連結。
• OLE DB是使用OleDbConnection物件,SQL
Server是使用SqlConnection物件。

Command物件:對資料來源執行指令,以資料
庫來說,就是執行SQL指令。
• OLE DB是使用OleDbCommand物件,SQL Server
是使用SqlCommand物件。

DataReader物件:可以從資料來源使用
Command物件執行指令,取得唯讀(ReadOnly)和只能向前(Forward-Only)的串流資
料,每次只能從資料來源讀取一列資料(即一筆)
儲存到記憶體,所以執行效率非常高。
• OLE DB是使用OleDbDataReader物件,SQL
Server是使用SqlDataReader物件。
14-1-3 ADO.NET物件模型-說明2


DataSet和DataTable物件:DataSet物件是由
DataTable物件組成的集合物件,DataSet物件
代表儲存在記憶體的資料庫,每一個DataTable
儲存一個資料表的記錄資料,並且可以設定資料
表間的關聯性(Relationship)。
DataAdapter物件:它是DataSet和
Connection物件資料連結間的橋樑,可以將資料
表填入DataSet物件。
• OLE DB是使用OleDbDataAdapter物件,SQL
Server是使用SqlDataAdapter物件。
14-2 新增資料來源



14-2-1 ADO.NET與資料繫結
14-2-2 新增資料來源的DataSet物件
14-2-3 DataGridView控制項的資料繫結
14-2-1 ADO.NET與資料繫結-說明



資料繫結(Databinding)可以將外部資料整合
到Windows Form控制項。它是一種高擴充性、
可重複使用和容易維護的技術。
.NET Framework的資料繫結技術可以將控制項
屬性連接到任何可用「資料」(Data),在此的
資料可以是單純資料、物件屬性,控制項名稱的
集合物件等,.NET Framework可以將這些資料
視為類別的屬性來存取。
ADO.NET在資料繫結扮演資料提供者的角色,也
就是將ADO.NET取得的資料整合至Windows
Form控制項,換句話說,我們可以輕鬆在控制項
顯示資料庫的記錄資料。
14-2-1 ADO.NET與資料繫結-物件
說明

當Visual Basic專案使用資料來源建立資料繫結
後,就會自動在元件匣新增相關物件來建立
Visual Basic資料庫應用程式。其說明如下:
• DataConnector物件:資料來源和控制項間的連結,
它連結的是單一資料表的資料,即DataTable物件,簡
單的說,透過它可以設定連接至DataSet物件的哪一
個資料表。
• TableAdapter物件:其功能類似DataAdapter物件,
可以支援資料來源的資料表來執行多次查詢。換句話
說,只需單一TableAdapter物件,就可以更新
DataSet物件中,多個資料表的記錄資料。
• DataNavigator物件:瀏覽資料來源DataSet物件的
工具列控制項,提供按鈕可以移至前一筆、下一筆、
新增、編輯和刪除記錄資料等。
14-2-2 新增資料來源的DataSet物件
-說明


VBE提供資料來源組態精靈,可以在專案
新增資料庫、Web服務或物件的資料來源
(Data Source),也就是建立DataSet
物件。
在Visual Basic控制項可以使用資料繫結技
術來顯示資料庫的記錄資料,我們並不用
自行撰寫程式碼,只需使用資料來源組態
精靈新增資料來源,就可以自動建立資料
繫結所需的DataSet物件。
14-2-2 新增資料來源的DataSet物件
-資料來源組態精靈
14-2-2 新增資料來源的DataSet物件
-資料來源視窗
14-2-3 DataGridView控制項的資料
繫結-說明

在「資料來源」視窗展開資料表的
DataTable物件後,只需拖拉資料表至表
單,就可以自動建立DataGridView控制項,
或單筆編輯所需的控制項。
14-2-3 DataGridView控制項的資料
繫結-瀏覽編輯

在「資料來源」視窗的資料表選
【DataGridView】後,將資料表拖拉至表單,
就可以建立DataGridView控制項,以瀏覽方式
來顯示記錄資料,並且自動建立資料繫結所需的
相關物件,如下圖所示:
14-2-3 DataGridView控制項的資料
繫結-單筆編輯

在「資料來源」視
窗的iPod資料表後
選【詳細資料】,
就可以自動建立單
筆記錄編輯功能所
需的控制項,和資
料繫結的相關物件,
如右圖所示:
14-3 DataReader與DataAdapter物
件



14-3-1 使用DataReader物件讀取記錄資料
14-3-2 Using/End Using程式區塊
14-3-3 將資料表填入DataSet物件
14-3 DataReader與DataAdapter物
件


ADO.NET的DataReader物件,可以如同循序檔
案來讀取資料庫的記錄資料。DataAdapter物件
可以將資料表填入DataSet物件。
在Visual Basic程式碼使用ADO.NET物件時,我
們可以在專案屬性頁勾選(第15-3節說明),或
在模組以Imports關鍵字來匯入OLE DB所需的
名稱空間,如下所示:
Imports System.Data.OleDb

SQL Server Express資料庫匯入的名稱空間,
如下所示:
Imports System.Data.SqlClient
14-3-1 使用DataReader物件讀取記
錄資料-步驟一
步驟一:建立和開啟資料庫連結
 在Visual Basic程式首先需要建立Connection物
件來連接資料庫,如下所示:
Dim objCon As OleDbConnection
objCon = New OleDbConnection(strDbCon)
 上述程式碼使用New關鍵字建立名為objCon的
OleDbConnection物件,StrDbCon字串變數可
以指定資料來源的連接字串。
 在建立好Connection物件後,就可以使用
Open()方法開啟資料庫連結,如下所示;
objCon.Open()
14-3-1 使用DataReader物件讀取記
錄資料-步驟二
步驟二:建立Command物件
 在開啟資料庫連結後,就可以建立
Command物件,並且指定欲執行的SQL
指令字串,如下所示:
Dim objCmd As OleDbCommand
strSQL = "SELECT * FROM iPod"
objCmd = New OleDbCommand(strSQL, _
objCon)
14-3-1 使用DataReader物件讀取記
錄資料-步驟三
步驟三:取得DataReader物件
 在建立好Command物件後,就可以使用
ExecuteReader()方法執行SQL指令來取
得DataReader物件,如下所示:
Dim objDataReader As OleDbDataReader
objDataReader = objCmd.ExecuteReader()

上述程式碼取得DataReader物件
objDataReader。
14-3-1 使用DataReader物件讀取記
錄資料-步驟四
步驟四:取出查詢結果的資料表記錄資料
While objDataReader.Read()
out &= objDataReader.Item("ModelNo") & " "
out &= objDataReader.Item("Name") & vbTab
out &= objDataReader.Item("Storage") & vbTab
out &= objDataReader.Item(3) & vbTab
out &= objDataReader.Item(4) & vbTab
out &= objDataReader.Item(5) & vbNewLine
End While
14-3-1 使用DataReader物件讀取記
錄資料-步驟五
步驟五:關閉DataReader和資料庫連結
 最後就可以關閉DataReader和
Connection物件,如下所示:
objDataReader.Close()
objCon.Close()

上述程式碼使用Close()方法關閉
DataReader和Connection物件。
14-3-2 Using/End Using程式區塊說明


Visual Basic程式常常需要建立一些資源,
並且在使用後馬上釋放資源佔用的記憶體
空間,例如:ADO.NET的Connection和
Command物件。
為了避免忘了釋放資源,Visual Basic
2005新增Using/End Using程式區塊來進
行資源管理。
14-3-2 Using/End Using程式區塊範例
在Using/End Using程式區塊的開始可以建立資
源,程式區塊中使用資源,當離開程式區塊,就
會自動釋放此資源,如下所示:
Using objCon As New _
OleDbConnection(strDbCon)
objCon.Open()
………
End Using
 上述程式碼使用Using/End Using程式區塊建立
Connection物件,如此就不需要在最後使用
Close()方法關閉資料庫連結和釋放資源。

14-3-3 將資料表填入DataSet物件步驟一
Step 1 建立Connection物件:如同上一
節DataReader物件,我們仍然需要使用
Connection物件建立和開啟資料連結,只
是改為Using/End Using程式區塊,如下
所示:
Using objCon As New
OleDbConnection(strDbCon)
objCon.Open()
………
End Using

14-3-3 將資料表填入DataSet物件步驟二

Step 2 建立DataAdapter物件:它是
DataSet和Connection物件資料連結間的
橋樑,可以將資料表填入DataSet物件,
其建構子的第1個參數是SQL指令字串,第
2個參數是Connection物件,如下所示:
Dim objDataAdapter As OleDbDataAdapter
objAdapter = New _
OleDbDataAdapter(strSQL, objCon)
14-3-3 將資料表填入DataSet物件步驟三

Step 3 填入DataSet物件:執行
DataAdapter物件的SQL查詢指令後,使
用Fill()方法將記錄填入DataSet物件,第
1個參數是DataSet物件,第2個參數是
DataTable物件名稱,如下所示:
Dim objDataSet As DataSet = New DataSet()
objAdapter.Fill(objDataSet, "iPod")
14-3-3 將資料表填入DataSet物件步驟四

Step 4 建立資料繫結:將控制項的
DataSource屬性,指定成DataSet物件名
為iPod的DataTable物件就可以建立資料
繫結,如下所示:
dgvOutput.DataSource = _
objDataSet.Tables("iPod")
14-3-3 將資料表填入DataSet物件圖例
14-4 SQL資料庫語言



14-4-1 SQL語言的基礎
14-4-2 SQL查詢指令
14-4-3 資料庫操作的SQL指令
14-4-1 SQL語言的基礎-說明


「SQL」(Structured Query Language)為
「ANSI」(American National Standards
Institute)標準的資料庫語言,它可以存取和更
新資料庫的記錄資料。目前Access、SQL
Server、Informix、Oracle和Sybase等關聯式
資料庫系統都支援ANSI的SQL語言。
1974年一種稱為SEQUEL的語言,這是
Chamberlin和Boyce的作品,它建立SQL語言
的原型,IBM稍加修改後作為其資料庫DBMS的
資料庫語言,稱為System R。1980年SQL名稱
正式誕生,從此SQL語言逐漸壯大成為一種標準
的關聯式資料庫語言。
14-4-1 SQL語言的基礎-指令

SQL語言的指令主要分為三大部分,如下
表所示:
• 資料定義語言(Data Definition Language,
DDL):建立資料表、索引和視界(Views)
等,並且定義資料表的欄位。
• 資料操作語言(Data Manipulation
Language,DML):屬於資料表記錄查詢、
插入、刪除和更新指令。
• 資料控制語言(Data Control Language,
DCL):屬於資料庫安全設定和權限管理的相
關指令。
14-4-2 SQL查詢指令-語法

在SQL語言的資料查詢指令只有一個
SELECT指令,完整指令語法如下所示:
SELECT 欄位1, 欄位2 FROM 資料表 WHERE
conditions

上述SELECT指令的欄位1~2為記錄的欄位,
conditions為查詢條件,使用口語來說就
是「從資料表取回符合WHERE子句條件的
記錄,顯示欄位1和2」。
14-4-2 SQL查詢指令- "*"記錄欄位
SELECT指令可以使用"*"符號代表所有資
料表的欄位,表示取回資料表記錄的所有
欄位,如下所示:
SELECT * FROM iPod
 上述指令沒有WHERE子句,所以是將資料
表內所有的記錄和欄位取回。

14-4-2 SQL查詢指令-單一查詢條件
的WHERE子句1

文字欄位需加單引號或雙引號括起,例如:
型號ModleNo為MA146LL,此時的SQL指
令字串,如下所示:
SELECT * FROM iPod
WHERE ModelNo="MA146LL"
數字欄位不需要單引號括起,例如:價格
為8000元,此時的SQL指令,如下所示:
SELECT * FROM iPod
WHERE Price=8000

14-4-2 SQL查詢指令-單一查詢條件
的WHERE子句2
文字和備註欄位可以使用【LIKE】包含運算子,
只需包含此字串即符合條件,再配合"%"或"_"萬
用字元,可以代表任何字串或單一字元,只需包
含的子字串就符合條件。例如:查詢白色的iPod
產品資料。SQL指令如下所示:
SELECT * FROM iPod
WHERE Name LIKE "%白%"
 數字或日期/時間欄位可以使用<>、>、<、>=
和<=不等於、大於、小於、大於等於和小於等於
等運算子建立多樣化的查詢條件。

14-4-2 SQL查詢指令-多重查詢條件
的WHERE子句

WHERE子句的查詢條件如果不只一個,可以使
用AND和OR邏輯運算子來連接,其基本語法如
下所示:
• AND且運算子:連接前後條件都必須成立,整個條件
才能成立,例如:名稱包含"白"且價格小於等於8000
元。SQL指令如下所示:
SELECT * FROM iPod WHERE
Price<=8000 AND Name LIKE '%白%'
• OR或運算子:連接的前後條件只需任何一個成立即可,
例如:名稱包含"白"或價格小於等於8000元。SQL指
令如下所示:
SELECT * FROM iPod
WHERE Price<=8000 OR Name LIKE '%白%'
14-4-2 SQL查詢指令-排序輸出
SQL查詢結果可以指定欄位進行由小到大,或由
大到小排序,只需在SELECT指令的最後加上
ORDER BY子句即可,如下所示:
SELECT * FROM iPod
WHERE Price>=8000 ORDER BY Price ASC
 上述查詢結果使用Price欄位排序,預設是由小到
大的ASC。如果想倒過來由大到小,只需加上
DESC,如下所示:
SELECT * FROM iPod
WHERE Price>=8000 ORDER BY Price DESC

14-4-2 SQL查詢指令-SQL聚合函數

SQL聚合函數是資料表欄位的筆數、平均、
範圍和統計函數,可以提供進一步資料分
析的結果,如下表所示:
聚合函數
Count(Column)
Avg(Column)
Max(Column)
Min(Column)
Sum(Column)
StDev(Column)
StDevP(Column)
Var(Column)
VarP(Column)
說明
計算記錄筆數
計算欄位平均值
取得記錄欄位的最大值
取得記錄欄位的最小值
取得記錄欄位的總計
統計樣本的標準差
統計母體的標準差
統計樣本的變異數
統計母體的變異數
14-4-3 資料庫操作的SQL指令-說明

SQL資料庫操作指令有:
• INSERT插入
• DELETE刪除
• UPDATE更新記錄。

在建立好SQL操作指令後,Visual Basic
程式碼可以使用Command物件的
ExecuteNonQuery()方法來執行SQL指令。
14-4-3 資料庫操作的SQL指令INSERT插入記錄(語法)

SQL插入記錄INSERT指令可以新增一筆記
錄。其基本語法如下所示:
INSERT INTO table (column1,column2,…..)
VALUES ('value1', 'value2 ', …)

上述SQL指令的table是準備插入記錄的資
料表名稱,column1~n為資料表內的欄位
名稱(不需全部欄位),value1~n是對應
的欄位值。
14-4-3 資料庫操作的SQL指令INSERT插入記錄(注意事項)

INSERT指令的注意事項,如下所示:
• 不論是欄位或值清單,都需要使用逗號分隔。
• INSERT指令VALUES的值,數字不用引號包
圍,字元與日期/時間需要使用引號包圍,
Access的日期/時間是使用"#"符號。
• INSERT指令的欄位清單不需和資料表定義的
欄位數目或順序相同,只需選擇需要新增的欄
位即可,但是括號內的欄位名稱順序需要和
VALUES值的順序相同。
14-4-3 資料庫操作的SQL指令INSERT插入記錄(範例)

例如:在資料表iPod插入一筆記錄的SQL
指令,如下所示:
INSERT INTO iPod (ModelNo,
Name,Storage, Price, StockDate)
VALUES ('M9586LL','白色蘋果iPod Photo‘
,'60GB',15000,#2006/2/20#)

上述SQL指令的欄位值是字串有使用單引
號括起,數字沒有,日期/時間加上"#"符
號。
14-4-3 資料庫操作的SQL指令UPDATE更新記錄(語法)
SQL更新記錄UPDATE指令是將資料表內符合條
件的記錄,更新其欄位內容。其基本語法如下所
示:
UPDATE table SET column1 = 'value1'
WHERE conditions
 上述指令的table是資料表,SET子句column1
是資料表的欄位名稱,不用全部只需指定要更新
的欄位,value1是更新欄位值。如果更新欄位不
只一個,請使用逗號分隔,如下所示:
UPDATE table SET column1 = 'value1' ,
column2 = 'value2'
WHERE conditions

14-4-3 資料庫操作的SQL指令UPDATE更新記錄(注意事項)

UPDATE指令的注意事項,如下所示:
• WHERE條件子句是必要元素,如果沒有此條
件,資料表內所有記錄欄位都會被更新。
• 更新欄位值如為數字不用引號包圍,字元與日
期/時間需要使用引號包圍,Access的日期/時
間是使用"#"符號。
14-4-3 資料庫操作的SQL指令UPDATE更新記錄(範例)

例如:在資料表iPod更改記錄資料的SQL
指令,如下所示:
UPDATE iPod SET BatteryLife=15 ,
StockDate=#2006/2/28#
WHERE ModelNo='M9586LL'

上述SQL指令的WHERE條件為型號
ModelNo欄位,然後使用SET子句更新指
定的欄位資料。
14-4-3 資料庫操作的SQL指令DELETE刪除記錄(語法)

SQL刪除記錄DELETE指令是將資料表內符
合條件的記錄都刪除掉。其基本語法如下
所示:
DELETE FROM table WHERE conditions

上述指令的table是資料表,WHERE子句
conditions為刪除記錄條件,口語來說是
「將符合conditions條件的記錄刪除掉」。
14-4-3 資料庫操作的SQL指令DELETE刪除記錄(注意事項)

DELETE指令的注意事項,如下所示:
• WHERE條件子句是DELETE指令的必要元素,
如果沒有此條件,資料表內的所有記錄都會被
刪除掉。
• WHERE條件能夠使用=、<>、>、<=和>=
運算子。
• WHERE條件可以不只一個,如果擁有多個條
件,請使用邏輯運算子AND或OR運算子連接。
14-4-3 資料庫操作的SQL指令DELETE刪除記錄(範例)

例如:在資料表iPod刪除一筆記錄的SQL
指令,如下所示:
DELETE FROM iPod
WHERE ModelNo ='M9586LL'

上述SQL指令的WHERE條件為型號
ModelNo欄位,也就是將符合型號條件的
iPod產品記錄刪除掉。
14-5 應用實例:iPods產品管理程式
-執行SQL操作指令
在Visual Basic程式只需在開啟資料庫連結和建
立Command物件後,即可使用Command物件
的ExecuteNonQuery()方法來執行SQL操作指
令INSERT、UPDATE和DELETE,如下所示:
Dim intRowsAffected As Integer
intRowsAffected = _
objCmd.ExecuteNonQuery()
 上述程式碼變數intRowsAffected傳回資料表影
響的記錄數,因為使用ExecuteNonQuery()方
法執行SQL指令,所以並不會傳回DataReader
記錄資料。

14-5 應用實例:iPods產品管理程式
-取得資料來源的欄位值

對於資料來源建立的DataSet物件
IPodsDataSet,我們可以使用DataTable物件
的Rows屬性,來取得指定記錄的DataRow物件,
如下所示:
objRow = Me.IPodsDataSet.iPod.Rows(pos)

程式碼取得名為iPod的DataTable物件,位置為
pos的DataRow物件的記錄資料,然後可以使用
欄位名稱取得指定欄位值,如下所示:
txtModelNo.Text = objRow("ModelNo")
txtName.Text = objRow("Name")
txtPrice.Text = objRow("Price")
………
txtStockDate.Text = objRow("StockDate")
14-5 應用實例:iPods產品管理程式
-圖例