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 可使資料
回復至原來狀況。