Transcript 視窗程式設計
LESSION 6 資料存取 鄧姚文 參考書 林文恭、吳進北、吳惠雯(2011), MTA Exam 98-362 視窗研發認證實戰寶典, 碁 峰資訊股份有限公司, ISBN 9789862763629 (書號 CMS101200) 林建宏 譯(2011), MTA Exam 98-362 Windows Developer Fundamentals 官方認證 教材, 碁峰資訊股份有限公司, ISBN 978986-276-226-4 (書號 CMS100200) 2 6.1 資料存取概念 資料表 資料庫中最重要的物件就是資料表 (Table),資 料庫由一個或一個上的資料表所構成,每個資 料表名稱在資料庫中都是唯一的。 資料表中每一直行 (Column) 稱之為欄位,每個 欄位都有其資料型態 (Data Type),由不同欄位 所組成的橫列 (Row),稱之為記錄 (Record) 6.1 資料存取概念 資料庫管理系統 資料庫管理系統(DBMS)是為管理資料庫而 設計的電腦軟體系統,一般具有儲存、擷取、 安全保障、備份等基礎功能。 常見的 DBMS 有 MySQL、Microsoft Access、 SQL Server、Oracle等。 幾乎所有的資料庫管理系統,都配備了一個開 放式資料庫連接(ODBC)驅動程式,令各個資 料庫之間得以互相整合。 4 SQL 簡介 結構化查詢語言(Structured Query Language) 標準資料查詢語言 IBM 公司最早使用在其開發的資料庫系統中。 1986 年10 月,美國國家標準學會(ANSI) 關聯式資料庫管理系統的標準語言 ANSI X3.135-1986 1987 國際標準 各種通行的資料庫系統都對 SQL 規範作了某些 編改和擴充 不同資料庫系統之間的 SQL 不能完全相互通用 SQL 四個部分 資料定義語言 DDL 資料操縱語言 DML Data Manipulation Language 資料查詢語言 DQL Data Definition Language Data Query Language 資料控制語言 DCL Data Control Language 6 DDL 定義資料庫、資料表、檢視表、索引、預存程序、 觸發程序、函數等資料庫物件 7 DML 處理資料表裡的資料 DQL 查詢資料表 9 DCL 控制資料表、檢視表之存取權限 6.2 索引 資料索引的觀念像是一本書的目錄。 依索引欄位的值排序 加快查詢速度 關鍵欄位(Key Field) 具有唯一性 值不可重複 不可為 空值(null) 6.4 SQL 指令整理 6.4 SQL 重要指令語法 Select Where Distinct And/Or In Between Like Order By Count Group By Having Create Table Drop Table Truncate Table Insert Into Update Delete From 6.5 SQL 指令實作例 取得庫存表中前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 所 處理 26 連接到資料 準備應用程式以接收資料 如果應用程式使用中斷連接的資料模型 必須暫時將資料儲存在應用程式中 Dataset 資料集 LINQ to SQL 中斷連接資料模型程序 連接至資料庫、執行查詢將資料送回應用程式、 中斷資料庫連接,以離線方式管理資料,重新 連接、更新資料庫 將資料擷取至應用程式中 將資料儲存在資料集之中 將資料儲存在 LINQ to SQL 物件之中 使用 TableAdapter 執行查詢 使用 LINQ to SQL 查詢 使用 DataContext 方法 (O/R 設計工具) 執行預 存程序 顯示表單上的資料 資料來源 顯示資料的資料繫結控制項 在應用程式中編輯資料 操作個別 DataRow 物件 從 [ 資料來源] 視窗拖曳項目建立表單 透過資料繫結控制項,自動處理大部分的資料 變更 新值會自動寫入到資料集中 可以加入或移除資料錄,其方式是在 BindingNavigator 控制項上按一下 [ 加入新的] 或 [ 刪除] 按鈕 29 驗證資料 避免將錯誤的資料寫入資料庫 驗證(Validation) 在應用程式中的值變更時檢查 儲存資料 將資料儲存在資料集的應用程式 使用 TableAdapterManager 將資料儲存在 LINQ to SQL 物件的應用程式 使用 SubmitChanges 方法 6.7 資料繫結控制項 資料繫結控制項(Data-Bound Controls) DataTable DataView TreeView DataSet、DataTable、DataView 一個 DataSet 內含一個或多個 DataTable DataView 是 DataTable 的檢視介面 33 ADO.NET DataSet 常駐記憶體 不論內含資料來源為何 提供一致的關聯式模型 一組完整的資料,包括內含排序和約束資料的 資料表,以及資料表間的關聯性。 ADO.NET DataSet 可以獨立或組合套用 程式在 DataSet 內建立 DataTable、 DataRelation 和 Constraint,填入資料 使用 DataAdapter,將來自現有關聯式資料來源 之資料的資料表填入 DataSet 使用 XML 載入並保存 DataSet 內容。 使用 XML Web Service 傳輸強型別的 DataSet 35 建立 DataSet 可呼叫 DataSet 建構函式 (Constructor) 建立 DataSet 執行個體 (Instance) 也可根據現有的 DataSet 建立新的 DataSet。 新的 DataSet 可以是: 現有 DataSet 的完整複本 只複製結構不複製資料 建立子集合,只包含來自現有的 DataSet 且使用 GetChanges 方法修改過的資料列 將 DataTable 加入至 DataSet 建立 DataTable 物件 將 DataTable 加入 DataSet 使用 PrimaryKey 和 Unique 屬性為 DataTable 設定條件約束 (Constraint) DataTable 記憶體中的關聯式資料表 可以使用 DataAdapter 填入資料 命名空間 (Namespace) 資料來源:SQL Server System.Data 可以單獨使用 DataTable,或是將它當做 DataSet 的成員 DataSet 物件的 Tables 屬性 38 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 集合 42 建立 DataTable DataTable 的 TableName 屬性並非必要 將不具 TableName 的資料表加入 DataSet 時,該資料表會指定 TableN 的累加預設名 稱 可以空白 Table0、Table1、Table2、… 設定 TableName 時,避免使用 "TableN" 命 名慣例 資料表名稱衝突會發生例外狀況 43 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) DataGridView 和 DataGrid 的差異 DataGridView 和 DataGrid 的差異 使用者體驗 糟糕:作業時間太長,造成畫面停止反應 長時間作業使用進度指示器 ProgressBar 歷時不到一秒的簡短動作,設定 Masked Edit 控制項的 MousePointer 屬性,將滑鼠 游標變成沙漏。 不預先載入資料,讓使用者選定後再載入 預先載入表單或控制項時,將它們隱藏起 來,以減少繪製的時間 利用執行緒與計時器在背景準備使用者可能需 要的資料 早期畫面 越簡單越好,降低載入與初始化的時間 表單載入事件中,盡早呼叫 Me.Show 避免載入非立即需要的模組 如果畫面中含有動畫或是需要經常更動的畫面 元素,利用雙重或多重緩衝在繪製目前影像的 同時準備下一個影像。 ControlStyles.DoubleBuffer SQL Server 多伺服器指令執行支援 交易式資料存取類型,支援多伺服器的同 步交易,確保各伺服器資料的正確性。 某一伺服器出問題時,SQL Server 可使資料 回復至原來狀況。