第 10 章 網頁資料庫的查詢 10-1 從資料表取得單一欄位值 10-2 DataReader 物件以表格顯示資料表 10-3 SQL 的資料庫查詢指令 10-4 DataSet 物件的資料庫查詢 10-5 DataSet 物件的資料篩選 10-6 DataSet 物件與 XML
10-1 從資料表取得單一欄位值 ADO.NET 的 Command 物件提供三種 Execute 方 法,在第九章說明的是 ExecuteNonQuery 方法, 這一節我們先來看看 ExecuteScalar 方法,這個 方法可以取得資料表指定記錄的單一欄位值, 如下所示: msg.Text = objCmd.ExecuteScalar() 上述程式碼執行 Command 物件 objCmd 的 SQL 指 令,如果傳回的值不只一個,例如:多筆記錄, 取得的是第一筆記錄的第一個欄位。
10-2 DataReader 物件以表格顯 示資料表 取得資料表資訊 顯示資料表的所有記錄 分頁顯示資料表的記錄
取得資料表資訊 - 取得 資料表本身的資訊,例如:欄位名稱、資料型 態和欄位尺寸。 首先使用 ExecuteReader 方法取得 DataReader 物 件,如下所示: objDataReader = objCmd.ExecuteReader() 上述程式碼取得 ObjDataReader 物件後,使用 GetSchemaTable 方法取得資料表資訊的 DataTable 物件,如下所示: Dim schemaTable As DataTable = objDataReader.GetSchemaTable()
取得資料表資訊 - 顯示 接著使用迴路顯示資料表的資訊,也就是每一 個 DataRow 物件,如下所示: Dim dataRow As DataRow For i = 0 To schemaTable.Rows.Count - 1 Response.Write(" ") dataRow = schemaTable.Rows(i) Response.Write(" " & dataRow("ColumnOrdinal") & " ") Response.Write(" " & dataRow("ColumnName") & " ") Response.Write(" " & dataRow("DataType").ToString() & " ") Response.Write(" " & dataRow("ColumnSize") & " ") Response.Write(" ") Next
顯示資料表的所有記錄 DataReader 物件如同檔案串流一般的讀取資料 表記錄,它只能讀取,不能插入、刪除和更新 記錄資料,其步驟如下所示: – 第一步:建立 Connection 物件 – 第二步:建立 Command 物件 – 第三步:執行 SQL 指令查詢資料表 – 第四步:取出查詢結果的資料表記錄資料 – 第五步:關閉 DataReader 和資料庫連結
分頁顯示資料表的記錄 DataReader 也一樣可以分頁顯示資料表的記錄, 只是實作上必須使用 Command 物件執行兩次 SQL 指令,第一次計算記錄總數,如下所示: objCmd = New OleDbCommand() objCmd.CommandText = "SELECT Count(*) FROM Users" objCmd.Connection = objCon objDataReader = objCmd.ExecuteReader() objDataReader.Read() intMaxRec = objDataReader.GetValue(0) 第二次使用 Command 物件執行 SQL 指令取得資 料表記錄的 DataReader 物件。
10-3 SQL 的資料庫查詢指令 SQL 的查詢指令 FROM 指定資料表 WHERE 子句的條件語法 排序輸出 SQL 的聚合函數
SQL 的查詢指令 - 基本語 法 SQL 的查詢指令只有一個 SELECT ,其基本語 法如下所示: SELECT column1, column2 FROM table WHERE conditions 上述指令 column1~2 是取得記錄的欄位, table 為資料表, conditions 是查詢條件,這個指令以 口語來說是「從資料表 table 取回符合 WHERE 條件所有記錄的欄位 column1 和 column2 」。
SQL 的查詢指令 - "*" 記 錄欄位 SELECT 指令的欄位 column1~2 是指定資料表取 回的欄位名稱,如果需要取得整個記錄的欄位, 可以使用「 * 」符號,表示資料表記錄的所有 欄位名稱,以本節的範例資料庫為例,其指令 如下所示: SELECT * FROM Products 上述指令並沒有指定 WHERE 過濾條件,執行 結果是取回資料表的所有記錄和欄位。
FROM 指定資料表 SELECT 指令的 FROM 是指定使用的資料 表,因為資料庫檔案可能擁有超過一個 資料表,在資料庫查詢時必須使用 FROM 指定查詢的資料表,如下所示 SELECT * FROM Products SELECT * FROM Users
WHERE 子句的條件語法 - 單一查詢條件 -1 如果 SQL 查詢是單一條件, WHERE 子句條件的基本規 則和範例,如下所示: – 文字欄位需要加上單引號,例如:圖書編號 ProductNo 為 F8915 ,此時的 SQL 指令字串,如下所 示: SELECT * FROM Products WHERE ProductNo='F8915' – 數字欄位不需要單引號括起,例如:圖書價格 ProductPrice 為 480 元,此時的 SQL 指令,如下所示: SELECT * FROM Products WHERE ProductPrice=480
WHERE 子句的條件語法 - 單一查詢條件 -2 – 文字和備註欄位可以使用【 LIKE 】包含運算子,這 個運算子是子字串,只需包含此字串即符合條件, 再配合「 % 」或「 _ 」的萬用字元,可以代表任何字 串或單一字元,,例如:圖書編號內包含有 "8" 的子 字串, SQL 指令如下所示: SELECT * FROM Products WHERE ProductNo LIKE '%8%' – 數字欄位可以使用 <> 、 > 、 = 和 <= 不等於、大 於、小於、大於等於和小於等於等運算子建立查詢 條件,例如:圖書價格大於 550 元,如下所示: SELECT * FROM Products WHERE ProductPrice > 550
WHERE 子句的條件語法 - 多重查詢條件 -1 如果 WHERE 的條件不只一個,可以使用邏輯 運算子 AND 和 OR 連接,其基本的規則,如下: –AND 且運算子:連接的前後條件都必須同時成立, 整個條件才成立,例如:圖書編號包含 "1" 且圖書名 稱有 "2002" 子字串,此時的 SQL 指令如下所示: SELECT * FROM Products WHERE ProductNo LIKE '%1%' AND ProductName LIKE '%2002%' –OR 或運算子:連接的前後條件只需任一條件成立即 可,例如:圖書編號包含 "6" 或圖書名稱有 "2002" 的 子字串,此時的 SQL 指令如下所示: SELECT * FROM Products WHERE ProductNo LIKE '%6%' OR ProductName LIKE '%2002%'
WHERE 子句的條件語法 - 多重查詢條件 -2 WHERE 子句允許連接兩個以上的條件,三、 四個或以上都可以,而且 AND 和 OR 也可以在 同一個 WHERE 子句使用,例如:下列的 SQL 指令,如下所示: SELECT * FROM Products WHERE ProductName LIKE '%2002%' OR ProductNo LIKE '%6%' AND ProductPrice >=500 SELECT * FROM Products WHERE (ProductName LIKE '%2002%' OR ProductNo LIKE '%6%') AND ProductPrice >=500
排序輸出 SQL 查詢的結果如果需要排序,可以使用指定 的欄位進行由小到大,或由大到小的排序,只 需在 SELECT 查詢指令的最後加上 ORDER BY 子句即可,如下所示: SELECT * FROM Products WHERE ProductPrice>500 ORDER BY ProductPrice 上述執行結果是使用圖書價格 ProductPrice 欄位 排序,預設由小到大,即 ASC ,如果想倒過來 由大到小,只需加上 DESC 指令,如下所示: SELECT * FROM Products WHERE ProductPrice>500 ORDER BY ProductPrice DESC
SQL 的聚合函數
10-4 DataSet 物件以表格顯示資 料表 顯示 DataSet 物件的所有記 錄 分頁顯示 DataTable 的記錄 使用程式碼建立 DataTable 物件的資料表
10-4 DataSet 物件以表格顯示資 料表
顯示 DataSet 物件的所有 記錄 在使用 DataAdapter 物件將資料表記錄填 入 DataSet 後,我們就可以使用 For Each 迴 路從 DataRowCollection 物件集合,取出 每一個 DataRow 物件,如下所示: For Each objDataRow in objDataSet.Tables("Users").Rows Response.Write(" ") Response.Write(" " & objDataRow("name") & " ") Response.Write(" " & objDataRow("birthday") & " ") Response.Write(" " & objDataRow("salary") & " ") …………………… Next
分頁顯示 DataTable 的記 錄 - 欄位名稱 DataSet 物件是儲存在記憶體的資料庫,可以直 接取得記錄數,以便建立分頁顯示,如下所示: intMaxRec = objDataSet.Tables("Users").Rows.Count DataColumnCollection 物件集合顯示資料表的欄 位名稱,如下所示: Dim objColumn As DataColumn For Each objColumn in objDataSet.Tables("Users").Columns Response.Write(" " & objColumn.ColumnName & " ") Next
分頁顯示 DataTable 的記 錄 - 記錄資料 然後使用 Count 屬性取得欄位數,如下所示: intFCount = objDataSet.Tables("Users").Columns.Count 最後使用 Do Loop 迴路以分頁顯示資料表記錄,如下: Dim objRow As DataRow intJ = intStartRec Do objRow = objDataSet.Tables("Users").Rows(intJ - 1) ………………… For intI = 0 To intFCount - 1 If objRow.IsNull(intI) = False Then Response.Write(" " & objRow(intI) & " ") Else Response.Write(" --- ") End If Next ……………………… intJ = intJ + 1 Loop Until intJ > intStopRec
使用程式碼建立 DataTable 物件的資料表 DataSet 物件架構是由 DataTable 物件組成, 每一個 DataTable 是以 DataRow 物件組成。 事實上,就算沒有任何資料來源或資料 庫連結, ASP.NET 程式碼也可以建立所 需的 DataSet 和 DataTable 物件,將它視為 儲存在記憶體中的資料表,例如:儲存 網路商店的購物車資料。
10-5 DataSet 物件的資料篩選 DataTable 物件 Select 方法的篩選 DataView 物件的篩選 DataTable 的關聯
DataTable 物件 Select 方法 的篩選 在 DataTable 物件提供 Select 方法,可以取得指 定過濾條件和排序欄位的 DataRow 物件陣列, 如下所示: selectRows = objDataSet.Tables("Users").Select("salary > 15000", _ "username DESC", DataViewRowState.CurrentRows) 在使用 Select 方法取得符合過濾條件的 DataRow 物件陣列後,可以使用 For Each 迴路取得個別 的 DataRow 物件,如下所示: For Each objRow In selectRows ………… Next
DataView 物件的篩選 -1 DataView 附屬於 DataTable 物件,它就是使用者 自訂 DataTable 物件的查詢結果,可以指定排序 方式、過濾條件、搜尋、編輯和瀏覽方式。 首先宣告 DataView 物件和代表每一筆記錄的 DataRowView 物件的變數,如下所示: Dim objDataView As DataView Dim objRow As DataRowView 然後使用 DefaultView 屬性取得 DataTable 預設的 DataView 物件,如下所示: objDataView = objDataSet.Tables("Users" ).DefaultView objDataView.RowFilter = "salary > 15000" objDataView.Sort = "username DESC"
DataView 物件的篩選 -2 在設定 DataView 的 RowFilter 和 Sort 屬性後, 可以取得過濾後的 DataView 物件,只需 使用 For Each 迴路就可以取出各 DataRowView 物件,如下所示: For Each objRow In objDataView ………… Next
DataTable 的關聯 如果 DataSet 物件包含多個 DataTable 物件,我們 可以在 DataTable 物件間建立關聯的 DataRelation 物件,然後使用關聯取出不同 DataTable 物件的記錄資料。 建立資料表間關聯的 DataRelation 物件, 如下所示: objRelation = New DataRelation("LevelName", _ objDataSet.Tables("Levels").Columns("no"), _ objDataSet.Tables("Users").Columns("userLevel"))
10-6 DataSet 物件與 XML 將 DataSet 輸出成 XML 文件 讀入 XML 文件
將 DataSet 輸出成 XML 文 件 DataSet 物件輸出成 XML 文件只需使用 WriteXML 方法,如下所示: Dim sw As StreamWriter = New StreamWriter(Server.MapPath(xmlFile)) objDataSet.WriteXML(sw) 上述程式碼在建立 StreamWriter 串流物件後, 使用 DataSet 物件的 WriteXML 方法輸出成 XML 文件檔案,其參數是 StreamWriter 物件。
讀入 XML 文件 DataSet 的資料來源也可以是 XML 文件,只需 使用 DataSet 物件的 ReadXML 方法就可以讀取 XML 文件的元素資料,如下所示: Dim sr As StreamReader = New StreamReader(Server.MapPath(xmlFile)) objDataSet.ReadXML(sr) 上述程式碼在建立 StreamReader 串流物件後, 使用 DataSet 物件的 ReadXML 方法讀取 XML 文件檔案,其參數是 StreamReader 物件。