第十七章 ado.net 與資料庫

55
第第第第 ADO.NET 第第第第

Upload: cullen-tanner

Post on 02-Jan-2016

70 views

Category:

Documents


0 download

DESCRIPTION

第十七章 ADO.NET 與資料庫. 17-1 資料庫基本認識. 將資料存入硬碟的方式有二種,其一是檔案,其二是資料庫。此二種模式最大的差別,在於資料庫與一般使用者之間多了一個資料庫管理系統 (Database Management System , DBMS) 。 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第十七章  ADO.NET 與資料庫

第十七章 ADO.NET 與資料庫

Page 2: 第十七章  ADO.NET 與資料庫

17-1 資料庫基本認識將資料存入硬碟的方式有二種,其一是檔案,其二是資料庫。此二種模式最大的差別,在於資料庫與一般使用者之間多了一個資料庫管理系統 (Database Management System , DBMS) 。於檔案模式中,程式設計者必須了解資料的型態、長度,親自撰寫程式才能取得硬碟資料;於資料庫模式中,程式設計者的工作就輕鬆了,因為程式設計者與硬碟之間多了一個資料庫管理系統,就如同您身旁有一位秘書或出門有司機一樣,凡事只要動口而不必動手,當然工作會輕鬆愉快。所以,使用者可使用不同的應用程式,或甚至不寫任何程式,即可透過資料庫管理系統取得資料。所以本書不介紹使用檔案模式存取硬碟資料,直接介紹資料庫,就如同現代人開車不用學手排車,其道理是相同的。

Page 3: 第十七章  ADO.NET 與資料庫

資料表 (Table)假設有員工基本資料如下,若將以下資料以資料庫模式存入硬碟,則稱此檔案為資料表。

編 號 姓 名 性 別 職 務 年 齡

A01 張建原 男 教師 38

A02 洪國勝 男 教師 37

B01 孫得昌 男 主任 42

B02 王麗萍 女 組長 32

Page 4: 第十七章  ADO.NET 與資料庫

欄位 (Field)上圖中的直向資料,例如編號、姓名、年齡及職務等稱為欄位,本例共有五個欄位。

Page 5: 第十七章  ADO.NET 與資料庫

記錄 (Record)上圖中的橫向資料,例如 A01 、張建原、男、教師稱為一筆記錄,本例共有四筆記錄。

Page 6: 第十七章  ADO.NET 與資料庫

資料項 (Data Item)上圖中的“ A01” 、“張建原”或“主任”等單一資料稱為資料項,本例共有二十個資料項,資料項是資料庫的最小單位。

Page 7: 第十七章  ADO.NET 與資料庫

資料庫 (Database)眾多相關資料表的集合稱為資料庫。

Page 8: 第十七章  ADO.NET 與資料庫

資料集 (DataSet or RecordSet)我們可從一個或一個以上的資料表中,使用 SQL 敘述萃取某些欄位,而形成一個資料集合,此一集合即稱為資料集。

Page 9: 第十七章  ADO.NET 與資料庫

索引 (Index)讀者可以想像一下,一本國語字典至少都有兩種索引,一是注音索引表,另一是部首索引表。各位可以注意每個索引表都只有兩個欄位,一是國字本身,一是頁數,而較大的字典甚至還有電信明碼或四角號碼等索引。電腦的索引原理也是相同的,增加索引的目的是用來增加查詢的速度。對資料庫而言,我們只要指定哪些欄位要建立成索引之後,資料庫就會自動幫我們建立索引區,然後根據索引搜尋資料,並且針對這些欄位加以排序。但要注意一點的是,索引在資料庫中是獨立的資料區域,因此會佔據額外的硬碟空間,所以,只在可加速搜尋的欄位加裝索引即可,以免浪費硬碟空間。

Page 10: 第十七章  ADO.NET 與資料庫

17-2 ADO.NETADO.NET (ActiveX Data Objects for the .NET Framework) 是微軟所提出新一代的資料存取服務,並將這些服務提供給 .NET 程式設計人員使用。透過 ADO.NET 所提供的元件,您就可以存取關聯式資料庫、 XML 和應用程式資料。 ADO.NET 支援數種開發需求,包括建立前端 (Front End) 資料庫用戶端,以及應用程式、工具、語言或 Internet 瀏覽器使用的中介層商務物件 (Middle Tier Business Object) 。ADO.NET包含了以下六個命名空間 (Namespace):

Page 11: 第十七章  ADO.NET 與資料庫

System.DataADO.NET架構的核心命名空間,主要是包含了資料庫基本物件。例如,資料表 (DataTable) 、欄位 (DataColumn) 、列 (DataRow) 及資料集 (DataSet) 等。

Page 12: 第十七章  ADO.NET 與資料庫

System.Data.Common包含 .NET 資料提供者 (Data Provider) 共用的類別。

Page 13: 第十七章  ADO.NET 與資料庫

System.Data.OleDb其中的類別可讓您連接至 OLE DB 的資料來源、對來源執行 SQL命令及讀取結果。

Page 14: 第十七章  ADO.NET 與資料庫

System.Data.SqlClient組成 SQL Server 的 .NET 資料提供者的類別,允許您連接到 SQL Server 、執行SQL命令並讀取結果。 System.Data.SqlClient命名空間與 System.Data.OleDb命名空間類似,但它是針對存取 SQL Server 及更新版本而進行最佳化。

Page 15: 第十七章  ADO.NET 與資料庫

System.Data.SqlTypes提供 SQL Server內原生資料 (Native Data) 型別的類別。這些類別會提供較安全、較快速的資料型別,來替代其他的資料型別。使用這個命名空間中的類別,可避免萬一發生遺失精確度的情況時所造成的型別轉換錯誤。

Page 16: 第十七章  ADO.NET 與資料庫

System.Xml針對處理 XML文件,所提供標準架構的類別。用戶端應用程式透過 ADO.NET元件,存取後端資料庫的架構如下圖所示:

Page 17: 第十七章  ADO.NET 與資料庫

用戶端應用程式 資料提供者 (Data Provider) 資料來源

視窗程式 Connection SQL Server

讀取 (Select)

網頁程式 Commend Commend 寫入 其他類型 (Update 資料庫 DataAdapter Insert

Delete) OLE DB 資 DataReader DataSet 料來源

Page 18: 第十七章  ADO.NET 與資料庫

.NET 資料提供者 (Data Provider)

.NET 資料提供者的用途是連接資料庫、執行命令和擷取結果。這些結果可能會經過直接處理、放入 ADO.NET DataSet 物件、與來自多種來源的資料合併,或者在各層間遠端傳遞。

Page 19: 第十七章  ADO.NET 與資料庫

下列表格列出構成 .NET 資料提供者的五個核心物件。物 件 說 明

Connection 建立連至特定資料來源的連接。

Command 對資料來源執行命令。例如, Select 、 Insert 、 Update 、 Delete 等 SQL 指令,以及 Stored Procedure 。

DataReader 從資料來源讀取順向唯讀的資料流。

DataAdapter 使用資料來源填入 DataSet 並將更新解析回資料來源。

DataSet 1. ADO.NET支援中斷連線、分散式資料處理不可或缺的要項。2. 是常駐記憶體的資料表示,可提供一致的關聯式程式撰寫模型,而不受資料來源限制。

Page 20: 第十七章  ADO.NET 與資料庫

.NET Framework 包含二種資料提供者: 1.SQL Server .NET 資料提供者:使用自

己的通訊協定與 SQL Server 通訊,用來直接存取 SQL Server ,會得到最佳效能,其命名空間為 System.Data.SqlClient 。

2.OLE DB .NET 資料提供者:使用原生OLE DB 來啟用資料存取,可存取各種 OLE DB 資料來源。例如, Access 、 OLAP Services 、Directory Services 或其他異質資料庫等,其命名空間為 System.Data.OleDb 。以上兩種資料提供者的差異,比較如下圖。

Page 21: 第十七章  ADO.NET 與資料庫

SQL Server.NET 資料提供者 OLE DB.NET 資料提供者

OLE DB 服務元件

SQL Sever 7.0 OLE DB 提供者 或更新版本

OLE DB 資料來源

Page 22: 第十七章  ADO.NET 與資料庫

17-3 使用對話框連結資料庫 在上一節中我們認識了 .NET 資料提供者的核心物件,現在就讓我們來學習如何在 VB.NET 的設計階段,能夠自動產生這些物件,並且透過這些物件,只要寫極少的程式,就可以連結到資料庫。

Page 23: 第十七章  ADO.NET 與資料庫

<範例 >17-3aAccess 資料庫“ C:\VBBook\Northwind.mdb”『客戶』資料表的內容如下,請利用 ADO.NET提供的物件,顯示出來。

Page 24: 第十七章  ADO.NET 與資料庫

17-4 使用程式連結資料庫 在 17-3節中,我們雖然學到了透過滑鼠的拖拉,就可以自動產生 ADO.NET 的物件,但這種做法,卻不是最好的方式,道理很簡單,因為沒有彈性可言。例如,我們無法從兩個以上的資料表中擷取資料。再者,我們無法決定何時才要真正的連上資料庫。最後,也是最重要的一點,我們無法傳送 SQL 敘述至後端的資料庫。對 SQL 不熟的讀者,請看第 18 章,在第 18 章中將介紹如何透過 SQL 敘述操作資料庫。

Page 25: 第十七章  ADO.NET 與資料庫

在 Database 程式設計中,如何由前端傳送 SQL 敘述至後端的資料庫,是一項非常重要的主題。要改進上述的這些缺點,只有靠程式敘述,先產生 ADO.NET提供的物件之後,再進一步地控制這些物件的屬性及方法,來完成我們的工作。以下是 VB.NET 程式存取資料庫的步驟,分別是選擇資料提供者、建立 Connection物件、建立 Command物件、建立 DataAdapter物件、建立 DataSet物件及建立與連結 DataGrid物件,分別說明如下:

Page 26: 第十七章  ADO.NET 與資料庫

選擇資料提供者﹝ Data Provider﹞我們必須要先確定欲連結資料庫的種類,以選擇適當的 .NET 資料提供者。例如,SQL Server 7.0 以上的版本,要在程式最開始的地方,加上以下敘述:

Imports System.Data.SqlClient若要連結 OLE DB 資料來源,像是 Access 資料庫,則要加上以下敘述:

Imports System.Data.OleDb

Page 27: 第十七章  ADO.NET 與資料庫

建立 Connection物件連結資料庫的第一步是建立 Connection物件,並設定 ConnectionString屬性。首先,建立物件的語法如下:Dim 物件名稱 As New OleDbConnection( )

其次,設定 ConnectionString屬性的語法如下:物件名稱 .ConnectionString = "連結字串 "

以上物件的建立與屬性的設定,亦可合併如下:Dim 物件名稱 As New OleDbConnection("連結字串 ")

Page 28: 第十七章  ADO.NET 與資料庫

例如,假設欲連結 Access 檔案,此檔案的路徑及檔名為“ C:\VBBook \Northwind.mdb” ,則所需敘述如下:

Dim cn As New OleDbConnection( )cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=C:\VBBook\Northwind.mdb"

在 "連結字串 " 中,我們看到了「 Provider」以及「 Data Source」兩個屬性,「 Provider」是用來設定與資料庫連線時所使用的驅動程式,而「 Data Source」則是用來告訴系統我們要連結的 Access 檔案在什麼地方。最後,別忘了呼叫 Open 方法,建立和資料庫的連結。其敘述如下:

cn.Open( )

Page 29: 第十七章  ADO.NET 與資料庫

另外,若是我們要連結至 SQL Server 的話,其敘述如下:

Imports System.Data.SqlClient

Dim cn As New SqlConnection()

cn.ConnectionString = "Server=ComputerName;" & _

"Database=DatabaseName;" & _

"UID=UserID; PWD=Password"

在 "連結字串 " 中,我們看到了「 Server」、「 Database」、「 UID」以及「 PWD」四個屬性,「 Server」是用來指定 SQL Server 資料庫是在那一台電腦上,「 Database」是用來指定資料庫的名稱,「 UID」是用來指定登入資料庫的帳號,而「 PWD」則是用來指定登入資料庫的密碼。

Page 30: 第十七章  ADO.NET 與資料庫

建立 Command物件與資料庫建立連結後,我們必須藉由建立『 Command』物件,傳送 SQL 敘述給後端資料庫,並與 Connection物件連結,其語法如下:

Dim 物件名稱 As New OleDbCommand( )

物件名稱 .CommandText = “SQL 敘述” 物件名稱 .Connection = cn

cn 是 Connection物件, Connection屬性用來連結至 Connection物件,以上三個敘述亦可合併如下:

Page 31: 第十七章  ADO.NET 與資料庫

Dim物件名稱 As New OleDbCommand("SQL 敘述 ", cn)

'cn 是 Connection物件例如,我們要藉由以上敘述的 cn物件,找出『客戶』資料表中的所有紀錄,其敘述如下:

Dim cm As New OleDbCommand()

cm.CommandText = "Select * From 客戶 "

cm.Connection = cn

Page 32: 第十七章  ADO.NET 與資料庫

建立 DataAdapter物件當我們設定 SQL 敘述後,必須藉由建立DataAdapter物件與 Command物件連結,並執行 SQL 敘述擷取資料至用戶端,其語法如下:

Dim 物件名稱 As New OleDbDataAdapter()物件名稱 = New OleDbDataAdapter(cm) 'cm 是 Command物件

以上二個敘述亦可合併如下:Dim 物件名稱 As New OleDbDataAdapter(cm)

Page 33: 第十七章  ADO.NET 與資料庫

建立 DataSet物件當 DataAdapter物件擷取資料至用戶端後,利用 Fill 方法,將資料填入 DataSet物件。例如,我們要從上例的 cm物件,將『客戶』資料表中的所有紀錄填入 DataSet物件,其敘述如下:

Dim da As New OleDbDataAdapter()

Dim ds As New DataSet()

da = New OleDbDataAdapter(cm)

da.Fill(ds, "客戶 ")

Page 34: 第十七章  ADO.NET 與資料庫

建立與連結 DataGrid物件欲將取得的資料,藉由表單輸出,必須先於表單配置 DataGrid物件。其次,再設定 DataSource屬性,如以下敘述:

DataGrid1.DataSource = ds.Tables("客戶 ")

' 將結果顯示至 DataGrid物件

Page 35: 第十七章  ADO.NET 與資料庫

< 範例 >17-4a使用本節所介紹的程式敘述,產生 ADO.NET物件,重做範例 17-3a ,並將結果顯示出來。

Page 36: 第十七章  ADO.NET 與資料庫

<範例 >17-4b示範不使用『 Command』物件,重做範例 17-4a ,並請自行比較兩範例的程式碼。

Page 37: 第十七章  ADO.NET 與資料庫

17-5 資料繫結﹝ DataBinding﹞類別

資料繫結可以讓控制項與資料來源產生連結,顯示資料來源的資料。我們在此介紹兩種資料繫結。

Page 38: 第十七章  ADO.NET 與資料庫

單一欄位值的資料繫結有一些控制項 (Control) ,像是 TextBox 、 CheckBox 、RadioButton 等,可以與資料來源結合,用來顯示某一欄位的值,其語法如下:

Control.DataBindings.Add("Property", DataSource,"DataMember")

Property:是控制項的某個屬性。 DataSource:可以是 DataSet 、 DataTable 或 DataView 。 DataMember:如果「 DataSource」是 DataSet , Data

Member 就是「資料表 . 欄位名稱」;如果「 DataSource」是 DataTable , DataMember 就是「欄位名稱」。例如,以下敘述將『客戶』資料表的『客戶編號』欄位的值,由 TextBox控制項顯示出來。

txt客戶編號 .DataBindings.Add("Text", ds, "客戶 .客戶編號 ")

Page 39: 第十七章  ADO.NET 與資料庫

多個欄位值的資料繫結最常見的控制項為 DataGrid ,可以顯示多個欄位的多筆記錄。例如,以下敘述將『客戶』資料表的內容,由 DataGrid元件顯示出來。

DataGrid1.DataSource = ds 'ds 為 DataSet

DataGrid1.DataMember = "客戶 "

Page 40: 第十七章  ADO.NET 與資料庫

<範例 >17-5a將 Access 資料庫“ C:\VBBook\Northwind.mdb”『客戶』資料表的內容,利用本節介紹的兩種資料繫結,顯示出來。

Page 41: 第十七章  ADO.NET 與資料庫

17-6 資料的編輯

Page 42: 第十七章  ADO.NET 與資料庫

記錄指標的移動當 DataSource 與控制項產生資料繫結之後,我們可以利用 BindingManagerBase類別來處理記錄指標。而這個類別主要利用兩個重要的屬性,來處理記錄指標。請看下表:屬 性 說 明

Count 取得 BindingManagerBase 管理的資料列數

Position 以零起始的索引,指向目前的記錄指標位置

Page 43: 第十七章  ADO.NET 與資料庫

我們若要建立 BindingManagerBase物件,必須使用 BindingContext類別建立或傳回被收納資料繫結控制項所使用之資料來源的 BindingManagerBase 。最常見的情形是使用 Form類別的 BindingContext來傳回表單上資料繫結控制項的 BindingManagerBase物件。例如,以下敘述可得到 BindingManagerBase物件 bm ,以管理表單的資料繫結與處理記錄指標:

Dim bm As BindingManagerBasebm = Me.BindingContext(ds, "客戶 ") 'Me 為表單本身

由以上敘述取得 bm 之後,就可以透過此物件移動記錄指標了。例如:

bm.Position = bm.Position + 1 ' 將記錄向後移動一筆

bm.Position = bm.Position – 1 ' 將記錄向前移動一筆

Page 44: 第十七章  ADO.NET 與資料庫

<範例 >17-6a使用資料繫結,重做範例 17-5a ,使得使用者可使用上一筆、下一筆、首筆及尾筆等按鈕,而移動記錄。

Page 45: 第十七章  ADO.NET 與資料庫

記錄的查詢在設計資料庫系統時,前端維護畫面一定要具備四項功能:新增、修改、刪除及查詢。其中查詢功能是利用 SQL 的 Select 敘述, Where條件則是運用一些技巧得到。例如,維護畫面設計如下圖所示,而查詢條件是如果使用者在“客戶編號”文字欄 (TextBox)內有輸入值,我們就找出“客戶編號”為該值的資料;而如果使用者沒有輸入任何值,我們就找出所有的資料。

Page 46: 第十七章  ADO.NET 與資料庫

以上畫面的 SQL 敘述如下: Dim strQuery As String  

strQuery = "Select * From 客戶 "

If txt客戶編號 .Text <> "" Then

strQuery = strQuery + " Where 客戶編號 = " + Chr(39) + _

txt客戶編號 .Text + Chr(39) 'Chr(39) 為單引號End If

然後將所得到之 SQL 敘述傳給後端資料庫,並將自資料庫擷取之記錄,傳入 DataSet物件 (ds) 。以上步驟的敘述如下:

Page 47: 第十七章  ADO.NET 與資料庫

cn.Open()cm.CommandText = strQuerycm.Connection = cnda = New OleDbDataAdapter(cm)da.Fill(ds, "客戶 ")

最後利用資料繫結,將所擷取之記錄顯示出來。其敘述如下:'顯示單一欄位值的資料繫結

txt客戶編號 .DataBindings.Add("Text", ds, "客戶 .客戶編號 ")txt公司名稱 .DataBindings.Add("Text", ds, "客戶 .公司名稱 ")txt連絡人 .DataBindings.Add("Text", ds, "客戶 .連絡人 ")

 '顯示多個欄位值的資料繫結DataGrid1.DataSource = dsDataGrid1.DataMember = "客戶 "

Page 48: 第十七章  ADO.NET 與資料庫

<範例 >17-6b重做範例 17-6a ,並加入查詢之功能。程式說明

1. 在每次新的查詢前,要將記錄指標移至第一筆,否則會產生錯誤。

2. 在每次新的查詢前,要將 DataSet 及單一欄位值的資料繫結 TextBox物件,使用 Clear 方法將本身內容清空。

3. 在做查詢動作時,要考慮到控制各個按鍵的作用,讓介面更易於操作。

Page 49: 第十七章  ADO.NET 與資料庫

如果要新增一筆記錄至『客戶』資料表,我們可利用 BindingContext物件的 AddNew 方法,其敘述如下:

Me.BindingContext(ds, "客戶 ").AddNew( ) 'Me 為表單本身

 

'利用以下敘述將值填入各個欄位ds.Tables("客戶 ").Rows(bm.Position)("客戶編號 ") = txt客戶號 .Text

ds.Tables("客戶 ").Rows(bm.Position)("公司名稱 ") = txt公司稱 .Text

ds.Tables("客戶 ").Rows(bm.Position)("連絡人 ") = txt連絡人 .Text

Page 50: 第十七章  ADO.NET 與資料庫

但是要注意,這時並未將資料寫入資料庫,必須再使用以下敘述,將資料真正的寫入資料庫。

Dim cb As New OleDbCommandBuilder(da) 'da 為 DataAdapter 物件cb.DataAdapter.Update(ds.Tables("客戶 ")) 'ds 為 DataSet 物件

那如果我們做了一半卻想取消這筆新增的記錄,又要如何處理呢?利用以下敘述即可。

Me.BindingContext(ds, “客戶 ").CancelCurrentEdit( )

Me.ds.RejectChanges()

Page 51: 第十七章  ADO.NET 與資料庫

記錄的修改如果要修改一筆記錄比較單純,我們可直接將欲修改的值,藉由 TextBox填入欲修改的欄位,其敘述如下:

ds.Tables("客戶 ").Rows(bm.Position)("客戶編號 ") = txt客戶號 .Text

ds.Tables("客戶 ").Rows(bm.Position)("公司名稱 ") = txt公司稱 .Text

ds.Tables("客戶 ").Rows(bm.Position)("連絡人 ") = txt連絡人 .Text

但是這時並未將資料寫入資料庫,必須再使用以下敘述,將資料真正的寫入資料庫。

Dim cb As New OleDbCommandBuilder(da) 'da 為 DataAdapter 物件cb.DataAdapter.Update(ds.Tables("客戶 ")) 'ds 為 DataSet 物件

或是使用以下敘述,放棄修改。Me.BindingContext(ds, "客戶 ").CancelCurrentEdit( )

Me.ds.RejectChanges()

Page 52: 第十七章  ADO.NET 與資料庫

記錄的刪除如果要刪除一筆記錄,我們可利用 BindingContext物件的 RemoveAt 方法,其敘述如下,敘述中 Position 是記錄指標,這樣我們才知道要刪除那一筆記錄。

Me.BindingContext(ds, "客戶 ").RemoveAt(Me.BindingContext(ds, “客戶 ").Position)

同樣地,最後要真正刪除這筆記錄,必須再使用以下敘述,才能將資料真正的刪除。

Dim cb As New OleDbCommandBuilder(da) 'da 為 DataAdapter 物件cb.DataAdapter.Update(ds.Tables("客戶 ")) 'ds 為 DataSet 物件

或是使用以下敘述,放棄刪除。Me.BindingContext(ds, "客 ").CancelCurrentEdit( )Me.ds.RejectChanges()

Page 53: 第十七章  ADO.NET 與資料庫

< 範例 >17-6c

重做範例 17-6b ,並加入新增、修改、刪除之功能。程式說明

1. 資料需要寫回至資料庫時,才做連線的動作。 2. 資料寫回至資料庫後,馬上將連線釋放。 3.異動資料取消或是異動資料產生錯誤時,要將指標回復

至原來的位置。 4. 本範例程式已經具備一般 MIS 系統單檔維護畫面的功能,

甚至還有做到各個功能鍵的控制,希望讀者能實地操作之後,詳加瞭解其程式碼的意義,並仔細揣摩為何要控制功能鍵,相信對讀者在日後設計輸入畫面,會有很大的幫助。

Page 54: 第十七章  ADO.NET 與資料庫

17-7 資料表單精靈.NET提供了“精靈”的功能,讓我們可以在不用寫任何程式的情況下,就很方便的設計出具有新增、修改以及刪除等功能的前端維護畫面。

Page 55: 第十七章  ADO.NET 與資料庫

< 範例 >17-7a請使用資料表單精靈,製作出 Access 資料庫“ C:\VBBook \Northwind.mdb”『客戶』資料表的前端維護畫面,該畫面並包含移動記錄指標、新增、修改以及刪除的功能。