第 9 章 ado.net的網頁資料庫查詢

49
9 9 ADO.NET ADO.NET 第第第第第第第第 第第第第第第第第 9-1 9-1 第第第第第第第 第第第 第第第第第第第 第第第 9-2 DataReader 9-2 DataReader 第第第第第第第第第第 第第第第第第第第第第 9-3 DataSet 9-3 DataSet 第第第第第第第第 第第第第第第第第 9-4 DataSet 9-4 DataSet 第第第第第第第 第第第第第第第 9-5 DataSet 9-5 DataSet 第第第 第第第 XML XML 9-6 ASP.NET 9-6 ASP.NET 第第第第第第第第 第第第第第第第第

Upload: colm

Post on 13-Jan-2016

93 views

Category:

Documents


1 download

DESCRIPTION

第 9 章 ADO.NET的網頁資料庫查詢. 9-1 從資料表取得單一欄位值 9-2 DataReader 物件以表格顯示資料表 9-3 DataSet 物件的資料庫查詢 9-4 DataSet 物件的資料篩選 9-5 DataSet 物件與 XML 9-6 ASP.NET 控制項與資料繫結. 9-1 從資料表取得單一欄位值. - PowerPoint PPT Presentation

TRANSCRIPT

第第 99 章 章 ADO.NETADO.NET的網頁資料庫的網頁資料庫查詢查詢

9-1 9-1 從資料表取得單一欄位值從資料表取得單一欄位值 9-2 DataReader9-2 DataReader 物件以表格顯示資料表物件以表格顯示資料表 9-3 DataSet9-3 DataSet 物件的資料庫查詢物件的資料庫查詢 9-4 DataSet9-4 DataSet 物件的資料篩選物件的資料篩選 9-5 DataSet9-5 DataSet 物件與物件與 XMLXML 9-6 ASP.NET9-6 ASP.NET 控制項與資料繫結控制項與資料繫結

9-1 9-1 從資料表取得單一欄位值從資料表取得單一欄位值 ADO.NETADO.NET的的 CommandCommand 物件提供多種物件提供多種

Execute()Execute() 方法,在第方法,在第 88 章只使用章只使用ExecuteNonQuery()ExecuteNonQuery() 方法,在這一節筆者將說方法,在這一節筆者將說明明 ExecuteScalar()ExecuteScalar() 方法,此方法可以取得資料方法,此方法可以取得資料表指定記錄的單一欄位值,如下所示:表指定記錄的單一欄位值,如下所示:

msg.Text = objCmd.ExecuteScalar()msg.Text = objCmd.ExecuteScalar() 上述程式碼執行上述程式碼執行 CommandCommand 物件物件 objCmdobjCmd的的

SQLSQL 指令,如果傳回值不只一個。例如:多筆記指令,如果傳回值不只一個。例如:多筆記錄,取得的是第錄,取得的是第 11 筆記錄的第筆記錄的第 11 個欄位。個欄位。

9-2 DataReader9-2 DataReader物件以表格顯示資物件以表格顯示資料表料表

9-2-1 9-2-1 取得資料表資訊取得資料表資訊 9-2-2 9-2-2 顯示資料表的所有記錄顯示資料表的所有記錄 9-2-3 9-2-3 分頁顯示資料表的記錄分頁顯示資料表的記錄

9-2 DataReader9-2 DataReader 物件以表格顯示物件以表格顯示資料表資料表

在在 ASP.NETASP.NET 程式顯示資料表內容通常是使用表程式顯示資料表內容通常是使用表格,以一列代表一筆記錄,每一欄為一個欄位。格,以一列代表一筆記錄,每一欄為一個欄位。在本章是使用在本章是使用 HTMLHTML 表格來顯示資料表,第表格來顯示資料表,第 1010章則是以資料來源和章則是以資料來源和 WebWeb 控制項顯示資料表的控制項顯示資料表的記錄資料。記錄資料。

SQLSQL 查詢指令的說明請參閱附錄查詢指令的說明請參閱附錄 BB ,本章程式範,本章程式範例都是顯示資料表的所有記錄,例都是顯示資料表的所有記錄, SELECTSELECT 指令並指令並沒有沒有 WHEREWHERE 子句的條件,如下所示:子句的條件,如下所示:SELECT * FROM UsersSELECT * FROM Users

上述上述 SQLSQL 指令可以將資料表指令可以將資料表 UsersUsers 的所有記錄的所有記錄和欄位都取回來,換句話說,就是顯示資料表的和欄位都取回來,換句話說,就是顯示資料表的所有記錄。所有記錄。

9-2-1 9-2-1 取得資料表資訊取得資料表資訊 -- 取得資料表取得資料表資訊資訊 DataTableDataTable 物件物件

我們可以使用我們可以使用 ASP.NETASP.NET 程式來取得資料表的定程式來取得資料表的定義資訊。例如:欄位名稱、資料型態和欄位尺寸。義資訊。例如:欄位名稱、資料型態和欄位尺寸。首先使用首先使用 ExecuteReader()ExecuteReader() 方法取得方法取得DataReaderDataReader 物件,如下所示:物件,如下所示:objDataReader = objCmd.ExecuteReader()objDataReader = objCmd.ExecuteReader()

程式碼取得程式碼取得 ObjDataReaderObjDataReader 物件後,使用物件後,使用GetSchemaTable()GetSchemaTable() 方法取得資料表資訊的方法取得資料表資訊的DataTableDataTable 物件,如下所示:物件,如下所示:Dim objSchema As DataTable = _Dim objSchema As DataTable = _

objDataReader.GetSchemaTable()objDataReader.GetSchemaTable()

9-2-1 9-2-1 取得資料表資訊取得資料表資訊 -- 屬性屬性 DataReaderDataReader 物件是將定義資料儲存在物件是將定義資料儲存在

DataTableDataTable 物件,每一列是一個欄位的資物件,每一列是一個欄位的資訊。主要欄位說明,如下表所示:訊。主要欄位說明,如下表所示:欄位名稱 說明

ColumnName 資料表的欄位名稱ColumnOrdinal 欄位在資料表的原始順序,從 0開始

ColumnSize 資料表的欄位大小DataType 資料表欄位的資料型態,可以對應.NET Framework的資料

型態

9-2-1 9-2-1 取得資料表資訊取得資料表資訊 -- 顯示顯示Dim objRow As DataRowDim objRow As DataRowFor intI = 0 To objSchema.Rows.Count - 1For intI = 0 To objSchema.Rows.Count - 1 Response.Write("<tr>")Response.Write("<tr>") objRow = objSchema.Rows(intI)objRow = objSchema.Rows(intI) Response.Write("<td>" & _Response.Write("<td>" & _ objRow("ColumnOrdinal") & "</td>")objRow("ColumnOrdinal") & "</td>") Response.Write("<td>"& _Response.Write("<td>"& _ objRow("ColumnName") &"</td>")objRow("ColumnName") &"</td>") Response.Write("<td>" & _Response.Write("<td>" & _ objRow(“DataType”).ToString() & "</td>")objRow(“DataType”).ToString() & "</td>") Response.Write("<td>"& _Response.Write("<td>"& _ objRow("ColumnSize") &"</td>")objRow("ColumnSize") &"</td>") Response.Write("<tr>")Response.Write("<tr>")NextNext

9-2-2 9-2-2 顯示資料表的所有記錄顯示資料表的所有記錄 --步驟一:建立步驟一:建立 ConnectionConnection 物件物件

ADO.NETADO.NET的的 DataReaderDataReader 物件是以類似物件是以類似檔案串流方式來讀取記錄資料,只能讀取檔案串流方式來讀取記錄資料,只能讀取資料,並不能插入、刪除和更新記錄。資料,並不能插入、刪除和更新記錄。

如同資料庫操作,我們需要使用如同資料庫操作,我們需要使用ConnectionConnection 物件來建立資料庫連結,如下物件來建立資料庫連結,如下所示:所示:objCon = New objCon = New

OleDbConnection(strDbCon)OleDbConnection(strDbCon) 上述程式碼建立上述程式碼建立 objConobjCon 的資料庫連結物的資料庫連結物

件。件。

9-2-2 9-2-2 顯示資料表的所有記錄顯示資料表的所有記錄 --步驟二:建立步驟二:建立 CommandCommand 物件物件

在建立好在建立好 ConnectionConnection 物件後,就可以使物件後,就可以使用用 SQLSQL 指令和指令和 ConnectionConnection 物件為參數來物件為參數來建立建立 CommandCommand 物件,如下所示:物件,如下所示:objCmd = New OleDbCommand( _objCmd = New OleDbCommand( _

"SELECT * FROM Users",objCon)"SELECT * FROM Users",objCon)

9-2-2 9-2-2 顯示資料表的所有記錄顯示資料表的所有記錄 --步驟三:執行步驟三:執行 SQLSQL 指令查詢資料表指令查詢資料表

接著使用接著使用 ExecuteReader()ExecuteReader() 方法來執行方法來執行SQLSQL 指令,可以取得指令,可以取得 DataReaderDataReader 物件,物件,如下所示:如下所示:objDR = objCmd.ExecuteReader()objDR = objCmd.ExecuteReader()

9-2-2 9-2-2 顯示資料表的所有記錄顯示資料表的所有記錄 --步驟四:取出查詢結果的資料表記錄資料步驟四:取出查詢結果的資料表記錄資料

DataReaderDataReader 物件是一種串流資料,可以物件是一種串流資料,可以使用迴路讀取資料表的每一筆記錄,如下使用迴路讀取資料表的每一筆記錄,如下所示:所示:

Do While objDR.Read()Do While objDR.Read() Response.Write("<tr>")Response.Write("<tr>") Response.Write("<td>"& objDR.Item("Name") &"</td>")Response.Write("<td>"& objDR.Item("Name") &"</td>") Response.Write("<td>"& objDR.Item("Birthday") &"</td>")Response.Write("<td>"& objDR.Item("Birthday") &"</td>") Response.Write("<td>"& objDR.Item("Salary") &"</td>")Response.Write("<td>"& objDR.Item("Salary") &"</td>") Response.Write("<td>"& objDR.Item("Email") & "</td>")Response.Write("<td>"& objDR.Item("Email") & "</td>") Response.Write("<td>"& objDR.Item("UserName") &"</td>")Response.Write("<td>"& objDR.Item("UserName") &"</td>") Response.Write("<td>"& _Response.Write("<td>"& _ objDR.Item("UserPassword") &"</td>")objDR.Item("UserPassword") &"</td>") Response.Write("</tr>")Response.Write("</tr>")LoopLoop

9-2-2 9-2-2 顯示資料表的所有記錄顯示資料表的所有記錄 --步驟五:關閉步驟五:關閉 DataReaderDataReader 和資料庫連結和資料庫連結

最後就是關閉最後就是關閉 DataReaderDataReader 物件和資料庫物件和資料庫連結,如下所示:連結,如下所示:objDR.Close()objDR.Close()

objCon.Close()objCon.Close() 上述程式碼使用上述程式碼使用 Close()Close() 方法關閉方法關閉

DataReaderDataReader和和 ConnectionConnection 物件。物件。

9-2-3 9-2-3 分頁顯示資料表的記錄分頁顯示資料表的記錄 -- 計算計算資料表的記錄數資料表的記錄數

資料表如果記錄很多,我們可以分頁顯示資料表資料表如果記錄很多,我們可以分頁顯示資料表的記錄資料,的記錄資料, DataReaderDataReader 物件的分頁顯示需要物件的分頁顯示需要執行執行 22 次次 SQLSQL 指令。指令。

ASP.NETASP.NET 程式第程式第 11 次執行次執行 SQLSQL 指令的目的是計指令的目的是計算資料表的記錄數,如下所示:算資料表的記錄數,如下所示:strSQL = "SELECT Count(*) FROM Users"strSQL = "SELECT Count(*) FROM Users"

objCmd = New OleDbCommand(strSQL, objCon)objCmd = New OleDbCommand(strSQL, objCon)

objDataReader = objCmd.ExecuteReader()objDataReader = objCmd.ExecuteReader()

objDataReader.Read()objDataReader.Read()

intMaxRec = objDataReader.GetValue(0)intMaxRec = objDataReader.GetValue(0)

9-2-3 9-2-3 分頁顯示資料表的記錄分頁顯示資料表的記錄 -- 顯示顯示分頁的資料表記錄分頁的資料表記錄 11

第第 22 次執行次執行 SQLSQL 指令是取得資料表記錄的指令是取得資料表記錄的DataReaderDataReader 物件,然後計算目前分頁的物件,然後計算目前分頁的開始、結束記錄和最大頁數,如下所示:開始、結束記錄和最大頁數,如下所示:

intStartRec = intPageSize * _intStartRec = intPageSize * _ (intPageNo - 1) + 1(intPageNo - 1) + 1intStopRec = intStartRec + intPageSize - 1intStopRec = intStartRec + intPageSize - 1intMaxPageCount = intMaxRec \ intPageSizeintMaxPageCount = intMaxRec \ intPageSizeIf (intMaxRec MOD intPageSize) > 0 ThenIf (intMaxRec MOD intPageSize) > 0 Then intMaxPageCount = intMaxPageCount + 1intMaxPageCount = intMaxPageCount + 1End IfEnd If

9-2-3 9-2-3 分頁顯示資料表的記錄分頁顯示資料表的記錄 -- 顯示顯示分頁的資料表記錄分頁的資料表記錄 22

Do While objDataReader.Read() AND intCount<intStopRecDo While objDataReader.Read() AND intCount<intStopRec intCount = intCount + 1intCount = intCount + 1 If intCount >= intStartRec ThenIf intCount >= intStartRec Then Response.Write("<tr>")Response.Write("<tr>") For intI = 0 to intFCountFor intI = 0 to intFCount If objDataReader.IsDBNull(intI) = False ThenIf objDataReader.IsDBNull(intI) = False Then Response.Write("<td valign=""top"">" & _Response.Write("<td valign=""top"">" & _ objDataReader.Item(intI) & "</td>")objDataReader.Item(intI) & "</td>") ElseElse Response.Write("<td>---</td>")Response.Write("<td>---</td>") End IfEnd If NextNext Response.Write("</tr>")Response.Write("</tr>") End If End If LoopLoop

9-2-3 9-2-3 分頁顯示資料表的記錄分頁顯示資料表的記錄 -- 建立建立切換分頁的超連結切換分頁的超連結 11

資料表的記錄資料因為是分頁顯示,所以資料表的記錄資料因為是分頁顯示,所以需要建立切換分頁的超連結,首先是頁碼需要建立切換分頁的超連結,首先是頁碼超連結,如下所示:超連結,如下所示:

For intI = 1 To intMaxPageCountFor intI = 1 To intMaxPageCount URL = "<a href='Ch9-2-3.aspx?PageNo=" & intIURL = "<a href='Ch9-2-3.aspx?PageNo=" & intI URL &= "&PageSize=" & intPageSize & "'>" URL &= "&PageSize=" & intPageSize & "'>" Response.Write(URL & intI & "</a> ")Response.Write(URL & intI & "</a> ") If intI mod 10 = 0 Then Response.Write("<br>")If intI mod 10 = 0 Then Response.Write("<br>")NextNext

9-2-3 9-2-3 分頁顯示資料表的記錄分頁顯示資料表的記錄 -- 建立建立切換分頁的超連結切換分頁的超連結 22

至於建立上一頁和下一頁的超連結文字,至於建立上一頁和下一頁的超連結文字,如下所示:如下所示:

intPPageNo = intPageNo - 1intPPageNo = intPageNo - 1If intPPageNo > 0 ThenIf intPPageNo > 0 Then URL = "<a href='Ch9-2-3.aspx?PageNo=" & intPPageNoURL = "<a href='Ch9-2-3.aspx?PageNo=" & intPPageNo URL &= "&PageSize=" & intPageSize & "'>URL &= "&PageSize=" & intPageSize & "'> 上一頁上一頁 </a>"</a>" Response.Write(URL & " ")Response.Write(URL & " ")End IfEnd IfintNPageNo = intPageNo + 1intNPageNo = intPageNo + 1If intNPageNo <= intMaxPageCount ThenIf intNPageNo <= intMaxPageCount Then URL = "<a href='Ch9-2-3.aspx?PageNo=" & intNPageNoURL = "<a href='Ch9-2-3.aspx?PageNo=" & intNPageNo URL &= "&PageSize=" & intPageSize & "'>URL &= "&PageSize=" & intPageSize & "'> 下一頁下一頁 </a>"</a>" Response.Write(URL & " ")Response.Write(URL & " ")End If End If

9-2-3 9-2-3 分頁顯示資料表的記錄分頁顯示資料表的記錄 -- 圖例圖例

9-3 DataSet9-3 DataSet 物件以表格顯示資料表物件以表格顯示資料表 9-3-1 9-3-1 顯示顯示 DataSetDataSet 物件的所有記錄物件的所有記錄 9-3-2 9-3-2 分頁顯示分頁顯示 DataTableDataTable 的記錄的記錄 9-3-3 9-3-3 使用程式碼建立使用程式碼建立 DataTableDataTable 資料表資料表

物件物件

9-3 DataSet9-3 DataSet 物件以表格顯示資料表物件以表格顯示資料表 DataSetDataSet 物件可以建立儲存在記憶體的資物件可以建立儲存在記憶體的資

料庫,它是將資料表的記錄和欄位資料,料庫,它是將資料表的記錄和欄位資料,轉換成物件架構,如下圖所示:轉換成物件架構,如下圖所示:

9-3-1 9-3-1 顯示顯示 DataSetDataSet 物件的所有記物件的所有記錄錄

使用使用 For EachFor Each 迴路從迴路從 DataRowCollectionDataRowCollection 集集合物件,取出每一個合物件,取出每一個 DataRowDataRow 物件,如下所示:物件,如下所示:

For Each objRow in For Each objRow in objDataSet.Tables("Users").RowsobjDataSet.Tables("Users").Rows

Response.Write("<tr>")Response.Write("<tr>") Response.Write("<td>" & objRow("name") & _Response.Write("<td>" & objRow("name") & _ "</td>")"</td>") Response.Write("<td>" & objRow("birthday") & _Response.Write("<td>" & objRow("birthday") & _ "</td>")"</td>") Response.Write("<td>" & objRow("salary") & _Response.Write("<td>" & objRow("salary") & _ "</td>") "</td>") ……… ……… Response.Write("</tr>")Response.Write("</tr>")NextNext

9-3-2 9-3-2 分頁顯示分頁顯示 DataTableDataTable 的記錄的記錄 --取得記錄數取得記錄數

intMaxRec = objDS.Tables("Users").Rows.CountintMaxRec = objDS.Tables("Users").Rows.CountintStartRec = intPageSize * (intPageNo - 1) + 1intStartRec = intPageSize * (intPageNo - 1) + 1intStopRec = intStartRec + intPageSize - 1intStopRec = intStartRec + intPageSize - 1If intStopRec >= intMaxRec ThenIf intStopRec >= intMaxRec Then intStopRec = intMaxRec - 1intStopRec = intMaxRec - 1End IfEnd IfintMaxPageCount = intMaxRec \ intPageSizeintMaxPageCount = intMaxRec \ intPageSizeIf (intMaxRec MOD intPageSize) > 0 ThenIf (intMaxRec MOD intPageSize) > 0 Then intMaxPageCount = intMaxPageCount + 1intMaxPageCount = intMaxPageCount + 1End IfEnd If

9-3-2 9-3-2 分頁顯示分頁顯示 DataTableDataTable 的記錄的記錄 --顯示欄位名稱顯示欄位名稱

接著使用接著使用 DataColumnDataColumn 集合物件顯示資集合物件顯示資料表的欄位名稱,如下所示:料表的欄位名稱,如下所示:

For Each objCol in objDS.Tables("Users").ColumnsFor Each objCol in objDS.Tables("Users").Columns

Response.Write("<td><b>" & _Response.Write("<td><b>" & _

objCol.ColumnName & "</b></td>")objCol.ColumnName & "</b></td>")

NextNext

然後使用然後使用 CountCount 屬性取得欄位數,如下屬性取得欄位數,如下所示:所示:

intFCount = objDS.Tables("Users").Columns.CountintFCount = objDS.Tables("Users").Columns.Count

9-3-2 9-3-2 分頁顯示分頁顯示 DataTableDataTable 的記錄的記錄 --分頁顯示資料表記錄分頁顯示資料表記錄

Dim objRow As DataRowDim objRow As DataRowintJ = intStartRecintJ = intStartRecDoDo objRow = objDS.Tables("Users").Rows(intJ-1)objRow = objDS.Tables("Users").Rows(intJ-1) Response.Write("<tr>")Response.Write("<tr>") For intI = 0 To intFCount - 1For intI = 0 To intFCount - 1 If objRow.IsNull(intI) = False ThenIf objRow.IsNull(intI) = False Then Response.Write("<td>"& objRow(intI) &"</td>")Response.Write("<td>"& objRow(intI) &"</td>") ElseElse Response.Write("<td>---</td>")Response.Write("<td>---</td>") End IfEnd If NextNext Response.Write("</tr>")Response.Write("</tr>") intJ = intJ + 1intJ = intJ + 1Loop Until intJ > intStopRecLoop Until intJ > intStopRec

9-3-3 9-3-3 使用程式碼建立使用程式碼建立 DataTableDataTable資料表物件資料表物件 -- 說明說明

DataSetDataSet 物件是由物件是由 DataTableDataTable 物件組成,物件組成,以以 DataRowDataRow 物件組成物件組成 DataTableDataTable 物件。物件。

換句話說,換句話說, ASP.NETASP.NET 程式可以自行建立程式可以自行建立DataSetDataSet和和 DataTableDataTable 物件,將它視為儲物件,將它視為儲存在記憶體的資料表。例如:儲存網路商存在記憶體的資料表。例如:儲存網路商店的購物車資料。店的購物車資料。

9-3-3 9-3-3 使用程式碼建立使用程式碼建立 DataTableDataTable資料表物件資料表物件 -- 欄位定義欄位定義

建立建立 DataTableDataTable 物件的欄位定義資料物件的欄位定義資料 11 DataTableDataTable 物件可以對應資料庫的資料表,物件可以對應資料庫的資料表,

在建立在建立 DataTableDataTable 物件後,我們需要新增物件後,我們需要新增資料表欄位。首先建立資料表欄位。首先建立 DataTableDataTable 物件,物件,如下所示:如下所示:

Dim objDT As DataTable = _Dim objDT As DataTable = _

New DataTable("ShoppingCart")New DataTable("ShoppingCart")

objDT.MinimumCapacity = 5objDT.MinimumCapacity = 5

objDT.CaseSensitive = FalseobjDT.CaseSensitive = False

9-3-3 9-3-3 使用程式碼建立使用程式碼建立 DataTableDataTable資料表物件資料表物件 -- 欄位定義欄位定義

建立建立 DataTableDataTable 物件的欄位定義資料物件的欄位定義資料 22 在建立好在建立好 DataTableDataTable物件後,就可以使用物件後,就可以使用

DataColumnCollectionDataColumnCollection物件的物件的 Add()Add()方方法新增欄位資料,如下所示:法新增欄位資料,如下所示:

objCol = objDT.Columns.Add("ID", _objCol = objDT.Columns.Add("ID", _

System.Type.GetType("System.Int32"))System.Type.GetType("System.Int32"))

objCol.AutoIncrement = TRUEobjCol.AutoIncrement = TRUE

objCol.AllowDBNull = FalseobjCol.AllowDBNull = False

9-3-3 9-3-3 使用程式碼建立使用程式碼建立 DataTableDataTable資料表物件資料表物件 -- 新增至新增至 DataSetDataSet 物件物件將將 DataTableDataTable 物件新增到物件新增到 DataSetDataSet 物件物件 在建立好在建立好 DataTableDataTable 物件後,就可以將它物件後,就可以將它

新增到新增到 DataSetDataSet 物件,如下所示:物件,如下所示:Dim objDS As DataSet = New DataSet()Dim objDS As DataSet = New DataSet()

objDS.Tables.Add(objDT)objDS.Tables.Add(objDT) 上述程式碼在建立上述程式碼在建立 DataSetDataSet 物件後,使用物件後,使用

DataTableCollectionDataTableCollection 集合物件的集合物件的 Add()Add()方法新增到方法新增到 DataSetDataSet 物件。物件。

9-3-3 9-3-3 使用程式碼建立使用程式碼建立 DataTableDataTable資料表物件資料表物件 -- 指定主索引指定主索引

指定指定 DataTableDataTable 物件的主索引物件的主索引 接著建立接著建立 DataTableDataTable 物件的主索引,如下物件的主索引,如下

所示:所示:Dim keyArray() As DataColumn = _Dim keyArray() As DataColumn = _

{objDS.Tables("ShoppingCart").Columns("ID")}{objDS.Tables("ShoppingCart").Columns("ID")}

objDS.Tables("ShoppingCart").PrimaryKey = _objDS.Tables("ShoppingCart").PrimaryKey = _

keyArraykeyArray

9-3-3 9-3-3 使用程式碼建立使用程式碼建立 DataTableDataTable資料表物件資料表物件 -- 新增記錄資料新增記錄資料

新增新增 DataRowDataRow 物件的記錄資料物件的記錄資料 現在可以新增現在可以新增 DataTableDataTable 物件的欄位資料,也就是物件的欄位資料,也就是

DataRowDataRow 物件,如下所示:物件,如下所示:objRow = objDT.NewRow()objRow = objDT.NewRow()objRow("UserID") = 100objRow("UserID") = 100objRow("ProductID") = 5474objRow("ProductID") = 5474objRow("ProductName") = _objRow("ProductName") = _ "XML"XML 網頁製作徹底研究網頁製作徹底研究 -- 第三版第三版 " " objRow("ProductPrice") = 650.00objRow("ProductPrice") = 650.00 在指定欄位值後,使用在指定欄位值後,使用 DataRowCollectionDataRowCollection 物件的物件的

Add()Add() 方法新增至方法新增至 DataTableDataTable 物件,如下所示:物件,如下所示:objDT.Rows.Add(objRow)objDT.Rows.Add(objRow)objDT.AcceptChanges()objDT.AcceptChanges()

9-4 DataSet9-4 DataSet 物件的資料篩選物件的資料篩選 9-4-1 DataTable9-4-1 DataTable 物件的資料篩選物件的資料篩選 9-4-2 DataView9-4-2 DataView 物件的資料篩選物件的資料篩選 9-4-3 9-4-3 建立建立 DataTableDataTable 的關聯性的關聯性

9-4-1 DataTable9-4-1 DataTable 物件的資料篩物件的資料篩選選

在在 DataTableDataTable 物件提供物件提供 Select()Select() 方法,方法,可以取得指定過濾條件和排序欄位的可以取得指定過濾條件和排序欄位的DataRowDataRow 物件陣列,如下所示:物件陣列,如下所示:

Dim selectRows() As DataRowDim selectRows() As DataRow

selectRows = _selectRows = _

objDataSet.Tables("Users").Select( _objDataSet.Tables("Users").Select( _

"salary > 30000", "username DESC", _"salary > 30000", "username DESC", _

DataViewRowState.CurrentRows)DataViewRowState.CurrentRows)

9-4-2 DataView9-4-2 DataView 物件的資料篩選物件的資料篩選 --說明說明

DataViewDataView 物件是附屬於物件是附屬於 DataTableDataTable 物件,物件,可以建立第可以建立第 9-69-6 節資料繫結所需的資料來節資料繫結所需的資料來源。源。

事實上,它就是使用者依事實上,它就是使用者依 DataTableDataTable 物件物件自訂的查詢結果,可以指定排序方式、過自訂的查詢結果,可以指定排序方式、過濾條件、搜尋、編輯和瀏覽方式。濾條件、搜尋、編輯和瀏覽方式。

9-4-2 DataView9-4-2 DataView 物件的資料篩選物件的資料篩選 --篩選篩選

在在 ASP.NETASP.NET 程式首先宣告程式首先宣告 DataViewDataView 物件和代物件和代表每一筆記錄的表每一筆記錄的 DataRowViewDataRowView 物件的變數,如物件的變數,如下所示:下所示:

Dim objDataView As DataViewDim objDataView As DataViewDim oRow As DataRowViewDim oRow As DataRowView 然後使用然後使用 DefaultViewDefaultView 屬性取得屬性取得 DataTableDataTable 預預

設的設的 DataViewDataView 物件,如下所示:物件,如下所示:objDataView = objDataView =

objDataSet.Tables("Users" ).DefaultViewobjDataSet.Tables("Users" ).DefaultViewobjDataView.RowFilter = "salary > 30000"objDataView.RowFilter = "salary > 30000"objDataView.Sort = "username DESC"objDataView.Sort = "username DESC"

9-4-3 9-4-3 建立建立 DataTableDataTable 的關聯性的關聯性 -- 說說明明

DataSetDataSet 物件可以包含多個物件可以包含多個 DataTableDataTable 物物件,在件,在 DataTableDataTable 物件間能夠建立關聯性物件間能夠建立關聯性(( RelationshipRelationship )的)的 DataRelationDataRelation 物件,物件,然後使用關聯性來取出不同然後使用關聯性來取出不同 DataTableDataTable 物物件的記錄資料。件的記錄資料。

本節本節 ASP.NETASP.NET 程式範例的程式範例的 DataSetDataSet 物件物件共新增名為共新增名為 UsersUsers和和 TypesTypes 兩個兩個DataTableDataTable (在(在 Users.mdbUsers.mdb有有 UsersUsers和和SalaryTypeSalaryType 兩個資料表)物件。兩個資料表)物件。

9-4-3 9-4-3 建立建立 DataTableDataTable 的關聯性的關聯性 -- 建建立立 DataRelationDataRelation 物件物件

因為因為 TypesTypes 的記錄是的記錄是 UsersUsers 資料表資料表 SalarySalary 欄位欄位的薪資分類資料,所以可以使用此欄位建立資料的薪資分類資料,所以可以使用此欄位建立資料表關聯性的表關聯性的 DataRelationDataRelation 物件,如下所示:物件,如下所示:

objRelation = New DataRelation("SalaryType", _objRelation = New DataRelation("SalaryType", _

objDataSet.Tables("Types").Columns("Salary"), _objDataSet.Tables("Types").Columns("Salary"), _

objDataSet.Tables("Users").Columns("Salary"))objDataSet.Tables("Users").Columns("Salary")) 在建立好在建立好 DataRelationDataRelation 物件後,就可以使用物件後,就可以使用

DataRelationCollectionDataRelationCollection 物件的物件的 Add()Add() 方法新方法新增到增到 DataSetDataSet 物件,如下所示:物件,如下所示:

objDataSet.Relations.Add(objRelation)objDataSet.Relations.Add(objRelation)

9-4-3 9-4-3 建立建立 DataTableDataTable 的關聯性的關聯性 -- 顯顯示兩個資料表的關聯資料示兩個資料表的關聯資料

現在已經建立好資料表關聯性後,接著使用現在已經建立好資料表關聯性後,接著使用 For For EachEach 迴路從父資料表欄位,取得關聯子資料表的迴路從父資料表欄位,取得關聯子資料表的記錄資料,如下所示:記錄資料,如下所示:

For Each TypeRow In For Each TypeRow In objDataSet.Tables("Types").RowsobjDataSet.Tables("Types").Rows

Response.Write(TypeRow("SalaryType") & _Response.Write(TypeRow("SalaryType") & _ "<br>" )"<br>" ) For Each UserRow In For Each UserRow In

TypeRow.GetChildRows("SalaryType")TypeRow.GetChildRows("SalaryType") Response.Write("+---- " & _Response.Write("+---- " & _ UserRow("Name") & "<br>")UserRow("Name") & "<br>") NextNextNextNext

9-5 DataSet9-5 DataSet 物件與物件與 XMLXML

9-5-1 9-5-1 將將 DataSetDataSet 輸出成輸出成 XMLXML 文件文件 9-5-2 9-5-2 讀入讀入 XMLXML 文件文件

9-5-1 9-5-1 將將 DataSetDataSet 輸出成輸出成 XMLXML文件文件

DataSetDataSet 物件可以使用物件可以使用 WriteXML()WriteXML() 方法輸出成方法輸出成XMLXML 文件,如下所示:文件,如下所示:

Dim sw As StreamWriter = _Dim sw As StreamWriter = _

New StreamWriter(Server.MapPath(xmlFile))New StreamWriter(Server.MapPath(xmlFile))

objDS.WriteXML(sw)objDS.WriteXML(sw) 上述程式碼在建立上述程式碼在建立 StreamWriterStreamWriter 串流物件後,串流物件後,

使用使用 DataSetDataSet 物件的物件的 WriteXML()WriteXML() 方法輸出成方法輸出成XMLXML 文件檔案,參數是文件檔案,參數是 StreamWriterStreamWriter 物件。物件。

9-5-2 9-5-2 讀入讀入 XMLXML 文件文件 DataSetDataSet 資料來源也可以是資料來源也可以是 XMLXML 文件,我們可文件,我們可

以使用以使用 DataSetDataSet 物件的物件的 ReadXML()ReadXML() 方法讀取方法讀取XMLXML 文件的元素資料,如下所示:文件的元素資料,如下所示:

Dim sr As StreamReader = New _Dim sr As StreamReader = New _

StreamReader(Server.MapPath(xmlFile))StreamReader(Server.MapPath(xmlFile))

objDS.ReadXML(sr)objDS.ReadXML(sr) 上述程式碼在建立上述程式碼在建立 StreamReaderStreamReader 串流物件後,串流物件後,

使用使用 DataSetDataSet 物件的物件的 ReadXML()ReadXML() 方法讀取方法讀取XMLXML 文件檔案,參數是文件檔案,參數是 StreamReaderStreamReader 物件。物件。

9-6 ASP.NET9-6 ASP.NET 控制項與資料繫結控制項與資料繫結 9-6-1 9-6-1 資料繫結的基礎資料繫結的基礎 9-6-2 ArrayList9-6-2 ArrayList 物件的資料繫結物件的資料繫結 9-6-3 DataReader9-6-3 DataReader 物件的資料繫結物件的資料繫結 9-6-4 DataSet9-6-4 DataSet 物件的資料繫結物件的資料繫結

9-6-1 9-6-1 資料繫結的基礎資料繫結的基礎 --伺服端資料伺服端資料繫結繫結

伺服端資料繫結擁有高擴充性、可重複使用和容伺服端資料繫結擁有高擴充性、可重複使用和容易維護的特點,易維護的特點, ASP.NETASP.NET 的資料繫結就是的資料繫結就是 .NET .NET FrameworkFramework 的資料繫結技術,這是一種不同於的資料繫結技術,這是一種不同於微軟之前產品的資料繫結技術。微軟之前產品的資料繫結技術。

在在 .NET Framework.NET Framework 的資料繫結技術是指將控的資料繫結技術是指將控制項屬性連結到任何可用「資料」(制項屬性連結到任何可用「資料」( DataData ),),在此的資料可以是單純資料、物件屬性,控制項在此的資料可以是單純資料、物件屬性,控制項名稱的集合物件等,名稱的集合物件等, .NET Framework.NET Framework 可以將可以將這些資料視為類別的屬性來存取。這些資料視為類別的屬性來存取。

9-6-1 9-6-1 資料繫結的基礎資料繫結的基礎 -ASP.NET-ASP.NET控制項與資料繫結控制項與資料繫結

ASP.NETASP.NET 控制項支援資料繫結,我們可以控制項支援資料繫結,我們可以將不同資料來源的集合物件、陣將不同資料來源的集合物件、陣列、列、 DataReaderDataReader或或 DataViewDataView 物件整合物件整合到到 ASP.NETASP.NET 控制項。控制項。

不過,不是每一個不過,不是每一個 ASP.NETASP.NET 控制項都支援控制項都支援資料繫結,只有擁有資料繫結,只有擁有 DataSourceDataSource 屬性的屬性的控制項,例如:控制項,例如:ListBoxListBox、、 DropDownListDropDownList、、 CheckBoxCheckBoxListList、、 RadioButtonListRadioButtonList、、 SelectSelect、、 ReRepeaterpeater、、 DataListDataList、、 GridViewGridView 等才可等才可以使用。以使用。

9-6-1 9-6-1 資料繫結的基礎資料繫結的基礎 -- 建立步建立步驟驟

在在 ASP.NETASP.NET 控制項使用資料繫結技術的步控制項使用資料繫結技術的步驟,如下所示:驟,如下所示:• Step 1Step 1 :定義資料來源和取得資料來源的資料:定義資料來源和取得資料來源的資料

物件。物件。• Step 2Step 2 :指定控制項的:指定控制項的 DataSourceDataSource 屬性為屬性為

資料來源的物件,以資料庫來說就是資料來源的物件,以資料庫來說就是DataReaderDataReader或或 DataViewDataView 物件。物件。

• Step 3Step 3 :執行控制項的:執行控制項的 DataBind()DataBind() 方法建立方法建立資料繫結。資料繫結。

9-6-2 ArrayList9-6-2 ArrayList 物件的資料繫結物件的資料繫結 -- 說說明明

雖然雖然 ASP.NETASP.NET 資料繫結技術主要是使用在資料繫結技術主要是使用在資料庫的記錄資料,事實上,資料繫結技資料庫的記錄資料,事實上,資料繫結技術也可以使用在其他資料來源。術也可以使用在其他資料來源。

筆者分別使用筆者分別使用 ArrayListArrayList、、 DataReaderDataReader和和 DataViewDataView 物件作為資料來源,以資料物件作為資料來源,以資料繫結技術顯示繫結技術顯示 ListList 控制項的選項清單。控制項的選項清單。

9-6-2 ArrayList9-6-2 ArrayList 物件的資料繫結物件的資料繫結 -- 步步驟一驟一

首先使用首先使用 ArrayListArrayList 物件的資料來源,在物件的資料來源,在ListBoxListBox 控制項顯示資料來源的選項清單,控制項顯示資料來源的選項清單,第一步是建立資料來源,如下所示:第一步是建立資料來源,如下所示:Dim names As ArrayList= New ArrayList()Dim names As ArrayList= New ArrayList()

names.Add ("names.Add ("陳會安陳會安 ")")

names.Add ("names.Add ("江小魚江小魚 ")")

names.Add ("names.Add ("張無忌張無忌 ")")

names.Add ("names.Add ("楊過楊過 ")")

9-6-2 ArrayList9-6-2 ArrayList 物件的資料繫結物件的資料繫結 -- 步步驟二驟二

接著在第二步指定接著在第二步指定 DataSourceDataSource 屬性為資屬性為資料來源,如下所示:料來源,如下所示:listbox.DataSource = nameslistbox.DataSource = names

上述程式碼指定上述程式碼指定 ListBoxListBox 控制項的控制項的DataSourceDataSource 屬性為前面的屬性為前面的 ArrayListArrayList 物物件件 namename ,最後一個步驟是執行,最後一個步驟是執行DataBind()DataBind() 方法,如下所示:方法,如下所示:listbox.DataBind()listbox.DataBind()

9-6-3 DataReader9-6-3 DataReader 物件的資料繫結物件的資料繫結 DataReaderDataReader 物件也可以作為資料繫結的資料來物件也可以作為資料繫結的資料來

源,如下所示:源,如下所示:dropdown.DataSource = objCmd.ExecuteReader( dropdown.DataSource = objCmd.ExecuteReader(

__ CommandBehavior.CloseConnection)CommandBehavior.CloseConnection)dropdown.DataTextField = "Name"dropdown.DataTextField = "Name"dropdown.DataBind()dropdown.DataBind()

上述程式碼使用上述程式碼使用 ExecuteReader()ExecuteReader() 方法取得方法取得DataReaderDataReader 物件,參數指定物件,參數指定 CommandCommand 物件物件執行執行 SQLSQL 指令的行為值,可以使用此參數來取得指令的行為值,可以使用此參數來取得特定資料或執行額外處理,以此例是額外關閉特定資料或執行額外處理,以此例是額外關閉ConnectionConnection 物件。物件。

9-6-4 DataSet9-6-4 DataSet 物件的資料繫結物件的資料繫結 ADO.NETADO.NET 資料表查詢可以使用資料表查詢可以使用 DataReaderDataReader或或

DataSetDataSet 物件,上一節是使用物件,上一節是使用 DataReaderDataReader 物物件作為資料繫結的資料來源,件作為資料繫結的資料來源, DataSetDataSet 物件則需物件則需使用使用 DataViewDataView 物件來作為資料來源,如下所示:物件來作為資料來源,如下所示:objDataAdapter.Fill(objDS, "Users")objDataAdapter.Fill(objDS, "Users")

rbt.DataSource = _rbt.DataSource = _

objDS.Tables("Users").DefaultViewobjDS.Tables("Users").DefaultView

rbt.DataTextField = "Salary"rbt.DataTextField = "Salary"

rbt.DataBind()rbt.DataBind()