第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產品管理程式 -圖例
© Copyright 2024 ExpyDoc