610 likes | 784 Views
第14章 ADO.NET 存取資料庫. 14-1 資料庫的基礎 14-2 使用 ADO.NET 存取資料庫 14-3 DataGrid 控制項顯示資料庫 14-4 SQL 的資料庫查詢 14-5 SQL 的資料庫操作. 14-1 資料庫的基礎. 14-1-1 什麼是資料庫 14-1-2 使用 Access 建立資料庫. 14-1-1 什麼是資料庫.
E N D
第14章 ADO.NET存取資料庫 • 14-1 資料庫的基礎 • 14-2 使用ADO.NET存取資料庫 • 14-3 DataGrid控制項顯示資料庫 • 14-4 SQL的資料庫查詢 • 14-5 SQL的資料庫操作
14-1 資料庫的基礎 • 14-1-1 什麼是資料庫 • 14-1-2 使用Access建立資料庫
14-1-1 什麼是資料庫 • 資料庫正確的說只是「資料庫系統」(Database System)的一部分,資料庫系統是由「資料庫」(Database)和「資料庫管理系統」(Database Mangement System,DBMS)所組成,如下圖所示:
14-2 ADO.NET的基礎 • 14-2-1 什麼是ADO.NET • 14-2-2 使用DataReader物件讀取資料庫
14-2-1 什麼是ADO.NET-說明 • ADO.NET是微軟新一代的技術,它是「ADO」(ActiveX Data Object)元件的後繼者。 • ADO.NET的目的是提供一致的物件模型,存取和編輯資料來源的資料,提供一致的資料處理方式,資料來源並不限於資料庫,幾乎任何資料來源(如 EXCEL、文字檔、Access等)都可以,以VB.NET應用程式來說,使用ADO.NET主要的目的是存取資料庫。
ADO.NET DataReader 1 Command 1 1 表單控制項 (Data Binding) Connection 2 2 DataAdapter 2 2 Data Source DataSet DataTable
ADO.NET 第一種應用 • 使用 Connection 物件建立資料來源的資料連結,然後使用 Command 物件執行指令取得資料來源的資料,(以資料庫來說此 Command 即 SQL 指令),在取得資料後,使用 DataReader 物件讀取或填入 DataSet 物件,最後使用 Data Binging 在表單控制項 (如 TextBox 或 DataGrid ) 顯示資料表的紀錄。如需 Insert / Delete / Update 資料庫也是蔡取類似方法。
14-2-1 什麼是ADO.NET-Connection物件 • Connection物件可以建立與存取資料來源的連結,以資料庫來說Connection物件還負責初始資料庫,Connection物件一共分為兩種: • OLE DB:使用OleDbConnection物件 • SQL Server:使用SqlConnection物件
14-2-1 什麼是ADO.NET-Command物件 • Command物件可以對資料來源執行指令,以資料庫的資料來源而言,就是執行SQL指令,在建立Connection物件建立資料庫連結後,就可以使用Command物件執行SQL指令。 • Command物件也分為兩種: • OLE DB:使用OleDbCommand物件 • SQL Server:使用SqlCommand物件
14-2-1 什麼是ADO.NET-DataReader物件 • ADO.NET的DataReader物件可以從資料來源使用Command物件執行SQL指令,取得如同循序檔案一般唯讀且單向的資料流。因為DataReader只在記憶體儲存一筆記錄,所以能夠提升應用程式的執行效能,並且降低系統的負荷。 • DataReader物件分為兩種: • OLE DB:使用OleDbDataReader物件 • SQL Server:使用SqlDataReader物件
14-2-1 什麼是ADO.NET-DataSet和DataTable物件 • DataSet物件是由DataTable物件所組成,DataSet物件可以代表一個儲存在記憶體的資料庫,每一個DataTable儲存一個資料表的記錄資料,每一個DataRow物件就是一筆記錄。 • 在建立好Connection物件的資料庫連結後,我們使用DataAdapter物件的Fill方法將資料表的資料填入DataSet物件,也就是資料表的DataTable物件。DataAdapter物件分為兩種: • OLE DB:使用OleDbDataAdapter物件 • SQL Server:使用SqlDataAdapter物件
14-2-2 使用DataReader物件讀取資料庫-說明 • VB.NET應用程式使用ADO.NET存取資料庫最簡單且快速的方式是使用DataReader物件。 • 以連結Access資料庫為例,在程式碼使用ADO.NET時,需要使用Imports關鍵字匯入OLE DB所需的名稱空間Namespace,如下所示: Imports System.Data.OleDb • 使用SQL Server資料庫,其匯入的名稱空間,如下所示: Imports System.Data.SqlClient
14-2-2 使用DataReader物件讀取資料庫-步驟1 • 步驟1:建立和開啟資料庫連結 • 首先我們需要建立Connection物件來連結資料庫,如下所示: Dim objCon As OleDbConnection objCon = New OleDbConnection(strDbCon) • StrDbCon字串變數指定資料來源的字串,如下所示: strDbCon = "Provider=Microsoft.Jet.OLEDB.4.0;“ & _ “Data Source=..\..\Books.mdb" • 開啟資料庫連結 objCon.open()
14-2-2 使用DataReader物件讀取資料庫-步驟2 • 步驟2:建立Command物件 • 在開啟資料庫連結後,就可以建立Command物件,並且指定欲執行的SQL指令字串,如下所示: Dim objCmd As OleDbCommand objCmd = _ New OleDbCommand("SELECT * FROM Book", objCon)
14-2-2 使用DataReader物件讀取資料庫-步驟3 • 步驟3:取得DataReader物件 • 在建立好Command物件後,接著就可以使用ExecuteReader方法執行SQL指令取得DataReader物件,如下所示: Dim objDataReader As OleDbDataReader objDataReader = objCmd.ExecuteReader() • 上述程式碼取得DataReader物件objDataReader。
14-2-2 使用DataReader物件讀取資料庫-步驟3 Execute方法
14-2-2 使用DataReader物件讀取資料庫-步驟4 • 步驟4:取出查詢結果的資料表記錄資料 • DataReader物件如同循序檔案一般,當執行SQL指令取得DataReader物件後,就如同開啟一個讀取的DataReader檔案,程式碼需要使用While迴圈讀取資料表的每一筆記錄,如下所示: While objDataReader.Read() out &= objDataReader.Item("BookID") & " " out &= objDataReader.Item("BookTitle") & " " out &= objDataReader.Item("BookPrice") & _ vbNewLine End While
DataReader 屬性 • 取得指定的欄位值: objDataReader.Item(“BookTitle”) objDataReader.Item(3):由 0 開始 • FieldCount: 取得欄位數 • IsClosed: 檢查是否關閉,True 表示關閉
14-2-2 使用DataReader物件讀取資料庫-步驟5 • 步驟5:關閉DataReader和資料庫連結 • 最後需要關閉DataReader物件和資料庫連結的Connection物件,如下所示: objDataReader.Close() objCon.Close() • 上述程式碼使用Close方法關閉DataReader和Connection物件。
14-3 DataSet物件與DataGrid控制項 • 14-3-1 將資料表填入DataSet物件 • 14-3-2 DataGrid控制項顯示資料表
14-3-1 將資料表填入DataSet物件-說明 • DataSet物件可以建立儲存在記憶體中的資料庫,每一個資料表是一個DataTable物件。 • 不同於DataReader物件如同循序檔案,我們需要將資料表的記錄資料先填入DataSet物件,然後再來顯示DataSet物件的記錄資料。
14-3-1 將資料表填入DataSet物件-步驟1 • 步驟1:建立Connection物件 • 如同上一節的DataReader物件,我們還是需要使用Connection物件建立資料連結,如下所示: objCon = New OleDbConnection(strDbCon) objCon.Open() • 上述程式碼建立objCon的資料連結物件,然後開啟資料庫連結。
14-3-1 將資料表填入DataSet物件-步驟2 • 步驟2:建立DataAdapter物件 • 在DataSet物件是使用DataAdapter物件取得記錄資料,這個物件屬於DataSet和Connection物件資料來源間的橋樑,以便將資料表填入DataSet物件。 • DataAdapter物件也擁有兩個版本,SQL Server的是SqlDataAdapter,以本節為例是使用OLE DB的OleDbDataAdapter,如下所示: Dim objDataAdapter As OleDbDataAdapter objDataAdapter = New OleDbDataAdapter( _ "SELECT * FROM Book", objCon)
14-3-1 將資料表填入DataSet物件-步驟3 • 步驟3:建立DataSet物件填入記錄資料 • 現在我們就可以建立DataSet物件,執行DataAdapter的SQL查詢指令,將記錄資料填入DataSet物件,如下所示: Dim objDataSet As DataSet = New DataSet() objDataAdapter.Fill(objDataSet, "Books") DataTable 物件名稱
14-3-1 將資料表填入DataSet物件-步驟4 • 步驟4:取出查詢結果的資料表記錄資料 • 在使用DataAdapter物件將資料表記錄填入DataSet後,請使用For Each迴圈取出每一個DataRow物件,也就是一筆記錄,如下所示: Dim objRow As DataRow For Each objRow in objDataSet.Tables("Books").Rows out &= objRow("BookID") & vbNewLine out &= objRow("BookTitle") & vbNewLine ………… Next • 如果需要指定第幾筆紀錄 objRow= objDataset.Tables(“Books”).Rows(0) • objDataset.Tables(“Books”).Rows.Count 可以得到共幾筆紀錄
14-3-1 將資料表填入DataSet物件-步驟5 • 步驟5:關閉資料庫連結 • 最後記得關閉資料庫連結,以此例建立的Connection物件為objCon,如下所示: objCon.Close()
14-3-2 DataGrid控制項顯示資料表-說明 • DataGrid控制項可以將資料來源的資料以表格方式顯示,例如:將資料表的記錄資料如同Excel試算表一般的顯示每筆記錄和欄位資料。
14-3-2 DataGrid控制項顯示資料表-指定資料來源 • 當表單新增DataGrid控制項後,只需將資料表的記錄資料填入DataSet物件,就可以指定DataGrid控制項的DataSource屬性,如下所示: dtgOutput.DataSource = _ objDataSet.Tables("Books") • 上述程式碼將DataGrid控制項的資料來源指定成DataSet物件名為Books的DataTable物件。
14-4 SQL的資料庫查詢 • 14-4-1 SQL語言的基礎 • 14-4-2 SQL的查詢指令
14-4-1 SQL語言的基礎-說明 • 「SQL」(Structured Query Language)為「ANSI」(American National Standards Institute) 標準的資料庫語言,SQL指令語法可以用來存取和更新資料庫的記錄,目前Access、SQL Server、Informix、Oracle和Sybase等資料庫系統都支援ANSI的SQL語言。
14-4-1 SQL語言的基礎-指令 • SQL語言的指令可以分為4大部分,如下表所示: • 「資料定義語言DDL」(Data Definition Language):屬於資料表建立和欄位定義的SQL指令。 • 「資料操作語言DML」(Data Manipulation Language):屬於資料表記錄插入、刪除和更新指令。 • 「資料查詢語言DQL」(Data Query Language):屬於資料表查詢指令,只有一個SELECT指令。 • 「資料控制語言DCL」(Data Control Language):屬於資料庫安全設定和權限管理指令。
14-4-2 SQL的查詢指令-語法 • 在SQL語言的資料查詢指令只有一個SELECT指令,完整的指令語法如下所示: SELECT 欄位1, 欄位2 FROM 資料表 WHERE conditions • 上述SELECT指令的欄位1~2為記錄的欄位,conditions為查詢條件,這個指令使用口語來說是「從資料表取回符合WHERE子句條件的記錄,顯示欄位1和2」。
14-4-2 SQL的查詢指令-“*”記錄欄位 • 使用"*"符號代表所有資料表的欄位,表示取回資料表記錄的所有欄位,如下所示: SELECT * FROM Book • 上述指令沒有WHERE子句,所以是將資料表內所有的記錄和欄位取回。
14-4-2 SQL的查詢指令-單一查詢條件的WHERE子句 • SQL查詢指令的單一條件,WHERE子句的基本規則和範例,如下所示: • 文字欄位要加上單引號,如下所示: SELECT * FROM Book WHERE BookID='F8111A' • 數字欄位並不需要額外的字元括起,如下所示: SELECT * FROM Book WHERE BookPrice>550 • 文字的欄位可以使用【LIKE】包含運算子配合"%"萬用字元,此時查詢的條件子句只需包含的子字串就符合條件,如下所示: SELECT * FROM Book WHERE BookID LIKE '%1%' • 數字或日期欄位可以使用<>、>、<、>=和<=不等於、大於、小於、大於等於和小於等於等運算子建立多樣化的查詢條件。
14-4-2 SQL的查詢指令-多重查詢條件的WHERE子句 • WHERE子句的查詢條件可以使用AND和OR邏輯運算子連接,其基本語法,如下所示: • AND且運算子:連接的前後條件都必須成立,整個條件才能成立,例如:書號包含"3"且書名有"研究"的子字串,如下所示: SELECT * FROM Book WHERE BookID LIKE '%3%' AND BookTitle LIKE '%研究%' • OR或運算子:連接的前後條件只需任何一個成立即可,例如:書號包含"3"或書名有"研究"的子字串,如下所示: SELECT * FROM Book WHERE BookID LIKE '%3%' OR BookTitle LIKE '%研究%'
14-4-2 SQL的查詢指令-排序輸出 • SQL的查詢結果可以指定欄位進行由小到大,或由大到小排序,只需在SELECT指令的最後加上ORDER BY子句即可,如下所示: SELECT * FROM Book WHERE BookPrice>=500 ORDER BY BookPrice • 上述查詢結果使用BookPrice欄位排序,預設是由小到大的ASC,如果想倒過來由大到小,只需加上DESC,如下所示: SELECT * FROM Book WHERE BookPrice>=500 ORDER BY BookPrice DESC
14-5 SQL的資料庫操作 • 14-5-1 資料庫操作的SQL指令 • 14-5-2 圖書資料管理程式
14-5-1 資料庫操作的SQL指令-INSERT插入記錄1 • SQL插入記錄操作指令是新增一筆記錄到資料表,INSERT指令的語法格式,如下所示: INSERT INTO table (column1,column2,…..) VALUES ('value1', 'value2 ', …) • INSERT指令的注意事項,如下所示: • 不論是欄位或值的清單,都需要使用逗號分隔。 • INSERT指令VALUES的值,數值不用單引號包圍,字元需要單引號包圍,日期/時間需要"#"符號括起。 • INSERT指令的欄位名稱清單,並不需要和資料表定義的欄位數目或順序相同,只需選擇需要資料的欄位,括號內的欄位名稱順序需和VALUES值的順序相同。
14-5-1 資料庫操作的SQL指令-INSERT插入記錄2 • 在資料表Book插入一筆圖書記錄的SQL指令,如下所示: INSERT INTO Book (BookID,BookTitle,BookAuthor,BookPrice,BookP ubDate) VALUES ('F8915','ASP網頁製作徹底研究','陳會安',580,#06/06/2000#) • 上述SQL指令中欄位值為字串時使用單引號,數字值沒有,日期/時間加上"#"符號。
14-5-1 資料庫操作的SQL指令-DELETE刪除記錄 • SQL刪除記錄指令是將資料表內符合條件的記錄通通刪除掉,DELETE指令的語法格式,如下所示: DELETE FROM table WHERE conditions • DELETE指令的注意事項,如下所示: • WHERE子句是DELETE指令的必要元素,如果沒有WHERE子句,資料表內的所有記錄都會刪除。 • 在資料表Book刪除一筆圖書記錄的SQL指令,如下所示: DELETE FROM Book WHERE BookID='F8915'
14-5-1 資料庫操作的SQL指令-UPDATE更新記錄1 • SQL更新記錄指令是將資料表內符合條件的記錄,更新指定欄位的內容,UPDAT E指令的語法格式,如下所示: UPDATE table SET column1 = 'value1' WHERE conditions • 如果更新的欄位不只一個,請使用逗號分隔,其語法格式,如下所示: UPDATE table SET column1 = 'value1' , column2 = 'value2' WHERE conditions • UPDATE指令的注意事項,如下所示: • WHERE子句是必要元素,如果沒有WHERE子句,資料表內所有記錄欄位都會更新。 • 更新欄位值是數值不用單引號包圍,字元需要使用單引號包圍,日期時間為「#」符號。
14-5-1 資料庫操作的SQL指令-UPDATE更新記錄2 • 在資料表Book更改記錄圖書資料的SQL指令,如下所示: UPDATE Book SET BookPrice=650, BookPubDate=#6/15/2002# WHERE BookID='F8534A' • 上述SQL指令的WHERE條件為圖書書號BookID欄位,然後使用SET子句更新欄位資料。
14-5-2 圖書資料管理程式 • 在VB.NET應用程式的程式碼只需在開啟資料庫連結和建立Command物件後,就可以使用Command物件的ExecuteNonQuery方法執行SQL指令,如下所示: Dim intRowsAffected As Integer intRowsAffected = objCmd.ExecuteNonQuery() • 上述程式碼的變數intRowsAffected傳回資料表影響的記錄數,因為是使用ExecuteNonQuery方法執行SQL指令,所以並不會傳回DataReader記錄資料。
14-5-2 圖書資料管理程式 • 不只 DataGrid 可以用 Data Binding 方式來為其 DataSource 指定資料來源,只要控制項有 DataSource 欄位都可以用 Data Binding 方式決定其展現內容。如 ListBox、ComboBox 等均可以此方法動態決定其內容選項。 • ListBox 決定 DataSource 之後,需要指定下列屬性: • DisplayMember: 選項顯示的欄位 • ValueMember: 選擇的值的欄位,以ListBox1.SelectedValue 來得到此選項之值
補充:直接由 OleDbDataAdapter 控制項來指定 資料庫及DataSet 步驟一:拖曳 OleDdDataAdapter