課程名稱:資料庫系統 授課老師:李春雄 博士 第九章 資料庫與程式語言整合 課程名稱:資料庫系統 授課老師:李春雄 博士
本章學習目標 1.讓讀者瞭解「資料庫系統」與「應用程式」之 間的關係。 2.讓讀者瞭解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-1 資料庫應用系統
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所示: 2018/11/27 圖9-2 ADO .NET的角色
9-2.2 ADO.NET的架構圖 在圖9-3 ADO .NET 架構圖中,我們可以很清楚的了解ADO.NET 的資料存取方式主要有兩種方式: 第一種是利用DataSet來存取資料庫中的資料。 第二種則是直接經由DataReader來存取資料庫中的資料。 2018/11/27
1. Connection:用來建立與資料庫之間的連接。 說明: 1. Connection:用來建立與資料庫之間的連接。 2. Command:用來對資料庫執行SQL命令,SQL命令包括Insert, Update,Delete, Select等。 3. DataReader:以唯讀方式從資料來源讀取順向資料流,提供程式存取資料的介面。 2018/11/27
4. DataAdapter:表示SQL命令集和資料庫連接,使用資料來源填入 DataSet並更新資料。DataAdapter物件所提供的四個Command物件(包括:SelectCommand, InsertCommand, UpdateComman 及DeleteCommand)來進行資料的存取。 2018/11/27
5. DataSet:可以讀資料庫的內容載入記憶體中,在記憶體中建立一個或多個資料表,提供程式存取資料,其缺點就是會佔用較多的記憶體空間,因此,導致系統負荷較大。而優點則是資料處理上比較有彈性。 2018/11/27
首先ADO.NET透過Connection物件與資料庫進行連接,接下來說明兩種方式的不同之處: 一、第一種方式: 利用DataReader來存取資料庫中的資料,其運作流程如下所示: 說明: 利用Command物件來存取資料庫,並且透過DataReader物件來讀取資料,最後再利用TextBox, Msgbox …物件顯示資料內容,而此種方法與讀者以前學過的RecordSet觀念相同,比較簡易,容易學習並且讀取,但是資料是唯讀的查詢方式,無法直接的修改,並且程式碼比較多。 2018/11/27
利用DataSet來存取資料庫中的資料,其運作流程如下所示: 二、第二種方式: 利用DataSet來存取資料庫中的資料,其運作流程如下所示: 說明: 我們可以利用DataAdapter物件的Fill方法來將資料庫中的資料暫時放到DataSet物件中。 程式如下所示:DataAdapter.Fill(DataSet, "學生資料表") 2018/11/27
除此之外,利用此種方法,可以透過DataAdapter物件來下達各項SQL語法,並且將資料查詢的結果存放到離線的DataSet物件中,因此,DataAdapter物件在此扮演的角色便是資料庫與DataSet物件之間重要的溝通媒介,並且DataSet還可以進行離線資料修改,因此,可以降低資料庫管理系統的連線負擔。 2018/11/27
9-3 命名空間的引用 .NET Framework是個物件導向的系統,因此,當開發人員要使用VB2010來呼叫系統底層的類別時,必須先將類別的命名空間(namespace)引用(匯入)進來。若要使用到ADO.NET,則必須將System.Data命名空間引用進來,此一命名空間定義了建構ADO.NET架構的基礎類別。 2018/11/27
9-3.1 如何引用ADO.NET命名空間 如果我們要利用VB2010來存取資料庫時,必須要用到ADO.NET物件,而如何使用ADO.NET內的物件呢?非常簡單,您只要在撰寫程式前面先引用(Imports)ADO.NET的命名空間(Namespace) 。 ◆引用(Imports)ADO.NET的命名空間(Namespace)的方法: Imports 命名空間的物件名稱 2018/11/27
而在ADO. NET中的命名空間的物件名稱有非常多,諸如:System. Data, System. Data. OleDb, System 而在ADO.NET中的命名空間的物件名稱有非常多,諸如:System.Data, System.Data.OleDb, System.Data.SqlClient, System.Data.IO, System.Data.XML等等,而我們在撰寫程式時,怎麼知道要引用那一個命名空間的物件呢?因此,我們就必須要了解在什麼時候引用那一個命名空間才可以存取到資料庫中的資料。 2018/11/27
現在我們歸納一般常用的引用的撰寫方法如下: 一、引用System.Data.OleDb命名空間 (適用Access、Excel、FoxPro資料庫) Imports System.Data Imports System.Data.OleDb 說明:表示要引用ADO.NET基礎物件以及引用OLE DB資料來源的物件。 2018/11/27
二、若您要連結的資料庫來源是SQL Server 7.0以上版本,則您必須將 System.Data.Oledb改成System.Data.SqlClient這個命名空間 Imports System.Data Imports System.Data.SqlClient 說明:表示要引用ADO.NET基礎物件以及引用SQL Server資料來源的 物件。 2018/11/27
9-3.2 使用Connection物件與 資料庫連結 想要利用ADO.NET來存取資料庫,就必須要先建立物件與資料庫連結,其最主要的工作是透過Connection物件了。 而ADO.NET所提供的Connection物件,可以分為兩種連結方式: 第一種:是指OleDbConnection物件,它是專門用來連結資料庫為 Access、Excel、Dbase時最適合,但是在使用前必須要先 引用System.Data.OleDb的命名空間。 2018/11/27
第二種:是指SqlConnection物件,它是微軟專門針對SQL Server7.0 資料庫以上版本量身定作了它自己的物件,所 要先引用 System.Data.SqlClient的命名空間。 2018/11/27
9-4 資料庫與VB整合 在本單元中,將介紹如何利用VB程式語言來連接後端的資料庫系統,並且將後端的資料庫透過DataReader物件或DataSet物件來讀取資料,最後再利用TextBox, Msgbox …物件或DataGridView等物件來顯示資料內容。 2018/11/27
9-4.1 Access2010資料庫與VB2010連結 一、VB2010與Access資料庫標準連結方式, 其步驟如下: 1.步驟一:引用命名空間 Imports System.Data Imports System.Data.OleDb 2018/11/27
2.步驟二:設定資料庫名稱與路徑< Access2010 / Access2007> 3.步驟三:宣告及建立Connection物件 4.步驟四:使用Open方法來開啟資料庫 5.步驟五:使用Close方法來關閉資料庫 Dim dbpath As String = "DBMS.accdb" '宣告資料庫所在的路徑變數 Dim Source As String '宣告連線的字串 Source = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & dbpath Dim dbpath As String = "DBMS.mdb" '宣告資料庫所在的路徑變數 Dim Source As String '宣告連線的字串 Source = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & dbpath Dim conn As OleDbConnection '宣告連線的物件 conn = New OleDbConnection(Source) '連線 conn.Open() '開啟資料庫 conn.Close() '關閉資料庫 2018/11/27
二、 VB2010連結Access資料庫之測試程式 程式檔案名稱 Ch9-4.1.sln 01 02 03 04 05 06 07 08 09 10 11 12 13 14 Imports System.Data Imports System.Data.OleDb Public Class Form1 Private Sub Button1_Click(……) Handles Button1.Click 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() '開啟資料庫 MsgBox("成功連結到Access資料庫") conn.Close() '關閉資料庫 End Sub End Class 2018/11/27
9-4.2 使用DataReader物件 讀取資料庫的資料 當我們利用OleDbConnection來連接資料庫之後,接下來我們就可以再利用ADO.NET物件中的DataReader物件來取得資料庫中的資料,並將查詢的資料顯示於表單上,而DataReader物件只能逐筆由開頭循序的讀取資料庫中的資料,而且讀出的資料是「唯讀」狀態,因此,不能再進行其他的操作。其程式流程如下: 2018/11/27
一、 Command物件 建立資料庫的連結並且開啟資料庫之後,我們必須利用Command 物件來撰寫SQL指令才能操作資料庫的四個動作,包括了Insert(新增)、Delect(刪除)、Update(修改)及Select(查詢)。 在ADO.NET所提供的Command物件,有兩種執行SQL語法的方法: 第一種:透過Command物件的ExecuteNonQuery方法,可以「新 增」、「修改」「刪除」資料庫中的資料。 第二種:是透過Command物件的ExecuteReader方法將「查詢」結 果的 DataReader物件傳回。 2018/11/27
二、 DataReader物件 我們利用OleDbCommand執行SQL指令之後,尚無法顯示執行的結果,因此,我們就必須將其設定給DataReader物件,並且再利用Command物件的ExecuteReader方法來執行,因此,爾後要讀取資料時,必須以OledbDataReader的Read方法來取得資料。 2018/11/27
(一)VB2010與Access資料庫的撰寫方法 使用OleDbCommand、OleDbDataReader物件(適用Access資料庫)其步驟如下: 2018/11/27
2018/11/27
(二)DataReader的方法與屬性一覽表 2018/11/27
1.Read()方法 利用DataReader物件來「讀取資料庫中第一筆記錄」如果讀到記錄時,則傳回True,否則傳回False。當資料記錄有兩筆或兩筆以上時,那我們如何讀取全部的記錄呢?非常簡單我們只要在程式片段中利用While--- End While 與For…Next迴圈即可顯示所有的資料。 2018/11/27
如果所要讀取的欄位資料是循序的,則利用for/next迴圈的方法是最佳方式,但是,如果要顯示的欄位資料並非是循序的,則必須要利用直接指定法來直接在Item屬性中輸入欄位名稱。 2018/11/27
完整的程式碼: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() '關閉資料庫 2018/11/27
顯示結果: 完整的程式碼:ch9-4.2A.sln 2018/11/27
如果利用直接指定法來直接在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 2018/11/27
2.GetName(i)方法 完成上面的程式碼之後,您是否會發現只會顯示出所有的記錄,但是卻無法即時的了解到每一筆記錄中每一個欄位所代表的意義呢?因此,我們就必須要把每一筆記錄的每一個欄位名稱顯示出來,當作抬頭名稱。 2018/11/27
Dim SelectCmd As String Dim i As Integer ..................... …… 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() TextBox1.Text &= reader.Item(i) & vbTab End While conn.Close() '關閉資料庫 2018/11/27
顯示結果: 完整的程式碼:ch9-4.2B.sln 2018/11/27
9-4.3 使用DataSet物件來讀取資料 DataSet物件是System.Data命名空間的重要物件,其主要的功能是取得資料庫中的資料之後,再顯示在瀏覽器上。但是DataSet物件本身並沒有存取資料庫的能力,因此它需要依賴其它的物件(例如OleDbConnection物件、OleDbCommand物件或是OldDbDataAdapter物件)提供資料給它。其中以「OldDbDataAdapter」物件跟DataSet之間的關係最為密切。 其程式流程如下: 2018/11/27
連結DataAdapter物件的步驟 步驟一:宣告並建立DataSet與DataAdapter兩個物件 步驟二:再利用DataAdapter物件直接執行的SQL語法 步驟三:最後使用DataAdapter物件的Fill方法將查詢資料的結果放到 DataSet物件中。 2018/11/27
完整的程式碼: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() ' 關閉資料庫 2018/11/27
顯示結果 完整的程式碼:ch9-4.3A.sln 2018/11/27