視窗程式設計

Download Report

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