Transcript 資料庫系統_課程
第九章
資料庫與程式語言整合
課程名稱:資料庫系統
授課老師:李春雄 博士
本章學習目標
1.讓讀者瞭解「資料庫系統」與「應用程式」之
間的關係。
2.讓讀者瞭解ADO.NET的架構及運作原理。
3.讓讀者瞭解ADO.NET與資料庫的連接方式、
存取方法。
本章內容
9-1何謂資料庫應用系統?
9-2 ADO.NET的簡介
9-3 命名空間的引用
9-4 資料庫與VB2010整合
9-1 何謂資料庫應用系統?
在前面幾個章節中,已經學會如何將使用者的需求繪
製成ER圖(邏輯設計),進而轉換成真正可以儲存資料的資
料表(實體設計),其目的就是建立一個降低資料重覆、避
免資料異常的資料庫操作環境,進而才能確保資料的一致
性、完整性,以達到資料共享(Data Sharing)的目的。
9-1 何謂資料庫應用系統?<續>
既然,資料庫以共享為目的,那就必須要透過應用程
式來讀取「使用者的需求條件」,送到資料庫理管系統來
處理,並將查詢結果回傳到個別使用者的畫面,此系統稱
為「資料庫應用系統」。
(應用程式)
圖9-1 資料庫應用系統
在上圖中,「應用程式」是指利用ASP, JSP,ADO.NET等網頁開發程式,透過
T-SQL指令來存取資料庫中的資料。它會依照使用者的需求來進行查詢,並將
查詢結果回傳給使用者。
9-2 ADO.NET的簡介
ADO.NET(ActiveX Data Object.NET)可以說是微軟公司
最新一代的「資料庫存取架構」,它是專門用來存.NET
平台上後端資料庫,它不但比以前的ADO功能還要強大。
原因是ADO.NET中包括了五個主要物件,分別為:
1.Connection物件
2.Command物件
3.DataAdapter物件
4.DataSet物件
5.DataReader物件
這些物件是以物件導向的設計方式並且它對分散式資料存取提供了多項功能。
9-2 ADO.NET的簡介<續>
此外,ADO.NET為了因應不同的網際網路的資料交換。因
此,也採用企業界標準的XML格式,所以,在往後對於網
路上的異質性資料庫也有直接整合的功能及物件。
9-2.1 ADO.NET的角色
ADO.NET是程式語言與資料庫之間的溝通橋樑。因此,我們可以利
用VB2010、C#2010、ASP.NET 3.5及J#等程式語言來撰寫應用程式,
再透過ADO.NET就可以輕易的存取資料庫的資料了。如圖9-2所示:
2015/4/8
圖9-2 ADO .NET的角色
8
9-2.2 ADO.NET的架構圖
在圖9-3 ADO .NET 架構圖中,我們可以很清楚的了解ADO.NET
的資料存取方式主要有兩種方式:
第一種是利用DataSet來存取資料庫中的資料。
第二種則是直接經由DataReader來存取資料庫中的資料。
2015/4/8
9
說明:
1. Connection:用來建立與資料庫之間的連接。
2. Command:用來對資料庫執行SQL命令,SQL命令包括Insert,
Update,Delete, Select等。
3. DataReader:以唯讀方式從資料來源讀取順向資料流,提供程式
存取資料的介面。
2015/4/8
10
4. DataAdapter:表示SQL命令集和資料庫連接,使用資料來源填入
DataSet並更新資料。DataAdapter物件所提供的四個Command
物件(包括:SelectCommand, InsertCommand,
UpdateComman 及DeleteCommand)來進行資料的存取。
2015/4/8
11
5. DataSet:可以讀資料庫的內容載入記憶體中,在記憶體中建立一
個或多個資料表,提供程式存取資料,其缺點就是會佔用較多的記
憶體空間,因此,導致系統負荷較大。而優點則是資料處理上比較
有彈性。
2015/4/8
12
首先ADO.NET透過Connection物件與資料庫進行連接,接下來說明
兩種方式的不同之處:
一、第一種方式:
利用DataReader來存取資料庫中的資料,其運作流程如下所示:
Connection
Command
DataReader
資料控制項
資料庫
說明:
利用Command物件來存取資料庫,並且透過DataReader物件來讀取
資料,最後再利用TextBox, Msgbox …物件顯示資料內容,而此種方法
與讀者以前學過的RecordSet觀念相同,比較簡易,容易學習並且讀取,
但是資料是唯讀的查詢方式,無法直接的修改,並且程式碼比較多。
2015/4/8
二、第二種方式:
利用DataSet來存取資料庫中的資料,其運作流程如下所示:
Connection
DataAdapter
DataSet
資料控制項
資料庫
說明:
我們可以利用DataAdapter物件的Fill方法來將資料庫中的資料暫時
放到DataSet物件中。
程式如下所示:DataAdapter.Fill(DataSet, "學生資料表")
2015/4/8
除此之外,利用此種方法,可以透過DataAdapter物件來下達各項
SQL語法,並且將資料查詢的結果存放到離線的DataSet物件中,
因此,DataAdapter物件在此扮演的角色便是資料庫與DataSet物
件之間重要的溝通媒介,並且DataSet還可以進行離線資料修改,
因此,可以降低資料庫管理系統的連線負擔。
2015/4/8
15
9-3 命名空間的引用
.NET Framework是個物件導向的系統,因此,當開發人員要使用
VB2010 來 呼 叫 系 統 底 層 的 類 別 時 , 必 須 先 將 類 別 的 命 名 空 間
(namespace)引用(匯入)進來。若要使用到ADO.NET,則必須
將 System.Data 命 名 空 間 引 用 進 來 , 此 一 命 名 空 間 定 義 了 建 構
ADO.NET架構的基礎類別。
2015/4/8
16
9-3.1 如何引用ADO.NET命名空間
如果我們要利用VB2010來存取資料庫時,必須要用到ADO.NET物件,
而如何使用ADO.NET內的物件呢?非常簡單,您只要在撰寫程式前
面先引用(Imports)ADO.NET的命名空間(Namespace) 。
◆引用(Imports)ADO.NET的命名空間(Namespace)的方法:
Imports 命名空間的物件名稱
2015/4/8
17
而 在 ADO.NET 中 的 命 名 空 間 的 物 件 名 稱 有 非 常 多 , 諸 如 :
System.Data,
System.Data.OleDb,
System.Data.SqlClient,
System.Data.IO, System.Data.XML等等,而我們在撰寫程式時,
怎麼知道要引用那一個命名空間的物件呢?因此,我們就必須要了
解在什麼時候引用那一個命名空間才可以存取到資料庫中的資料。
2015/4/8
18
現在我們歸納一般常用的引用的撰寫方法如下:
一、引用System.Data.OleDb命名空間
(適用Access、Excel、FoxPro資料庫)
Imports System.Data
Imports System.Data.OleDb
說明:表示要引用ADO.NET基礎物件以及引用OLE DB資料來源的物件。
2015/4/8
19
二、若您要連結的資料庫來源是SQL Server 7.0以上版本,則您必須將
System.Data.Oledb改成System.Data.SqlClient這個命名空間
Imports System.Data
Imports System.Data.SqlClient
說明:表示要引用ADO.NET基礎物件以及引用SQL Server資料來源的
物件。
2015/4/8
20
9-3.2 使用Connection物件與
資料庫連結
想要利用ADO.NET來存取資料庫,就必須要先建立物件與資料庫連
結,其最主要的工作是透過Connection物件了。
而ADO.NET所提供的Connection物件,可以分為兩種連結方式:
第一種:是指OleDbConnection物件,它是專門用來連結資料庫為
Access、Excel、Dbase時最適合,但是在使用前必須要先
引用System.Data.OleDb的命名空間。
2015/4/8
21
第二種:是指SqlConnection物件,它是微軟專門針對SQL
Server7.0 資料庫以上版本量身定作了它自己的物件,所
以當使用者想要利用程式與連結SQL Server 時,就必須
要先引用 System.Data.SqlClient的命名空間。
2015/4/8
22
9-4 資料庫與VB整合
在本單元中,將介紹如何利用VB程式語言來連接後端的資料庫
系統,並且將後端的資料庫透過DataReader物件或DataSet物件來
讀取資料,最後再利用TextBox, Msgbox …物件或DataGridView
等物件來顯示資料內容。
2015/4/8
23
9-4.1 Access2010資料庫與VB2010連結
一、VB2010與Access資料庫標準連結方式,
其步驟如下:
1.步驟一:引用命名空間
Imports System.Data
Imports System.Data.OleDb
2015/4/8
24
2.步驟二:設定資料庫名稱與路徑< Access2010 / Access2007>
Dim dbpath As String = "DBMS.accdb" '宣告資料庫所在的路徑變數
Dim Source As String
'宣告連線的字串
Source = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & dbpath
< Access2003>
Dim dbpath As String = "DBMS.mdb" '宣告資料庫所在的路徑變數
Dim Source As String
'宣告連線的字串
Source = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & dbpath
3.步驟三:宣告及建立Connection物件
Dim conn As OleDbConnection
conn = New OleDbConnection(Source)
'宣告連線的物件
'連線
4.步驟四:使用Open方法來開啟資料庫
conn.Open()
'開啟資料庫
5.步驟五:使用Close方法來關閉資料庫
conn.Close()
'關閉資料庫
2015/4/8
25
二、 VB2010連結Access資料庫之測試程式
程式檔案名稱
Ch9-4.1.sln
01
Imports System.Data
02
Imports System.Data.OleDb
03
Public Class Form1
04
Private Sub Button1_Click(……) Handles Button1.Click
05
Dim dbpath As String = "DBMS.accdb"
06
Dim Source As String
07
Source = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & dbpath
08
Dim conn As OleDbConnection
09
conn = New OleDbConnection(Source)
10
conn.Open()
11
MsgBox("成功連結到Access資料庫")
12
13
14
conn.Close()
'宣告資料庫所在的路徑變數
'宣告連線的字串
'宣告連線的物件
'連線
'開啟資料庫
'關閉資料庫
End Sub
End Class
2015/4/8
26
9-4.2 使用DataReader物件
讀取資料庫的資料
當我們利用OleDbConnection來連接資料庫之後,接下來我們就可
以再利用ADO.NET物件中的DataReader物件來取得資料庫中的資料,
並將查詢的資料顯示於表單上,而DataReader物件只能逐筆由開頭
循序的讀取資料庫中的資料,而且讀出的資料是「唯讀」狀態,因此,
不能再進行其他的操作。其程式流程如下:
Connection
Command
DataReader
資料控制項
資料庫
2015/4/8
27
一、 Command物件
建立資料庫的連結並且開啟資料庫之後,我們必須利用
Command 物件來撰寫SQL指令才能操作資料庫的四個動作,包括了
Insert(新增)、Delect(刪除)、Update(修改)及Select(查詢)。
在ADO.NET所提供的Command物件,有兩種執行SQL語法的方法:
第一種:透過Command物件的ExecuteNonQuery方法,可以「新
增」、「修改」「刪除」資料庫中的資料。
第二種:是透過Command物件的ExecuteReader方法將「查詢」結
果的 DataReader物件傳回。
2015/4/8
28
二、 DataReader物件
我們利用OleDbCommand執行SQL指令之後,尚無法顯示執行的結
果,因此,我們就必須將其設定給DataReader物件,並且再利用
Command物件的ExecuteReader方法來執行,因此,爾後要讀取資
料時,必須以OledbDataReader的Read方法來取得資料。
2015/4/8
29
(一)VB2010與Access資料庫的撰寫方法
使用OleDbCommand、OleDbDataReader物件(適用Access資料
庫)其步驟如下:
2015/4/8
30
2015/4/8
31
(二)DataReader的方法與屬性一覽表
2015/4/8
32
1.Read()方法
利用DataReader物件來「讀取資料庫中第一筆記錄」如果讀到記錄
時,則傳回True,否則傳回False。當資料記錄有兩筆或兩筆以上時,
那我們如何讀取全部的記錄呢?非常簡單我們只要在程式片段中利用
While--- End While 與For…Next迴圈即可顯示所有的資料。
2015/4/8
33
如果所要讀取的欄位資料是循序的,則利用for/next迴圈的方法是最
佳方式,但是,如果要顯示的欄位資料並非是循序的,則必須要利用
直接指定法來直接在Item屬性中輸入欄位名稱。
2015/4/8
34
完整的程式碼:ch9-4.2A.sln
Dim dbpath As String = "DBMS.accdb"
Dim Source As String
'宣告資料庫所在的路徑變數
'宣告連線的字串
Source = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & dbpath
Dim conn As OleDbConnection
'宣告連線的物件
conn = New OleDbConnection(Source)
conn.Open()
'連線
'開啟資料庫
Dim SelectCmd As String
Dim i As Integer
SelectCmd = "select * from 學生資料表"
Dim Cmd As OleDbCommand = New OleDbCommand(SelectCmd, conn)
Dim reader As OleDbDataReader
reader = Cmd.ExecuteReader()
'顯示資料表欄位的所有資料
While reader.Read()
For i = 0 To reader.FieldCount - 1
TextBox1.Text &= reader.Item(i) & vbTab
Next i
TextBox1.Text &= vbNewLine
End While
conn.Close()
'關閉資料庫
2015/4/8
35
顯示結果: 完整的程式碼:ch9-4.2A.sln
2015/4/8
36
如果利用直接指定法來直接在Item屬性中輸入欄位名稱。則以上行號
18~23則必須改為以下程式即可。
While reader.Read()
TextBox1.Text &= reader.Item("學號") & vbTab
TextBox1.Text &= reader.Item("姓名") & vbTab
TextBox1.Text &= reader.Item("系碼") & vbTab
TextBox1.Text &= vbNewLine
End While
2015/4/8
2.GetName(i)方法
完成上面的程式碼之後,您是否會發現只會顯示出所有的記錄,但是
卻無法即時的了解到每一筆記錄中每一個欄位所代表的意義呢?因此,
我們就必須要把每一筆記錄的每一個欄位名稱顯示出來,當作抬頭名稱。
2015/4/8
38
.....................
……
Dim SelectCmd As String
Dim i As Integer
SelectCmd = "select * from 學生資料表"
Dim Cmd As OleDbCommand = New OleDbCommand(SelectCmd, conn)
Dim reader As OleDbDataReader
reader = Cmd.ExecuteReader()
'顯示資料表欄位名稱
For i = 0 To reader.FieldCount - 1
TextBox1.Text &= reader.GetName(i) & vbTab
Next i
TextBox1.Text &= vbNewLine
'顯示資料表欄位的所有資料
While reader.Read()
For i = 0 To reader.FieldCount - 1
TextBox1.Text &= reader.Item(i) & vbTab
Next i
TextBox1.Text &= vbNewLine
End While
conn.Close()
'關閉資料庫
2015/4/8
39
顯示結果: 完整的程式碼:ch9-4.2B.sln
2015/4/8
40
9-4.3 使用DataSet物件來讀取資料
DataSet物件是System.Data命名空間的重要物件,其主要的功能是
取得資料庫中的資料之後,再顯示在瀏覽器上。但是DataSet物件本
身並沒有存取資料庫的能力,因此它需要依賴其它的物件(例如
OleDbConnection物件、OleDbCommand物件或是
OldDbDataAdapter物件)提供資料給它。其中以
「OldDbDataAdapter」物件跟DataSet之間的關係最為密切。
其程式流程如下:
Connection
DataAdapter
DataSet
資料控制項
資料庫
2015/4/8
41
連結DataAdapter物件的步驟
步驟一:宣告並建立DataSet與DataAdapter兩個物件
步驟二:再利用DataAdapter物件直接執行的SQL語法
步驟三:最後使用DataAdapter物件的Fill方法將查詢資料的結果放到
DataSet物件中。
2015/4/8
42
完整的程式碼:ch9-4.3A.sln
Dim dbpath As String = "DBMS.accdb"
Dim Source As String
'宣告資料庫所在的路徑變數
'宣告連線的字串
Source = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & dbpath
Dim conn As OleDbConnection
'宣告連線的物件
conn = New OleDbConnection(Source)
conn.Open()
'連線
'開啟資料庫
' 開啟資料庫
Dim SelectCmd As String
SelectCmd = “select 學號,姓名,系名from 學生資料表,科系代碼資料表 where 學生資料表.系碼
=科系代碼資料表.系碼"
'宣告物件
Dim DtApter As OleDbDataAdapter
Dim DtSet As DataSet
DtApter = New OleDbDataAdapter(SelectCmd, conn)
DtSet = New DataSet
'讀取資料表
DtApter.Fill(DtSet, "學生資料表")
DataGridView1.DataSource = DtSet.Tables("學生資料表")
conn.Close()
' 關閉資料庫
2015/4/8
43
顯示結果
完整的程式碼:ch9-4.3A.sln
2015/4/8
44