1.52k likes | 1.69k Views
ASP.NET 網頁製作教本 – 從基本語法學起. 第9章 ADO.NET 與資料庫存取 ( 一 ). 9-1 ADO.NET 物件概述. ADO.NET 物件概述. ADO.NET 常用物件概述 (1). ADO.NET 常用物件概述 (2). 資料庫存取的過程. 命名空間的引用 (1). ADO.NET 物件中, DataSet 物件附屬於 System.Data 命名空間,若要在程式之中使用它,須先匯入 System.Data 命名空間,標示如下:.
E N D
ASP.NET 網頁製作教本 – 從基本語法學起 第9章 ADO.NET 與資料庫存取(一)
命名空間的引用 (1) • ADO.NET 物件中,DataSet 物件附屬於System.Data 命名空間,若要在程式之中使用它,須先匯入 System.Data 命名空間,標示如下: <%@ Import Namespace="System.Data" %>
命名空間的引用 (2) • 而Connection、Command、DataAdapter 及 DataReader 物件則附屬於System.Data.OleDb 或 System.Data.SqlClient,若要在程式中使用它們,須先匯入 System.Data.OleDb 或 System.Data.SqlClient 命名空間,標示如下: <%@ Import Namespace="System.Data.OleDb" %><%@ Import Namespace="System.Data.SqlClient" %>
SqlClient 與 OleDb 的區別 • System.Data.OleDb 是通用的資料庫存取物件,可用於存取 Access、SQL Server、dBase、Excel…等格式的資料庫,而System.Data.SqlClient 則是存取 SQL Server 資料庫專用的物件,在存取 SQL Server 資料庫方面有做過效能上的調整。 • 一般來說,若要存取 SQL Server 資料庫,應選用 System.Data.SqlClient 命名空間的物件,若要存取 SQL Server 以外的資料庫,則應選用 System.Data.OleDb 命名空間的物件。
類別名稱 (1) • 實際的類別名稱如下:
類別名稱 (2) • 宣告的敘述是有區別的 ' 使用System.Data.OleDb的物件Dim conn As OleDbConnectionDim cmd As OleDbCommandDim dr As OleDbDataReaderDim adp As OleDbDataAdapter ' 使用System.Data.SqlClient的物件Dim conn As SqlConnectionDim cmd As SqlCommandDim dr As SqlDataReaderDim adp As SqlDataAdapter
路徑一: Connection - DataAdapter - DataSet - DataGrid 1.Connection 物件開啟 Sample.mdb 資料庫。 2. DataAdapter 物件開啟「成績單」資料表。 3.DataSet 物件存放「成績單」資料表。 4.DataGrid 控制元件顯示「成績單」資料表。 5.關閉 Sample.mdb 資料庫。
Route01.aspx 節錄Part I <%@ Import Namespace="System.Data" %> <%@ Import Namespace="System.Data.OleDb" %> <script Language="VB" runat="server"> Sub Page_Load(sender As Object, e As EventArgs) ' 相關物件的宣告Dim Conn As OleDbConnection ' 宣告一個 Connection 物件 Dim Adpt As OleDbDataAdapter ' 宣告一個 DataAdapter 物件 Dim Ds As DataSet ' 宣告一個 DataSet 物件
Route01.aspx 節錄Part II ' Connection 物件開啟 Sample.mdb 資料庫 Dim Provider = "Provider=Microsoft.Jet.OLEDB.4.0" Dim Database = "Data Source=" & Server.MapPath( "Sample.mdb" ) Conn = New OleDbConnection( Provider & ";" & DataBase ) Conn.Open() ' DataAdapter 物件開啟「成績單」資料表 Dim SQL = "Select * From 成績單" Adpt = New OleDbDataAdapter( SQL, Conn )
Route01.aspx 節錄Part III ' DataSet物件存放「成績單」資料表 Ds = New Dataset() Adpt.Fill(Ds, "成績單") ' DataGrid控制元件顯示「成績單」資料表 MyGrid.DataSource = Ds.Tables( "成績單" ).DefaultView MyGrid.DataBind() ' 關閉Sample.mdb資料庫 Conn.Close() End Sub </script>
相關物件的宣告 (1) • 以上程式共使用了四種物件 -- Connection、DataAdapter、DataSet及DataGrid,除了 DataGrid 會安插於 HTML 網頁之外,其他三個物件必須由程式來宣告,其敘述如下: Dim Conn As OleDbConnection ' 宣告一個 Connection 物件 Dim Adpt As OleDbDataAdapter ' 宣告一個 DataAdapter 物件 Dim Ds As DataSet ' 宣告一個 DataSet 物件
相關物件的宣告 (2) • 由於以上的OleDbConnection、OleDbDataAdapter 及 DataSet 物件分別附屬於 System.Data.OldDb 及 System.Data,所以網頁的最前面還要增加「匯入命名空間」的標示,如下: <%@ Import Namespace="System.Data" %><%@ Import Namespace="System.Data.OleDb" %>
Connection 物件開啟Sample.mdb資料庫 • 此一階段所撰寫的程式如下: Dim Provider = "Provider=Microsoft.Jet.OLEDB.4.0" Dim Database = "Data Source=" & Server.MapPath( "Sample.mdb" ) Conn = New OleDbConnection( Provider & ";" & DataBase ) Conn.Open()
DataAdapter 物件開啟「成績單」資料表 • 此一階段所撰寫的程式如下:
DataSet 物件存放「成績單」資料表 • 此一階段所撰寫的程式如下: Ds = New Dataset()Adpt.Fill(Ds, "成績單")
DataGrid 控制元件顯示「成績單」資料表 • 此一階段所撰寫的程式如下 MyGrid.DataSource = Ds.Tables( "成績單" ).DefaultViewMyGrid.DataBind()
關閉Sample.mdb 資料庫 • 此一階段所撰寫的程式只有一行: Conn.Close()
路徑二: Connection - Command - DataReade 1. Connection 物件開啟 Sample.mdb 資料庫。 2. Command 物件開啟「成績單」資料表。 3. DataReader 物件連結「成績單」資料表。 4. 利用 DataReader 物件逐欄逐列讀取資料表,然後填入輸出用的表格。 5. 關閉 Sample.mdb 資料庫。
Route02.aspx 節錄Part I Sub Page_Load(sender As Object, e As EventArgs) ' 相關物件的宣告 Dim Conn As OleDbConnection ' 宣告一個 Connection 物件 Dim Cmd As OleDbCommand ' 宣告一個 Command 物件 Dim Rd As OleDbDataReader ' 宣告一個 DataReader 物件 ' Connection 物件開啟 Sample.mdb 資料庫 Dim Provider = "Provider=Microsoft.Jet.OLEDB.4.0" Dim Database = "Data Source=" & Server.MapPath( "Sample.mdb" ) Conn = New OleDbConnection( Provider & ";" & DataBase ) Conn.Open()
Route02.aspx 節錄Part II ' Command 物件開啟「成績單」資料表 Dim SQL = "Select * From 成績單" Cmd = New OleDbCommand( SQL, Conn ) ' DataReader 物件連結「成績單」資料表 Rd = Cmd.ExecuteReader() ' 利用DataReader物件逐欄逐列讀取資料表,然後填入輸出用的表格 OutputToTable( Rd ) ' 關閉 Sample.mdb 資料庫 Conn.Close() End Sub
Route02.aspx 節錄Part III Sub OutputToTable( Rd As OleDbDataReader ) Dim I As Integer Dim row As TableRow Dim cell As TableCell ' 將資料表的「抬頭」填入表格中 row = New TableRow() row.BackColor = Drawing.Color.Yellow For I = 0 To Rd.FieldCount - 1 cell = New TableCell() cell.Text = Rd.GetName(I) row.Cells.Add( cell ) Next Table1.Rows.Add( row )
Route02.aspx 節錄Part IV ' 逐列讀出資料表,然後填入表格中 While Rd.Read() row = New TableRow() For I = 0 To Rd.FieldCount - 1 cell = New TableCell() cell.Text = Rd.Item(I) row.Cells.Add( cell ) Next Table1.Rows.Add( row ) End While End Sub
Reader01.aspx Part I <%@ Import Namespace="System.Data" %> <%@ Import Namespace="System.Data.OleDb" %> <script Language="VB" runat="server"> Sub Page_Load(sender As Object, e As EventArgs) Dim Conn As OleDbConnection Dim Cmd As OleDbCommand Dim Rd As OleDbDataReader Dim I As Integer Dim Provider = "Provider=Microsoft.Jet.OLEDB.4.0" Dim Database = "Data Source=" & Server.MapPath( "Sample.mdb" ) Conn = New OleDbConnection( Provider & ";" & DataBase )
Reader01.aspx Part II Conn.Open() Dim SQL = "Select * From 成績單" Cmd = New OleDbCommand( SQL, Conn ) Rd = Cmd.ExecuteReader() Msg.Text = "成績單:<UL>" For I = 0 To Rd.FieldCount - 1 Msg.Text &= "<LI>" & Rd.GetName(I) & "</LI>" Next Msg.Text &= "</UL>" Conn.Close() End Sub </script>
Reader01.aspx Part III <Html> <Body BgColor="White"> <H3>讀取資料表每一個欄位的抬頭,並將其顯示在網頁上 <HR></H3> <Form runat="server"> <asp:Label runat="server" id="Msg" /> </Form> <p> <HR></Body> </Html>
讀取資料表的所有資料列 • 利用 DataReader 物件依序讀取資料表的所有資料列,其程式架構大致如下: ‘ 每次讀取資料之前都要先呼叫 Read(),若含有資料,則傳回 TrueWhile DataReader.Read() ’利用 DataReader 物件所提供的屬性或方法讀取目前資料列End While
Item 屬性(1) • 在 While 迴圈中,讀取各欄位的資料時,會使用到 Item 屬性,Item 屬性可用來讀取某一欄位的內容,格式有兩種: DataReader.Item(欄位順序) DataReader.Item(欄位名稱)
Item 屬性(2) • 以「成績單」資料表的第一筆資料為例,其內容如下:
Item 屬性(3) • 而以下是讀取 Item 屬性的結果: DataReader.Item(0) 等於 850301DataReader.Item(1) 等於 "陳桶一"DataReader.Item(2) 等於 90DataReader.Item(3) 等於 76DataReader.Item(4) 等於 98DataReader.Item("學號") 等於 850301DataReader.Item("姓名") 等於 "陳桶一"DataReader.Item("國文") 等於 90DataReader.Item("英文") 等於 76DataReader.Item("數學") 等於 98
Reader02.aspx Part I <%@ Import Namespace="System.Data" %> <%@ Import Namespace="System.Data.OleDb" %> <script Language="VB" runat="server"> Sub Page_Load(sender As Object, e As EventArgs) Dim Conn As OleDbConnection Dim Cmd As OleDbCommand Dim Rd As OleDbDataReader Dim I As Integer Dim Provider = "Provider=Microsoft.Jet.OLEDB.4.0" Dim Database = "Data Source=" & Server.MapPath( "Sample.mdb" ) Conn = New OleDbConnection( Provider & ";" & DataBase )
Reader02.aspx Part II Conn.Open() Dim SQL = "Select * From 成績單" Cmd = New OleDbCommand( SQL, Conn ) Rd = Cmd.ExecuteReader() While Rd.Read() Msg.Text &= "<UL>" For I = 0 To Rd.FieldCount - 1 Msg.Text &= "<LI>" & Rd.GetName(I) & " = " & _ Rd.Item(I) & "</LI>" Next Msg.Text &= "</UL>" End While Conn.Close() End Sub </script>
Reader02.aspx Part III <Html> <Body BgColor="White"> <H3>讀取資料表的所有資料列 <HR></H3> <Form runat="server"> <asp:Label runat="server" id="Msg" /> </Form> <p> <HR></Body> </Html>
讀取資料列的其他方法 • 除了 Iten 屬性之外,我們可能需要藉助以下屬性來讀取或判斷各欄位資料的內容:
GetDataTypeName 方法 (1) • 讀取某一欄位的資料型別,以「成績單」資料表為例,各欄位的型別如下:
GetDataTypeName 方法 (2) • 呼叫 GetDataTypeName 方法的傳回值如下:
GetOrdinal 方法 • 讀取某一欄位名稱對應的欄位編號,以「成績單」資料表為例,幾個欄位名稱對應的編號是「學號=0、姓名=1、國文=2、英文=3、數學=4」,所以: DataReader.GetOrdinal("學號") 傳回 0 DataReader.GetOrdinal("姓名") 傳回 1 DataReader.GetOrdinal("國文") 傳回 2 DataReader.GetOrdinal("英文") 傳回 3 DataReader.GetOrdinal("數學") 傳回 4
IsDbNull 方法 • 判斷某一欄位內容是否為 Null(沒有資料即為 Null) ,假設目前所讀取的資料中,每一個欄位都含有資料,則結果如下: DataReader.IsDbNull(0) 等於 FalseDataReader.IsDbNull(1) 等於 FalseDataReader.IsDbNull(2) 等於 False…
GetValues 方法(1) • 讀取所有欄位的內容。Item屬性每次只能讀取一個欄位的資料,而 GetValues 方法則可以一次讀取所有欄位的資料,方法如下: ' 宣告一個陣列,而陣列元素的數目與欄位數相等Dim Fields(DataReader.FieldCount-1) ' 讀取目前資料錄的所有欄位DataReader.GetValues(Fields)