510 likes | 678 Views
LESSION 6 資料存取. 鄧姚文. 參考書. 林文恭、吳進北、吳惠雯( 2011 ), MTA Exam 98-362 視窗研發認證實戰寶典, 碁峰資訊股份有限公司, ISBN 9789862763629 (書號 CMS101200 ) 林建宏 譯( 2011 ), MTA Exam 98-362 Windows Developer Fundamentals 官方認證教材, 碁峰資訊股份有限公司, ISBN 978-986-276-226-4 (書號 CMS100200 ). 6.1 資料存取概念. 資料表
E N D
LESSION 6資料存取 鄧姚文
參考書 林文恭、吳進北、吳惠雯(2011), MTA Exam 98-362 視窗研發認證實戰寶典, 碁峰資訊股份有限公司, ISBN 9789862763629 (書號 CMS101200) 林建宏 譯(2011), MTA Exam 98-362 Windows Developer Fundamentals 官方認證教材, 碁峰資訊股份有限公司, ISBN 978-986-276-226-4 (書號 CMS100200)
6.1 資料存取概念 • 資料表 • 資料庫中最重要的物件就是資料表 (Table),資料庫由一個或一個上的資料表所構成,每個資料表名稱在資料庫中都是唯一的。 • 資料表中每一直行 (Column) 稱之為欄位,每個欄位都有其資料型態 (Data Type),由不同欄位所組成的橫列 (Row),稱之為記錄 (Record)
6.1 資料存取概念 • 資料庫管理系統 • 資料庫管理系統(DBMS)是為管理資料庫而設計的電腦軟體系統,一般具有儲存、擷取、安全保障、備份等基礎功能。 • 常見的 DBMS 有 MySQL、Microsoft Access、SQL Server、Oracle等。 • 幾乎所有的資料庫管理系統,都配備了一個開放式資料庫連接(ODBC)驅動程式,令各個資料庫之間得以互相整合。
SQL 簡介 • 結構化查詢語言(Structured Query Language) • 標準資料查詢語言 • IBM 公司最早使用在其開發的資料庫系統中。 • 1986 年10 月,美國國家標準學會(ANSI) • 關聯式資料庫管理系統的標準語言 • ANSI X3.135-1986 • 1987 國際標準 • 各種通行的資料庫系統都對 SQL 規範作了某些編改和擴充 • 不同資料庫系統之間的 SQL 不能完全相互通用
SQL 四個部分 • 資料定義語言 DDL • Data Definition Language • 資料操縱語言 DML • Data Manipulation Language • 資料查詢語言 DQL • Data Query Language • 資料控制語言 DCL • Data Control Language
DDL • 定義資料庫、資料表、檢視表、索引、預存程序、觸發程序、函數等資料庫物件
DML 處理資料表裡的資料
DQL 查詢資料表
DCL 控制資料表、檢視表之存取權限
6.2 索引 • 資料索引的觀念像是一本書的目錄。 • 依索引欄位的值排序 • 加快查詢速度 • 關鍵欄位(Key Field) • 具有唯一性 • 值不可重複 • 不可為空值(null)
6.4SQL 重要指令語法 Distinct And/Or Select Where
In • Like • Count Between Order By Group By
Having • Drop Table • Insert Into • Delete From Create Table Truncate Table Update
6.5SQL 指令實作例 取得庫存表中前1000 筆資料的編號、品名、單價、數量、金額欄位值 取得庫存表中所有資料的所有欄位值
取得庫存表中所有資料的編號、品名、單價欄位值取得庫存表中所有資料的編號、品名、單價欄位值 • 取得庫存表中前2 筆資料的品名、單價、數量欄位值 • 取得庫存表中前1000 筆資料的品名欄位值,重覆資料不列出
取得庫存表中前1000 筆資料的品名欄位值,重覆資料亦列出 • 取得庫存表中的所有記錄的品名欄位值,並把欄位標題名稱改為" 產品名" • 取得庫存表的編號、品名、單價、數量、金額欄位值, • 條件是金額必須大於1000
取得庫存表的編號、品名、單價、數量、金額欄位值,取得庫存表的編號、品名、單價、數量、金額欄位值, • 條件必須是金額大於1000 或者單價大於等於40 • 取得庫存表的編號、品名、單價、數量、金額欄位值, • 條件必須是金額介於850 至2000 之間
取得庫存表的編號、品名、單價、數量、金額欄位值,取得庫存表的編號、品名、單價、數量、金額欄位值, • 條件必須是金額不介於850 至2000 之間 • 取得庫存表的編號、品名、單價、數量、金額欄位值, • 條件必須是品名含巧克力 附註 % 代表零或多個任意字元。 _ 代表一個任意字元。
取得庫存表中,品名含" 巧克力" 的所有記錄的金額加總 • 取得庫存表中,所有記錄的最高金額 • 取得庫存表中,記錄的筆數 • 取得庫存表中,以品名為分組的金額欄位加總
取得庫存表中的金額欄位加總 • 插入一筆記錄至庫存表中 • 更正庫存表中編號= 'I002' 的記錄,更改:編號 = 'I002' , 品名= ' 品22', • 價格=30, 數量=3, 金額=90 • 刪除庫存表中品名 = ' 樣品' 的所有記錄
刪除庫存表中的所有記錄 • 附註 • DELETE 指令在不設條件下會會資料表中的所有記錄全部刪除
6.6 建立資料應用程式 • Visual Studio 中,用來建立應用程式的基礎資料架構是 ADO.NET。 • 處理應用程式中的資料整體工作,可以分成幾個最上層的處理序。 • 例如,在表單上顯示資料給使用者之前,必須先連接到資料來源 ,接著擷取要顯示的資料。 • 這項資料送至應用程式後,可能需要某個位置暫時存放它 ( 例如 DataSet或 LINQ to SQL 物件)。
連接到資料 若要將資料送回應用程式中,並將變更傳送回資料來源,必須建立特定雙向通訊 雙向通訊一般是由使用資料集的應用程式中,TableAdapter的連結所處理,或是使用 LINQ to SQL 之應用程式的 DataContext所處理
連接到資料 • 準備應用程式以接收資料 • 如果應用程式使用中斷連接的資料模型 • 必須暫時將資料儲存在應用程式中 • Dataset 資料集 • LINQ to SQL • 中斷連接資料模型程序 • 連接至資料庫、執行查詢將資料送回應用程式、中斷資料庫連接,以離線方式管理資料,重新連接、更新資料庫
將資料擷取至應用程式中 • 將資料儲存在資料集之中 • 使用 TableAdapter執行查詢 • 將資料儲存在 LINQ to SQL 物件之中 • 使用 LINQ to SQL 查詢 • 使用 DataContext方法 (O/R 設計工具) 執行預存程序 • 顯示表單上的資料 • 資料來源 • 顯示資料的資料繫結控制項
在應用程式中編輯資料 • 操作個別 DataRow物件 • 從 [ 資料來源] 視窗拖曳項目建立表單 • 透過資料繫結控制項,自動處理大部分的資料變更 • 新值會自動寫入到資料集中 • 可以加入或移除資料錄,其方式是在 BindingNavigator控制項上按一下 [ 加入新的] 或 [ 刪除] 按鈕
驗證資料 避免將錯誤的資料寫入資料庫 驗證(Validation) 在應用程式中的值變更時檢查
儲存資料 • 將資料儲存在資料集的應用程式 • 使用 TableAdapterManager • 將資料儲存在 LINQ to SQL 物件的應用程式 • 使用 SubmitChanges方法
6.7 資料繫結控制項 • 資料繫結控制項(Data-Bound Controls) • DataTable • DataView • TreeView
DataSet、DataTable、DataView 一個 DataSet內含一個或多個 DataTable DataView是 DataTable的檢視介面
ADO.NET DataSet • 常駐記憶體 • 不論內含資料來源為何 • 提供一致的關聯式模型 • 一組完整的資料,包括內含排序和約束資料的資料表,以及資料表間的關聯性。
ADO.NET DataSet • 可以獨立或組合套用 • 程式在 DataSet內建立 DataTable、DataRelation和 Constraint,填入資料 • 使用 DataAdapter,將來自現有關聯式資料來源之資料的資料表填入 DataSet • 使用 XML 載入並保存 DataSet內容。 • 使用 XML Web Service 傳輸強型別的 DataSet
建立 DataSet • 可呼叫 DataSet建構函式 (Constructor) 建立 DataSet執行個體 (Instance) • 也可根據現有的 DataSet建立新的 DataSet。 新的 DataSet可以是: • 現有 DataSet的完整複本 • 只複製結構不複製資料 • 建立子集合,只包含來自現有的 DataSet且使用 GetChanges方法修改過的資料列
將 DataTable 加入至 DataSet 建立 DataTable物件 將 DataTable加入 DataSet 使用 PrimaryKey和 Unique 屬性為 DataTable設定條件約束 (Constraint)
DataTable • 記憶體中的關聯式資料表 • 可以使用 DataAdapter 填入資料 • 資料來源:SQL Server • 命名空間 (Namespace) • System.Data • 可以單獨使用 DataTable,或是將它當做 DataSet的成員 • DataSet物件的 Tables 屬性
DataTable • Schema • 資料行 DataColumn • 約束條件 • ForeignKeyConstraint外來鍵約束條件 • UniqueConstraint唯一值約束條件 • DataRow維護資料的狀態 • DataRelation • 在 DataTable物件之間建立關係
建立 DataTable • 使用 DataAdapter的 Fill 或 FillSchema方法,在 DataSet中建立 DataTable • 使用 DataSet的 ReadXml、ReadXmlSchema或 InferXmlSchema方法,從 XML 檔案 • 一個 DataTable只屬於一個 DataSet • 不可以把一個 DataSet裡面的 DataTable加入到其他 DataSet之中
建立 DataTable • 剛 new 出來的 DataTable物件,沒有 Schema • 以程式建立 Schema • 建立 DataColumn,加入DataTable的 Columns 集合 • 定義 DataTable的主索引鍵資料行 • 建立 Constraint,加入 DataTable的 Constraints 集合 • 將資料列加入資料表 • 建立 DataRow,加入資料 • 將 DataRow加入 DataTable的 Rows 集合
建立 DataTable • DataTable的 TableName屬性並非必要 • 可以空白 • 將不具 TableName的資料表加入 DataSet時,該資料表會指定 TableN的累加預設名稱 • Table0、Table1、Table2、… • 設定 TableName時,避免使用 "TableN" 命名慣例 • 資料表名稱衝突會發生例外狀況
DataTable結構描述定義 (ADO.NET) • 依名稱參考資料表的資料行、關聯和條件約束時必須區分大小寫 • 如果只有一個資料行、關聯和條件約束使用特定的名稱,則不適用區分大小寫的規則 • 如果資料表只有 Col1,可以使用 my.Columns[“COL1”] 來參考它。 • DataTable的 CaseSensitive屬性不影響這個特性 • CaseSensitive屬性適用於資料表中的資料,可影響排序、搜尋、篩選和條件約束的強制執行等,但不會參考資料行、關聯與條件約束。
DataGridView控制項 • DataGridView控制項取代 DataGrid控制項並加入其他功能 • 可以顯示和編輯各種不同資料來源的表格資料 • 繫結至包含多個清單或資料表的資料來源時,將 DataMember屬性設定為指定清單或資料表要繫結目標的字串。 • 支援標準的 Windows Form 資料繫結模型,可繫結: • 實作 IList介面的任何類別,包括一維陣列 • 實作 IListSource介面的任何類別,例如 DataTable和 DataSet類別 • 實作 IBindingList介面的任何類別,例如 BindingList(Of T) 類別 • 實作 IBindingListView介面的任何類別,例如 BindingSource類別
DataGridView控制項 將資料繫結至傳回物件的公用屬性,或繫結至 ICustomTypeDescriptor介面傳回的屬性集合 繫結至 BindingSource元件,並將 BindingSource元件繫結至另一個資料來源或將商務物件 (Business Object)
使用者體驗 • 糟糕:作業時間太長,造成畫面停止反應 • 長時間作業使用進度指示器 • ProgressBar • 歷時不到一秒的簡短動作,設定 Masked Edit 控制項的 MousePointer屬性,將滑鼠游標變成沙漏。 • 不預先載入資料,讓使用者選定後再載入 • 預先載入表單或控制項時,將它們隱藏起來,以減少繪製的時間
利用執行緒與計時器在背景準備使用者可能需要的資料利用執行緒與計時器在背景準備使用者可能需要的資料 • 早期畫面 • 越簡單越好,降低載入與初始化的時間 • 表單載入事件中,盡早呼叫 Me.Show • 避免載入非立即需要的模組 • 如果畫面中含有動畫或是需要經常更動的畫面元素,利用雙重或多重緩衝在繪製目前影像的同時準備下一個影像。 • ControlStyles.DoubleBuffer