ADO.NET 建立網頁資料庫 資科系林偉川 資料庫系統 在電腦計算機科學的應用領域, 資料庫才是公司行號真正電腦化的推手, 眾多的出勤管理系統 倉庫管理系統 進銷存系統或小至錄影帶店管理系統, 這些都屬於不同應用的資料庫系統 資料庫系統本身就是一套應用程式, 使用者在不需撰寫任何程式碼的情況下, 就可以使用資料庫儲存和管理所需的資料, 事實上, 只有比較複雜的應用系統, 程式開發者才會撰寫預設的資料庫語言設計客戶所需的應用系統 2 1
ASP.NET 與資料庫 Web 舞台的資料庫本質並沒有轉變, 仍然是用來儲存和查詢資料, 只是資料庫的使用介面變成 HTML 文件或 Web 表單, 網頁資料庫是一種結合前端 HTML 文件或 Web 表單的使用介面, 配合後端 Web 伺服器和資料庫系統的一種應用程式架構 3 ASP.NET 與資料庫 4 2
ADO.NET 簡介 ADO.NET 是微軟新一代的技術, 它是 ADO (ActiveX Data Object) 元件的後繼者, 其主要的目的是在.NET Framework 平台存取資料, 簡單的說,ASP.NET 技術就是使用 ADO.NET 進行資料庫的存取 ADO.NET 的目的是提供一致的物件模型, 用來存取和編輯資料來源的資料, 至於資料來源並不限資料庫, 以 ASP.NET 的應用來說, ADO.NET 的主要功能是存取資料庫 5 如何建立 ASP.NET 網頁資料庫 ASP.NET 建立網頁資料庫的步驟, 如下所示 : 建立資料庫, 使用 Access 建立所需的資料庫 使用 OLE DB 提供者建立資料庫連結 ASP.NET 程式是使用 ADO.NET 存取資料庫的內容, 以便建立 ASP.NET 網頁資料庫 啟動瀏覽程式執行 ASP.NET 程式測試網頁資料庫 6 3
Access 建立資料庫 Access 是 Office 家族的資料庫系統, 提供個人和中小企業使用的資料庫系統, 只要電腦安裝 Office XP 專業版本, 就擁有能夠配合 ASP.NET 技術建立網頁資料庫的 Access 資料庫系統 7 資料類型是 / 否數字自動編號日期 / 時間 Access 欄位的資料型態 說明一個位元, 用來作為 True/False 的開關欄位數字資料, 使用 1 2 4 和 8 位元組儲存的數字欄位數值每新增記錄時自動加一, 其大小為 4 位元組日期時間資料 貨幣貨幣資料, 使用 8 位元組, 精確到小數點左邊 15 位, 右邊第 4 位 文字 備忘 OLE 物件 字串, 最大的字串長度為 225 個字元 較長的字串, 最大長度為 65536 個字元 二進位資料, 可以用來儲存圖片資料, 最多 1GB 超連結 儲存 URL 網址, 最多 20456 個字元 8 4
建立空白資料庫 9 開啟存在的資料庫 10 5
新增資料表 11 新增資料表欄位 欄位名稱 資料類型 長度 BookID 文字 6 BookTitle 文字 30 BookAuthor 文字 10 BookPrice BookPubDate 貨幣 日期 / 時間 12 6
刪除資料表欄位 13 新增資料表的記錄資料 14 7
建立資料庫連結 在建立好資料庫後,ASP.NET 程式需要使用 ADO.NET 的 Connection 物件建立 ASP.NET 程式與資料庫間的連結, 如此才能夠存取資料庫的記錄資料 15 ADO.NET 的名稱空間 名稱空間 說明 System.Data 提供欄位類型 常數和 DataSet 物件的相關類別, DataSet 物件可以將資料庫直接儲存在記憶體, 詳見第 16 章的說明 System.Data.OleDb OLE DB 的.NET 提供者, 提供 OleDbCommand OleDbConnection OleDbDataReader 類別處理 OLE DB 資料來源的資料庫 System.Data.SqlClient SQL 的.NET 提供者, 提供 SqlCommand SqlConnection SqlDataReader 類別處理微軟 Microsoft SQL Server 7.0 以上版本的資料庫 16 8
建立資料庫連結的 Connection 物件 Connection 物件是用來建立 ASP.NET 程式與存取資料來源的連結, 以資料庫來說 Connection 物件還負責初始資料庫 Connection 物件一共有兩種 :OLE DB 是使用 OleDbConnection 物件,SQL Server 使用 SqlConnection 物件 在 ASP.NET 程式需要先匯入所需的名稱空間 Namespace, 才能使用 ADO.NET 的類別和物件, 如下所示 :(Access or Oracle) <%@ Import Namespace="System.Data" %> <%@ Import NameSpace="System.Data.OleDb" %> 17 建立資料庫連結的 Connection 物件 若是使用 SQL server, 在 ASP.NET 程式要先匯入所需的名稱空間如下所示 : <%@ Import Namespace="System.Data" %> <%@ Import NameSpace="System.Data.SqlClient" %> 匯入所需的名稱空間, 就可使用 Connection 物件建立資料庫連結, 其步驟如下 : 18 9
建立資料庫連結的 Connection 物件 第一步 : 建立 Connection 物件 在 ASP.NET 程式建立 Connection 物件, 首先宣告 OleDbConnection 物件變數 obj, 如下所示 : Dim obj As OleDbConnection (SqlConnection) obj = New OleDbConnection(str) 參數 str 是 OLE DB 提供者建立的資料來源字串 以 Access 資料庫系統為例, 資料庫 Books.mdb 的 str 字串, 如下所示 : str = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.Mappath("Books.mdb") 19 連結字串說明 參數 str 以 Access 為例, 只要 Provider 及 DataSource 設定即可 str = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.Mappath("Books.mdb") 參數 str 以 Oracle 為例, 除要 Provider 及 DataSource 設定以外, 還要給定帳號密碼 str = Provider=MSDAORA;DataSource=Oracle8i7;UserID=wayne;Password=123 參數 str 以 SQL Server 為例, 要利用 Sqlconnection 物件建立連結, 其字串如下 : str = server=ww;database=user; uid=wayne;pwd=1234 20 10
建立資料庫連結的 Connection 物件 第二步 : 開啟資料庫連結 在建立好 Connection 物件後, 接著使用 Open() 方法開啟資料庫連結, 如下所示 ; obj.open() 程式碼使用名為 obj 的 Connection 物件開啟資料庫連結 21 建立資料庫連結的 Connection 物件 第三步 : 資料庫操作與查詢 在建立好資料庫連結 Connection 物件後, 可以使用 State 屬性檢查目前資料庫連結狀態, 如下 : If obj.state = ConnectionState.Open Then Response.Write("<b> 目前為開啟狀態 </b><br>") Else Response.Write("<b> 目前為關閉狀態 </b><br>") End If 屬性 State 值為 ConnectionState.Open 表示開啟, ConnectionState.Closed 表示關閉, 在確定資料庫連結為開啟狀態時, 就可以建立其它 ADO.NET 物件 22 11
建立資料庫連結的 Connection 物件 第四步 : 關閉資料庫連結 最後在完成資料庫操作後, 需要關閉資料庫連結, 使用的是 Connection 物件的 Close() 方法, 以 Connection 物件 obj 為例, 其關閉的指令如下 :obj.close() 23 ASP.NET 建立網頁資料庫 ADO.NET 網頁資料庫可以使用 DataReader 或 DataSet 物件取得資料表的記錄資料, 在本章主要是說明 Command 物件執行 SQL 指令來取得 DataReader 物件的資料表記錄 ASP.NET 程式範例使用的 SQL 查詢指令都是同一個, 如下所示 : SELECT * FROM Book SQL 查詢指令 SELECT 並沒有加上任何條件, 查詢結果是取資料表 Book 所有的記錄和欄位 24 12
Command 與 DataReader 物件 在開啟 Connection 物件的資料庫連結後, 我們就可以使用 Command 物件和 DataReader 物件建立 ASP.NET 網頁資料庫 25 Command 物件 Command 物件可以針對資料來源執行指令, 以資料庫的資料來源而言, 就是執行 SQL 指令, 我們可以使用 Command 物件送出 SQL 指令來新增 刪除 更新和查詢資料表的記錄 ASP.NET 程式需要先使用 Connection 物件建立和開啟資料庫連結, 之後才能使用 Command 物件執行 SQL 指令,Command 物件也分為兩種 :OLE DB 是使用 OleDbCommand 物件,SQL Server 是使用 SqlCommand 物件 26 13
DataReader 物件 DataReader 物件可以從資料來源使用 Command 物件執行 SQL 查詢指令, 以取得 唯讀 只能向前 的串流資料,ASP.NET 程式可以使用類似讀取文字檔案串流的方式取得資料表記錄, 因為每次只會從資料來源讀取一列資料儲存到記憶體, 所以執行效率非常的高 DataReader 物件分為兩種 :OLE DB 是使用 OleDbDataReader 物件,SQL Server 是使用 SqlDataReader 物件 27 開啟 DataReader 物件 第一步 : 開啟 Connection 物件的資料庫連結 ASP.NET 程式建立 DataReader 物件需要使用 Connection 物件開啟資料庫連結, 如下 : obj = New OleDbConnection(str) New SqlCOnnection(str) obj.open() 程式碼建立 obj 的資料連結物件, 然後使用 Open() 方法開啟資料庫連結 28 14
開啟 DataReader 物件 第二步 : 建立 Command 物件 在建立好 Connection 物件後, 使用 SQL 指令和 Connection 物件作為參數建立 Command 物件, 如下所示 : cmd = New OleDbCommand( "SELECT * FROM Book", obj) cmd = New SqlCommand( "SELECT * FROM Book", obj) 程式碼使用 New 運算子建立 Command 物件, 第 2 個參數是開啟的資料庫連結物件, 表示是向此資料來源執行第 1 個參數的 SQL 指令 29 開啟 DataReader 物件 第三步 : 執行 SQL 指令查詢資料表 接著使用 Command 物件的 ExecuteReader() 方法執行 SQL 查詢指令, 如下所示 : dr = cmd.executereader() 程式碼取得 DataReader 物件 dr, 讀者可以想像是開啟資料庫的檔案串流 30 15
開啟 DataReader 物件 第四步 : 檢查狀態或讀取記錄資料 DataReader 物件是一種資料串流, 我們可以使用 IsClose 屬性檢查 DataReader 串流是否開啟, 如下所示 : If dr.isclosed = False Then Response.Write("<b>DataReader 物件為開啟狀態 </b><br>") Else Response.Write("<b>DataReader 物件為關閉狀態 </b><br>") End If 31 開啟 DataReader 物件屬性 屬性 FieldCount IsClosed 說明取得欄位數檢查 DataReader 物件串流是否關閉,True 是關閉,False 為開啟 32 16
開啟 DataReader 物件 第五步 : 關閉 DataReader 和資料庫連結 最後需要關閉 DataReader 串流物件和資料庫連結, 如下所示 : dr.close() obj.close() 程式碼使用 Close() 方法先關閉 DataReader,, 先再關閉 Connection 物件 33 取得記錄的欄位名稱與值 當 Command 物件使用 ExecuteReader() 方法取得 DataReader 物件 dr 後,DataReader 物件可以視為一種檔案串流, 檔案中的每一列是一筆記錄, 一次可以讀取一筆記錄, 如下圖所示 : 34 17
取得記錄的欄位名稱與值 在開啟 DataReader 物件時, 記錄指標是指向第 1 筆記錄之前, 我們需要使用 Read() 方法讀取下一筆記錄, 如下所示 : dr.read() 程式碼執行 Read() 方法, 目前記錄指標移到下一筆, 指向第 1 筆記錄, 即 P611 35 取得記錄的欄位名稱與方法 方法 IsDBNull(index) GetName(index) GetValue(index) GetFieldType(index) 說明取得參數原始順序的欄位值是否為空值 DBNull, 即沒有欄位值, 如果是, 傳回 True, 否則為 False 取得參數原始順序的欄位名稱取得參數原始順序的欄位值取得欄位的資料類型, 使用 ToString() 方法轉換成字串, 這是.NET Framework 的資料類型 36 18
使用表格顯示資料表 如果想顯示資料表的記錄, 我們可以使用表格方式, 一列代表一筆記錄, 每一欄為一個欄位顯示資料表的記錄, 可使用 HTML 表格標籤來顯示資料表 使用 Data Binding 技術, 使用 ASP.NET 的 Web 控制項顯示資料表的記錄資料 37 使用表格顯示資料表 取得 DataReader 物件如同開啟 DataReader 串流物件, 我們可以使用 While 迴圈讀取整個資料表的記錄, 然後顯示記錄的欄位值, 如下所示 : While dr.read() Response.Write("<tr>") Response.Write("<td>" & dr.item("bookid") & "</td>") Response.Write("<td>" & dr.item("booktitle") & "</td>") Response.Write("<td>" & dr.item("bookauthor") & "</td>") Response.Write("</tr>") End While 38 19
使用表格顯示資料表 在 DataReader 物件提供 Item 屬性取得各欄位的集合物件, 可以使用欄位名稱或欄位順序取得欄位值, 如下所示 : Response.Write("<td>" & dr.item("booktitle") & "</td>") Response.Write("<td>" & dr.item(1) & "</td>") 程式碼的字串 BookTitle 是欄位名稱, 數值 1 是欄位 BookTitle 的原始順序, 取得的資料型態就是資料庫欄位的資料類型, 以此例是 String 字串, 如果是 BookPrice 欄位就是 Decimal 資料型態 39 ASP.NET 控制項的 Data Binding ASP.NET 的 Web 控制項支援 Data Binding 技術, 可以將不同資料來源的 Collections 物件 陣列 DataReader 或 DataView 物件整合到 ASP.NET 的 Web 控制項 並非每一個 Web 控制項都支援 Data Binding 技術, 只有擁有 DataSource 屬性的控制項才支援 Data Binding, 例如 :Repeater DataList 和 DataGrid 三個控制項 40 20
ASP.NET 控制項的 Data Binding 在 ASP.NET 程式的 Web 控制項使用 Data Binding 的步驟, 如下所示 : Step 1: 定義資料來源和取得資料來源的資料物件 Step 2: 指定控制項的 DataSource 屬性為此資料來源的資料物件, 以資料庫來說是 DataReader 或 DataView 物件 Step 3: 執行控制項的 DataBind() 方法建立資料連結 41 Repeater 控制項表格顯示資料表 Repeater 控制項是使用清單方式顯示資料, 能夠讓使用者自行定義 Template 範本標籤 ( 內含 HTML 標籤 ),Repeater 控制項自動以範本標籤的項目如同迴圈一般重複編排資料來源的資料 42 21
Repeater 控制項表格顯示資料表 Repeater 控制項基本語法, 如下所示 : <asp:repeater id= odr" runat="server"> <HeaderTemplate> </HeaderTemplate> <ItemTemplate> </ItemTemplate> <FooterTemplate> </FooterTemplate> </asp:repeater> Repeater 控制項使用 Template 範本標籤 ( 標籤內容可以使用 HTML 標籤 ) 來編排資料 43 Template 標籤 Template 範本標籤 HeaderTemplate ItemTemplate FooterTemplate 說明定義清單的標題, 以資料表的表格來說, 就是開頭標籤 <table> 和記錄的標題列, 如果沒有定義就不顯示定義清單的項目, 也就是重複顯示的部分, 以資料表來說就是每一筆記錄, 這是 Repeater 控制項的必需標籤定義清單的註腳, 以資料表的表格來說, 就是結尾標籤 </table>, 如果沒有定義就不顯示 44 22
Data Binding 首先需要建立 Repeater 控制項的 Data Binding, 其資料來源是 Book 資料表的 DataReader 物件, 如下所示 : odr.datasource =cmd.executereader() odr.databind() 程式碼的 odr 是 Repeater 控制項, 在執行 DataBind() 方法建立 Data Binding 後, 就可以將記錄資料填入 Repeater 控制項 45 Template 標籤內容 Template 範本標籤 HeaderTemplate ItemTemplate FooterTemplate 表格標籤 <table border=1 cellspacing=0 cellpadding=5> <tr bgcolor="ffcc99"> <td> 書號 </td><td> 書名 </td><td> 書價 </td> </tr> <tr> <td><%# Container.DataItem("BookID")%></td> <td><%# Container.DataItem("BookName")%></td> <td><%# Container.DataItem("BookPrice")%></td> </tr> </table> 46 23
顯示資料表欄位值 在 <td> 標籤的每一個儲存格是使用 <%# 符號和 %> 符號標示的 Data Binding 運算式, 以此例是顯示資料表欄位的值, 如下所示 : <%# Container.DataItem("BookID")%> Container 屬性可以取得資料來源控制項的 RepeaterItem 物件, 然後使用 RepeaterItem 物件的屬性 DataItem 取得欄位值, 參數字串是資料表的欄位名稱 47 Repeater 控制項更多的範本標籤 Repeater 控制項提供更多的範本標籤可以讓每一列交叉以不同格式顯示或插入分隔線, 如下 : <asp:repeater id="odr runat="server"> <HeaderTemplate> </HeaderTemplate> <ItemTemplate> </ItemTemplate> <AlternatingItemTemplate> </AlternatingItemTemplate> <SeparatorTemplate> </SeparatorTemplate> <FooterTemplate> </FooterTemplate> </asp:repeater> AlternatingItemTemplate 標籤對應 ItemTemplate 標籤, 可以指定不同的顯示樣式 48 24
Template 範本標籤 Template 範本標籤 AlternatingItemTemplate 說明如果想每個項目交叉使用不同的樣式, 例如 : 資料表的記錄輪流使用不同色彩顯示, 就可以定義此標籤, 在奇數項目 ( 以 0 開始 ) 使用此範本顯示, 偶數是使用 ItemTemplate 範本 SeparatorTemplate 如果在各項目間需要分隔, 可以在此標籤定義, 通常是使用 HTML 標籤的 <br> 或 <hr>, 如果沒有 定義並不會顯示 49 DataList 控制項顯示資料表 DataList 控制項預設使用單欄表格顯示資料, 其使用方式和 Repeater 控制項相似, 也是使用範本標籤, 如下所示 : <asp:datalist id= dl" GridLines="Both" runat="server"> <HeaderTemplate> 圖書目錄清單 </HeaderTemplate> <ItemTemplate> <%#Container.DataItem("BookTitle")%> (<%#Container.DataItem("BookAuthor")%>) - $<%#Container.DataItem("BookPrice")%> </ItemTemplate> <FooterTemplate>DataList 控制項顯示資料表 </FooterTemplate> </asp:datalist> 50 25
Data Binding DataList 控制項以 DataReader 物件為資料來源, 其 Data Binding 的程式碼, 如下所示 : dl.datasource = cmd.executereader() dl.databind() 51 DataList 控制項的 Repeat 屬性 DataList 控制項預設使用表格方式顯示, 不過還是可以使用 Repeat 的相關屬性設定表格擁有幾欄 顯示方向和編排的版面配置, 如下 : 屬性 RepeatColumns RepeatDirection RepeatLayout 說明設定 DataList 控制項的表格是分成幾欄顯示設定 DataList 控制項顯示的方向是 Vertical( 垂直 ) 或 Horizontal( 水平 ) 設定 DataList 控制項的顯示方式版面配置為 Table( 表格 ) 或 Flow( 水流, 即一直線 ) 52 26
標籤的樣式屬性 DataList 控制項的樣式屬性是用來設定控制項的顯示外觀, 各樣式屬性對應各 Template 範本標籤, 常用的樣式屬性, 如下表所示 : 標籤的樣式屬性 HeadStyle AlternatingItemStyle FooterStyle ItemStyle 說明設定控制項 HeadTemplate 標籤的樣式設定控制項 AlternatingItemTemplate 標籤的樣式設定控制項 FooterTemplate 標籤的樣式設定控制項 ItemTemplate 標籤的樣式 SeparatorStyle 設定控制項 SeparatorTemplate 標籤的樣式 53 DataList 控制項的樣式屬性 樣式名稱 Font-Size Font-Italic Font-Bold Horizontalalign Backcolor Forecolor 說明指定顯示的字型尺寸指定字體是否是斜體字, 其值 True 表示是, 不指定或 False 為否指定字體是否是粗體字, 其值 True 表示是, 不指定或 False 為否指定文字內容水平的對齊方式,left 靠左 center 置中 right 為靠右指定背景色彩指定文字色彩 54 27
DataList 控制項的樣式屬性 DataList 控制項樣式屬性的使用一共有兩種方式 : 一種是在開頭標籤設定, 如下所示 : <asp:datalist id= dl" runat="server" Headerstyle-Font-Size="20pt" Headerstyle-Horizontalalign="center" Footerstyle-Font-Size="12pt" Footerstyle-Font-Italic="True"> 另一種方式是使用獨立的標籤, 屬於 DataList 控制項標籤的子標籤, 如下所示 : <HeaderStyle BackColor="#778899"> </HeaderStyle> <ItemStyle BackColor="Gainsboro"> </ItemStyle> 55 DataGrid 控制項的基本使用 DataGrid 控制項只需建立 Data Binding, 並不需要設定屬性, 就可以使用表格方式顯示資料表記錄, 其基本語法如下所示 : <asp:datagrid id= dg" HeaderStyle-BackColor="#CC99FF" runat="server"/> DataGrid 控制項只設定樣式屬性 HeaderStyle, 這些屬性和 DataList 控制項相同 56 28
Data Binding DataGrid 控制項以 DataReader 物件為資料來源, 其 Data Binding 的程式碼, 如下所示 : dg.datasource =cmd.executereader() dg.databind() 57 29