ado.net 開發高手系列

55

Upload: virgil

Post on 13-Jan-2016

55 views

Category:

Documents


0 download

DESCRIPTION

ADO.NET 開發高手系列. 台灣微軟資深講師 從 1993 年開始於台灣微軟主講研討會 台灣微軟最有價值專家 兩度當選 MVP 資深電腦圖書作家 擁有 60 本以上的著作 資深技術顧問. 主講人:章立民. ADO.NET 開發高手線上教學課程 第八集 如何建立與使用 DataSet. DataSet 的基本概念( 1/2 ). 將資料快取於資料集 獨立於資料來源之外 緊密整合 XML 結構描述定義資料結構 型別與不具型別的 DataSet 型別和不具型別資料集的資料存取比較 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: ADO.NET  開發高手系列
Page 2: ADO.NET  開發高手系列

ADO.NET ADO.NET 開發高手系開發高手系列列

台灣微軟資深講師台灣微軟資深講師 從 從 1993 1993 年開始於台灣微軟主講研討年開始於台灣微軟主講研討

會會 台灣微軟最有價值專家台灣微軟最有價值專家

兩度當選 兩度當選 MVPMVP

資深電腦圖書作家資深電腦圖書作家 擁有 擁有 60 60 本以上的著作本以上的著作

資深技術顧問資深技術顧問

主講人:章立民主講人:章立民

Page 3: ADO.NET  開發高手系列

ADO.NET ADO.NET 開發高手線上教學課程開發高手線上教學課程

第八集第八集

如何建立與使用 如何建立與使用 DataSet DataSet

Page 4: ADO.NET  開發高手系列

DataSet DataSet 的基本概念(的基本概念( 1/21/2 ) ) 將資料快取於資料集將資料快取於資料集 獨立於資料來源之外獨立於資料來源之外 緊密整合 緊密整合 XMLXML 結構描述定義資料結構結構描述定義資料結構 型別與不具型別的 型別與不具型別的 DataSetDataSet 型別和不具型別資料集的資料存取比較型別和不具型別資料集的資料存取比較

型別資料集型別資料集' ' 存取 存取 Employee Employee 資料表之第一筆資料列的 資料表之第一筆資料列的 EmployeeID EmployeeID 欄位欄位Dim s As String = Dim s As String = myDataSet.Employee(0).EmployeeIDmyDataSet.Employee(0).EmployeeID

不具型別資料集不具型別資料集Dim s As String= _Dim s As String= _ CType( CType(myDataSet.Tables(“Employee”).Rows(0).Item(“EmployeeID”)myDataSet.Tables(“Employee”).Rows(0).Item(“EmployeeID”), _, _ String) String)

Page 5: ADO.NET  開發高手系列

DataSet DataSet 的基本概念(的基本概念( 2/22/2 )) 資料集的大小寫區分特性資料集的大小寫區分特性 填入資料集填入資料集

呼叫資料配接器的 呼叫資料配接器的 FillFill 方法。方法。 以人工方式填入資料集當中的資料表。以人工方式填入資料集當中的資料表。 呼叫 呼叫 DataSet DataSet 的 的 ReadXmlReadXml 方法將 方法將 XML XML 文文

件或資料流讀入資料集。 件或資料流讀入資料集。 呼叫 呼叫 DataSet DataSet 的 的 MergeMerge 方法來合併(複方法來合併(複

製)其他資料集的內容。 製)其他資料集的內容。 資料列的位置與導覽資料列的位置與導覽

Page 6: ADO.NET  開發高手系列

資料集的實作流程資料集的實作流程1.1. 建立資料集(也就是 建立資料集(也就是 DataSet DataSet 物件)。物件)。2.2. 在資料集當中建立一或多個資料表。在資料集當中建立一或多個資料表。3.3. 建立資料表間的關聯性連結。 建立資料表間的關聯性連結。 4.4. 於各個資料表中新增、修改、或刪除資料列(於各個資料表中新增、修改、或刪除資料列( DD

ataRow ataRow 物件)。物件)。5.5. 呼叫 呼叫 DataSet DataSet 的 的 GetChangesGetChanges 方法來建立第方法來建立第

二個 二個 DataSetDataSet (此 (此 DataSet DataSet 只包含資料的變只包含資料的變更)。 更)。

6.6. 將第二個 將第二個 DataSet DataSet 當作引數傳遞給資料配接器當作引數傳遞給資料配接器的 的 UpdateUpdate 方法。方法。

7.7. 呼叫 呼叫 DataSet DataSet 的 的 MergeMerge 方法將第二個 方法將第二個 DataSDataSet et 的變更合併到第一個 的變更合併到第一個 DataSetDataSet 。。

8.8. 呼叫 呼叫 DataSet DataSet 的 的 AcceptChangesAcceptChanges 方法來接受方法來接受變更,或是呼叫 變更,或是呼叫 DataSet DataSet 的 的 RejectChangesRejectChanges 方法來取消變更。 方法來取消變更。

Page 7: ADO.NET  開發高手系列

如何建立資料集如何建立資料集DataSet DataSet 類別的建構函式 類別的建構函式

DataSet()DataSet() 預設名稱將是 預設名稱將是 NewDataSetNewDataSet 使用 使用 DataSetNameDataSetName 屬性來設定其名稱屬性來設定其名稱 簡例:簡例: Dim myDataSet As DataSet = New DataSetDim myDataSet As DataSet = New DataSet myDataSet.DataSetName = " myDataSet.DataSetName = " 人事資料集人事資料集 ""

DataSet(ByVal dataSetName As String)DataSet(ByVal dataSetName As String) 簡例:簡例: Dim myDataSet As DataSet = New DataSet("Dim myDataSet As DataSet = New DataSet(" 人事資料集人事資料集 ")")

DataSet(ByVal info As SerializationInfo, _ DataSet(ByVal info As SerializationInfo, _ ByVal context As StreamingContext) ByVal context As StreamingContext)

Page 8: ADO.NET  開發高手系列

如何於資料集當中建立資料表如何於資料集當中建立資料表 建立 建立 DataTable DataTable 物件,然後將 物件,然後將 DataTablDataTabl

e e 物件新增至資料集。物件新增至資料集。 透過透過資料配接器資料配接器(例如:(例如: SqlDataAdapteSqlDataAdapte

rr ),將關聯式資料來源內之資料表的資料),將關聯式資料來源內之資料表的資料填入 填入 DataSet DataSet 來建立資料表。來建立資料表。

使用預先定義或推斷的 使用預先定義或推斷的 XML XML 結構描述建結構描述建立 立 DataTable DataTable 物件。物件。 ReadXmlReadXml ReadXmlSchemaReadXmlSchema InferXmlSchemaInferXmlSchema

Page 9: ADO.NET  開發高手系列

自行建立 自行建立 DataTable DataTable 物件並新增至資料集物件並新增至資料集 關於資料集的資料表集合關於資料集的資料表集合

DataTableCollectionDataTableCollection (資料表集合)會內含 (資料表集合)會內含 DataSet DataSet 的所有 的所有 DataTable DataTable 物件,可以使用 物件,可以使用 DataSet DataSet 的 的 TablesTables 屬性來存取它。屬性來存取它。

使用 使用 DataTableCollection DataTableCollection 的 的 AddAdd 方法來方法來將 將 DataTable DataTable 物件新增至資料表集合中。物件新增至資料表集合中。

使用 使用 DataTableCollection DataTableCollection 的 的 RemoveRemove 方方法從資料表集合中移除指定的 法從資料表集合中移除指定的 DataTableDataTable 物物件。件。

使用 使用 DataTableCollection DataTableCollection 的 的 ClearClear 方法從方法從資料表集合中移除所有的 資料表集合中移除所有的 DataTable DataTable 物件。物件。

使用 使用 DataTableCollection DataTableCollection 的 的 ContainsContains 方方法來判斷特定的資料表是否存在於資料表集合法來判斷特定的資料表是否存在於資料表集合中。中。

Page 10: ADO.NET  開發高手系列

DataTableCollection DataTableCollection 之 之 Add Add 方法方法的多載版本的多載版本(( 1/31/3 )) Add(ByVal table As DataTable)Add(ByVal table As DataTable)

' ' 建立資料集建立資料集Dim myDataSet As DataSet = _Dim myDataSet As DataSet = _ New DataSet(" New DataSet(" 人事資料集人事資料集 ")")

' ' 建立資料表建立資料表Dim limingTable As DataTable = _Dim limingTable As DataTable = _ New DataTable(" New DataTable(" 章立民工作室章立民工作室 ")")…………' ' 將資料表新增至資料集的資料表集合中將資料表新增至資料集的資料表集合中myDataSet.Tables.Add(limingTable)myDataSet.Tables.Add(limingTable)

Page 11: ADO.NET  開發高手系列

DataTableCollection DataTableCollection 之 之 Add Add 方法方法的多載版本的多載版本(( 2/32/3 )) Add() As DataTableAdd() As DataTable

' ' 建立資料集建立資料集Dim myDataSet As DataSet = _Dim myDataSet As DataSet = _ New DataSet(“ New DataSet(“ 人事資料集”人事資料集” ))

' ' 於資料集當中建立一個資料表於資料集當中建立一個資料表Dim limingTable As DataTable = _Dim limingTable As DataTable = _ myDataSet.Tables.Add()myDataSet.Tables.Add()

' ' 設定資料表的名稱設定資料表的名稱limingTable.limingTable.TableNameTableName = " = " 章立民工作室章立民工作室 " "

Page 12: ADO.NET  開發高手系列

DataTableCollection DataTableCollection 之 之 Add Add 方法的多載版本方法的多載版本(( 3/33/3 )) Add(ByVal name As String) As _Add(ByVal name As String) As _

DataTable DataTable

' ' 建立資料集建立資料集Dim myDataSet As DataSet = _Dim myDataSet As DataSet = _ New DataSet(“ New DataSet(“ 人事資料集”人事資料集” ))

' ' 於資料集當中建立一個名稱於資料集當中建立一個名稱' ' 為「章立民工作室」的資料表為「章立民工作室」的資料表Dim limingTable As DataTable = _Dim limingTable As DataTable = _myDataSet.Tables.Add("myDataSet.Tables.Add(" 章立民工作章立民工作室室 ")")

Page 13: ADO.NET  開發高手系列

存取資料表存取資料表 使用資料表的使用資料表的名稱名稱或或索引索引來存取資料集當來存取資料集當

中的資料表。例如,假設「章立民工作中的資料表。例如,假設「章立民工作室」資料表是資料集之資料表集合中的第 室」資料表是資料集之資料表集合中的第 11 個資料表:個資料表:

myDataSet.Tables(myDataSet.Tables(00))

-或--或-

myDataSet.Tables(myDataSet.Tables("" 章立民工作室章立民工作室 ""))

Page 14: ADO.NET  開發高手系列

程式範例 程式範例 DemoForm1.vbDemoForm1.vb

示範如何建立一個資料集、於此資料集當示範如何建立一個資料集、於此資料集當中建立一個資料表、將資料列新增至此資中建立一個資料表、將資料列新增至此資料表、然後再將表單上的 料表、然後再將表單上的 DataGrid DataGrid 控制控制項繫結至此資料表。 項繫結至此資料表。

Page 15: ADO.NET  開發高手系列

透過資料配接器在資料集當中透過資料配接器在資料集當中建立資料表建立資料表 DataAdapter DataAdapter 物件(資料配接器)擔任 物件(資料配接器)擔任 DD

ataSet ataSet 物件與資料來源間的橋樑。物件與資料來源間的橋樑。 IDataAdapter IDataAdapter 介面介面 IDbDataAdapter IDbDataAdapter 介面介面

請視需要使用一或多個資料配接器。 請視需要使用一或多個資料配接器。

Page 16: ADO.NET  開發高手系列

透過資料配接器在資料集當中透過資料配接器在資料集當中建立資料表-實作流程建立資料表-實作流程1.1. 使用 使用 SqlDataAdapter SqlDataAdapter 建構函式建立資料建構函式建立資料

配接器物件。配接器物件。2.2. 將用來提取資料之 將用來提取資料之 SELECT SELECT 陳述式或預陳述式或預

存程序的名稱指派給資料配接器物件的 存程序的名稱指派給資料配接器物件的 SSelectCommandelectCommand 屬性。屬性。

3.3. 呼叫資料配接器的 呼叫資料配接器的 FillFill 方法,以便將所提方法,以便將所提取的資料列存入資料集當中對應的資料表取的資料列存入資料集當中對應的資料表內。 內。

Page 17: ADO.NET  開發高手系列

建立資料配接器物件建立資料配接器物件SqlDataAdapter SqlDataAdapter 建構函式的多載版本建構函式的多載版本

SqlDataAdapter()SqlDataAdapter()

SqlDataAdapter ( _SqlDataAdapter ( _ ByVal ByVal selectCommandselectCommand As As SqlCommandSqlCommand) ) SqlDataAdapter( _SqlDataAdapter( _ ByVal ByVal selectCommandTextselectCommandText As As StringString, _ , _ ByVal ByVal selectConnectionselectConnection As As SqlConnectionSqlConnection) ) SqlDataAdapter( _SqlDataAdapter( _ ByVal ByVal selectCommandTextselectCommandText As As StringString, _ , _ ByVal ByVal selectConnectionStringselectConnectionString As As StringString) )

Page 18: ADO.NET  開發高手系列

第一個多載版本的 第一個多載版本的 SqlDataASqlDataAdapter dapter 建構函式 建構函式

Dim limingDA As SqlDataAdapter = _Dim limingDA As SqlDataAdapter = _ New SqlDataAdapter New SqlDataAdapter

Page 19: ADO.NET  開發高手系列

第二個多載版本的 第二個多載版本的 SqlDataAdapter SqlDataAdapter 建構函建構函式式' ' 建立一個連接字串建立一個連接字串Dim strConnection As String = _Dim strConnection As String = _ "Server=(local)\NetSDK;Database="Server=(local)\NetSDK;Database= 北風貿易北風貿易 ;Integrated Security=SSPI";Integrated Security=SSPI"

' ' 建立一個查詢命令字串建立一個查詢命令字串Dim strSql As String = _ Dim strSql As String = _ "SELECT "SELECT 身份證字號身份證字號 ,,姓名姓名 ,,員工性別員工性別 ,,住家地址住家地址 ,,出生日期出生日期 " & _" & _ ",",目前薪資目前薪資 ,,部門部門 ,, 自傳 自傳 FROM FROM 飛狐工作室飛狐工作室 ""

' ' 建立一個資料連接建立一個資料連接Dim myConnection As SqlConnection = _Dim myConnection As SqlConnection = _ New SqlConnection(strConnection)New SqlConnection(strConnection)

' ' 建立一個 建立一個 SqlCommand SqlCommand 物件物件Dim selectCMD As SqlCommand = _Dim selectCMD As SqlCommand = _ New SqlCommand(strSql, myConnection)New SqlCommand(strSql, myConnection)

' ' 建立一個 建立一個 SqlDataAdapter SqlDataAdapter 物件物件Dim myDA As SqlDataAdapter = New SqlDataAdapter(selectCMD)Dim myDA As SqlDataAdapter = New SqlDataAdapter(selectCMD)

Page 20: ADO.NET  開發高手系列

第三個多載版本的 第三個多載版本的 SqlDataAdapter SqlDataAdapter 建構函建構函式式' ' 建立一個連接字串建立一個連接字串Dim strConnection As String = _Dim strConnection As String = _ "Server=(local)\NetSDK;Database="Server=(local)\NetSDK;Database= 北風貿易北風貿易 ; " & _; " & _ " Integrated Security=SSPI"" Integrated Security=SSPI"

' ' 建立一個查詢命令字串建立一個查詢命令字串Dim strSql As String = _Dim strSql As String = _ "SELECT "SELECT 身份證字號身份證字號 ,,姓名姓名 ,,員工性別員工性別 ,,住家地址住家地址 , " & _, " & _ ""出生日期出生日期 ,,目前薪資目前薪資 ,,部門部門 ,, 自傳 自傳 FROM FROM 飛狐工作室飛狐工作室 ""

' ' 建立一個資料連接建立一個資料連接Dim myConnection As SqlConnection = _Dim myConnection As SqlConnection = _ New SqlConnection(strConnection)New SqlConnection(strConnection)

' ' 建立一個 建立一個 SqlDataAdapter SqlDataAdapter 物件物件Dim myDA As SqlDataAdapter = _Dim myDA As SqlDataAdapter = _ New SqlDataAdapter(strSql, myConnection)New SqlDataAdapter(strSql, myConnection)

Page 21: ADO.NET  開發高手系列

第四個多載版本的 第四個多載版本的 SqlDataAdapter SqlDataAdapter 建構函建構函式式' ' 建立一個連接字串建立一個連接字串Dim strConnection As String = _Dim strConnection As String = _ "Server=(local)\NetSDK;Database="Server=(local)\NetSDK;Database= 北風貿易北風貿易 ; " & _; " & _ " Integrated Security=SSPI"" Integrated Security=SSPI"

' ' 建立一個查詢命令字串建立一個查詢命令字串Dim strSql As String = _Dim strSql As String = _ "SELECT "SELECT 身份證字號身份證字號 ,, 姓名姓名 ,, 員工性別員工性別 ,, 住家地址住家地址 , " & _, " & _ ""出生日期出生日期 ,, 目前薪資目前薪資 ,, 部門部門 ,, 自傳 自傳 FROM FROM 飛狐工作室飛狐工作室 ""

' ' 建立一個 建立一個 SqlDataAdapter SqlDataAdapter 物件物件Dim myDA As SqlDataAdapter = _Dim myDA As SqlDataAdapter = _ New SqlDataAdapter(strSql, strConnection)New SqlDataAdapter(strSql, strConnection)

Page 22: ADO.NET  開發高手系列

指派 指派 SELECT SELECT 陳述式或預存程序(陳述式或預存程序( 1/31/3 ))' ' 建立一個連接字串建立一個連接字串Dim strConnection As String = _Dim strConnection As String = _ "Server=(local)\NetSDK;Database="Server=(local)\NetSDK;Database= 北風貿易北風貿易 ;" & _;" & _ "Integrated Security=SSPI""Integrated Security=SSPI"

' ' 建立一個查詢命令字串建立一個查詢命令字串Dim strSql As String = _Dim strSql As String = _ "SELECT "SELECT 身份證字號身份證字號 ,,姓名姓名 ,,員工性別員工性別 ,,住家地址住家地址 , " & _, " & _ ""出生日期出生日期 ,,目前薪資目前薪資 ,,部門部門 ,, 自傳 自傳 FROM FROM 飛狐工作室飛狐工作室 ""

' ' 建立一個資料連接建立一個資料連接Dim myConnection As SqlConnection = _Dim myConnection As SqlConnection = _ New SqlConnection(strConnection)New SqlConnection(strConnection)

' ' 建立一個 建立一個 SqlDataAdapter SqlDataAdapter 物件物件Dim myDA As SqlDataAdapter = New SqlDataAdapterDim myDA As SqlDataAdapter = New SqlDataAdapter

' ' 建立一個使用建立一個使用 SELECTSELECT 陳述式來提取資料的陳述式來提取資料的 SqlCommandSqlCommand 物件物件Dim selectCMD As SqlCommand = _Dim selectCMD As SqlCommand = _ New SqlCommand(strSql, myConnection)New SqlCommand(strSql, myConnection)

' ' 將 將 SqlCommand SqlCommand 物件指派給 物件指派給 SqlDataAdapter SqlDataAdapter 物件物件' ' 的 的 SelectCommand SelectCommand 屬性屬性myDA.SelectCommand = selectCMDmyDA.SelectCommand = selectCMD

Page 23: ADO.NET  開發高手系列

指派 指派 SELECT SELECT 陳述式或預存程序(陳述式或預存程序( 2/32/3 ))' ' 建立一個連接字串建立一個連接字串Dim strConnection As String = _Dim strConnection As String = _ "Server=(local)\NetSDK;Database="Server=(local)\NetSDK;Database= 北風貿易北風貿易 ;" & _;" & _ "Integrated Security=SSPI""Integrated Security=SSPI"

' ' 建立一個資料連接建立一個資料連接Dim myConnection As SqlConnection = _Dim myConnection As SqlConnection = _ New SqlConnection(strConnection)New SqlConnection(strConnection)

' ' 建立一個 建立一個 SqlDataAdapter SqlDataAdapter 物件物件Dim myDA As SqlDataAdapter = New SqlDataAdapterDim myDA As SqlDataAdapter = New SqlDataAdapter

' ' 建立一個使用預存程序來提取資料的建立一個使用預存程序來提取資料的 SqlCommandSqlCommand 物件物件Dim selectCMD As SqlCommand = _Dim selectCMD As SqlCommand = _ New SqlCommand("dbo.RetrieveFoxEmployee", myConnection)New SqlCommand("dbo.RetrieveFoxEmployee", myConnection)

selectCMD.CommandType = CommandType.StoredProcedureselectCMD.CommandType = CommandType.StoredProcedure

' ' 將 將 SqlCommand SqlCommand 物件指派給 物件指派給 SqlDataAdapter SqlDataAdapter 物件物件' ' 的 的 SelectCommand SelectCommand 屬性屬性myDA.SelectCommand = selectCMDmyDA.SelectCommand = selectCMD

Page 24: ADO.NET  開發高手系列

指派 指派 SELECT SELECT 陳述式或預存程序(陳述式或預存程序( 3/33/3 ))

myDAmyDA..SelectCommandSelectCommand..CommandTextCommandText = _ = _

"" 要新套用的要新套用的 Transact-SQLTransact-SQL 陳述式陳述式 " & _" & _

"" 或預存程序的名稱或預存程序的名稱 ""

Page 25: ADO.NET  開發高手系列

呼叫資料配接器的 呼叫資料配接器的 Fill Fill 方法方法 Fill Fill 方法會使用 方法會使用 SelectCommand SelectCommand 屬性所指定屬性所指定

的 的 SELECT SELECT 陳述式或預存程序從資料來源擷取陳述式或預存程序從資料來源擷取資料列,並將所提取的資料列存入 資料列,並將所提取的資料列存入 DataSet DataSet 內內對應的資料表中。對應的資料表中。

如果資料集當中並如果資料集當中並不存在不存在對應的資料表, 對應的資料表, Fill Fill 方方法會先建立資料表然後再將資料列填入其中。法會先建立資料表然後再將資料列填入其中。

如果對應的資料表如果對應的資料表已經存在已經存在,則 ,則 Fill Fill 方法會以目方法會以目前所提取的資料列來前所提取的資料列來重新整理重新整理資料表的資料列,資料表的資料列,以便使其資料與資料來源中的資料一致。以便使其資料與資料來源中的資料一致。

Fill Fill 方法會視情況自動開啟與關閉連接。方法會視情況自動開啟與關閉連接。 所傳回之各個結果集的資料列分別存放於個別的所傳回之各個結果集的資料列分別存放於個別的

資料表中。 資料表中。

Page 26: ADO.NET  開發高手系列

SqlDataAdapter.Fill SqlDataAdapter.Fill 方法的方法的多載版本 多載版本 Fill(ByVal Fill(ByVal dataSetdataSet As As DataSetDataSet) As ) As IntegerInteger _ _ Implements IDataAdapter.Fill Implements IDataAdapter.Fill Fill(ByVal Fill(ByVal dataSetdataSet As As DataSetDataSet, _, _ ByVal ByVal srcTablesrcTable As As StringString) As ) As IntegerInteger Fill(ByVal Fill(ByVal dataSetdataSet As As DataSetDataSet, _ , _ ByVal ByVal startRecordstartRecord As As IntegerInteger, _ , _ ByVal ByVal maxRecordsmaxRecords As As IntegerInteger, _ , _ ByVal ByVal srcTablesrcTable As As StringString) As ) As IntegerInteger Fill(ByVal Fill(ByVal dataTabledataTable As As DataTableDataTable) As ) As IntegerInteger

Page 27: ADO.NET  開發高手系列

程式範例 程式範例 DemoForm2.vbDemoForm2.vb 示範如何使用 示範如何使用 SqlDataAdapter SqlDataAdapter 物件之第物件之第

二個多載版本的 二個多載版本的 Fill Fill 方法。方法。

Page 28: ADO.NET  開發高手系列

程式範例 程式範例 DemoForm3.vb DemoForm3.vb

示範如何使用 示範如何使用 SqlDataAdapter SqlDataAdapter 物件之第物件之第四個多載版本的 四個多載版本的 Fill Fill 方法。 方法。

Page 29: ADO.NET  開發高手系列

程式範例 程式範例 DemoForm4.vb DemoForm4.vb

示範如何使用 示範如何使用 SqlDataAdapter SqlDataAdapter 物件之第物件之第四個多載版本的 四個多載版本的 Fill Fill 方法將資料列填入一方法將資料列填入一個未隸屬於任何資料集的 個未隸屬於任何資料集的 DataTable DataTable 物件物件中。 中。

Page 30: ADO.NET  開發高手系列

程式範例 程式範例 DemoForm5.vbDemoForm5.vb

示範如何將所傳回的多個結果集分別填入示範如何將所傳回的多個結果集分別填入資料集當中的各個資料表。 資料集當中的各個資料表。

Page 31: ADO.NET  開發高手系列

程式範例 程式範例 DemoForm6.vb DemoForm6.vb

示範如何使用示範如何使用單一單一資料配接器來取得資料配接器來取得單一單一資料來源的資料來源的兩個兩個資料表。 資料表。

Page 32: ADO.NET  開發高手系列

程式範例 程式範例 DemoForm7.vb DemoForm7.vb

示範使用示範使用兩個兩個資料配接器來分別提取資料配接器來分別提取單一單一資料來源之資料來源之兩個兩個資料表的資料。 資料表的資料。

Page 33: ADO.NET  開發高手系列

程式範例 程式範例 DemoForm8.vbDemoForm8.vb

示範如何使用示範如何使用兩個兩個資料配接器分別從資料配接器分別從兩個兩個異質異質資料來源各取得資料來源各取得一個一個資料表並建立兩資料表並建立兩者間的關聯性連結。 者間的關聯性連結。

使用一個資料配接器從 使用一個資料配接器從 MSDE MSDE 的的「北風「北風貿易」貿易」資料庫取得資料庫取得「產品類別」「產品類別」資料表的資料表的資料列並置入資料集當中對應的資料表內,資料列並置入資料集當中對應的資料表內,並使用另外一個資料配接器從並使用另外一個資料配接器從 Access Access 資資料庫檔料庫檔「北風貿易「北風貿易 .mdb.mdb 」」中取得中取得「產品「產品資料」資料」資料表的資料列並置入資料集當中資料表的資料列並置入資料集當中對應的資料表內,然後再於資料集當中建對應的資料表內,然後再於資料集當中建立兩者的關聯性連結。 立兩者的關聯性連結。

Page 34: ADO.NET  開發高手系列

將現有的條件約束加入 將現有的條件約束加入 DataSetDataSet

Fill Fill 方法能夠重新整理資料列的先決條件:方法能夠重新整理資料列的先決條件: SQL SQL 陳述式務必與當初用來填入資料表的 陳述式務必與當初用來填入資料表的 SS

QL QL 陳述式陳述式完全相符完全相符。。 資料表務必擁有資料表務必擁有主索引鍵主索引鍵。。

填入 填入 DataSet DataSet 時一併加入資料來源上現有時一併加入資料來源上現有的主索引鍵條件約束:的主索引鍵條件約束: 先呼叫資料配接器的 先呼叫資料配接器的 FillSchemaFillSchema 方法,然方法,然

後才呼叫資料配接器的 後才呼叫資料配接器的 FillFill 方法。方法。 先將資料配接器的 先將資料配接器的 MissingSchemaActionMissingSchemaAction

屬性設定成 屬性設定成 AddWithKeyAddWithKey ,然後才呼叫資料,然後才呼叫資料配接器的 配接器的 FillFill 方法。 方法。

Page 35: ADO.NET  開發高手系列

程式範例 程式範例 DemoForm9.vb DemoForm9.vb

示範如何從 示範如何從 MSDE MSDE 之「北風貿易」資料之「北風貿易」資料庫的「章立民工作室」資料表提取資料,庫的「章立民工作室」資料表提取資料,它會它會沿用沿用來源資料表的結構描述以便使來源資料表的結構描述以便使「員工編號」「員工編號」欄位欄位自動自動成為一個成為一個自動編號自動編號欄位欄位並且被定義為主索引鍵。在資料集當並且被定義為主索引鍵。在資料集當中建立資料表之後,它還會中建立資料表之後,它還會另行另行將 將 UniquUniqueConstrainteConstraint 條件約束套用至「身份證字條件約束套用至「身份證字號」欄位,以確保此欄位不會發生重複的號」欄位,以確保此欄位不會發生重複的情形。 情形。

Page 36: ADO.NET  開發高手系列

資料表的前後端對應關係資料表的前後端對應關係 請透過 請透過 System.Data.Common System.Data.Common 命名空間中的 命名空間中的

DataTableMappingDataTableMapping 物件來完成。物件來完成。 使用資料配接器的 使用資料配接器的 TableMappings TableMappings 屬性來取得 屬性來取得

DataTableMappingCollectionDataTableMappingCollection ,並呼叫 ,並呼叫 DataTDataTableMappingCollection ableMappingCollection 的 的 Add Add 方法來加入一方法來加入一個 個 DataTableMapping DataTableMapping 物件。物件。

Add(ByVal Add(ByVal sourceTablesourceTable As String, _ As String, _ ByVal ByVal dataSetTabledataSetTable As String) As _ As String) As _ DataTableMappingDataTableMapping

簡例:簡例:Dim limingMap As DataTableMapping = _ Dim limingMap As DataTableMapping = _ limingDA.TableMappings.Add( _ limingDA.TableMappings.Add( _ " " 章立民工作室章立民工作室 ", "LimingStudio")", "LimingStudio")

Page 37: ADO.NET  開發高手系列

欄位的前後端對應關係欄位的前後端對應關係1.1. SelectCommand SelectCommand 屬性的查詢陳述式必須先將查詢結果屬性的查詢陳述式必須先將查詢結果

的欄位名稱設定成所需的名稱。例如:的欄位名稱設定成所需的名稱。例如:SELECT SELECT 員工編號員工編號 As As EmployeeIdEmployeeId,,身份證字號身份證字號 As As IdId FROM FROM 章立民工作室章立民工作室

2.2. 使用 使用 DataColumnMappingDataColumnMapping 物件來設定前後端欄位的物件來設定前後端欄位的對應關係,呼叫 對應關係,呼叫 DataColumnMappingCollection DataColumnMappingCollection 的 的 Add Add 方法以便於欄位對應集合中加入一個 方法以便於欄位對應集合中加入一個 DataColumnDataColumnMapping Mapping 物件:物件:

Add(ByVal sourceColumn As String, _Add(ByVal sourceColumn As String, _ ByVal dataSetColumn As String) As _ ByVal dataSetColumn As String) As _ DataColumnMapping DataColumnMapping

例如例如::

limingMap.ColumnMappings.AddlimingMap.ColumnMappings.Add("(" 員工編號員工編號 "", , "EmployeeId""EmployeeId"))limingMap.ColumnMappings.Add(limingMap.ColumnMappings.Add(""身份證字號身份證字號 "", , "Id""Id"))

Page 38: ADO.NET  開發高手系列

程式範例 程式範例 DemoForm10.vb DemoForm10.vb

示範當前端資料集資料表與後端來源資料示範當前端資料集資料表與後端來源資料表採用不同的資料表和欄位名稱時,該如表採用不同的資料表和欄位名稱時,該如何建立彼此的對應關係,以便確保當您呼何建立彼此的對應關係,以便確保當您呼叫資料配接器的 叫資料配接器的 FillFill 方法時,能夠順利以方法時,能夠順利以後端來源資料表的資料列去後端來源資料表的資料列去重新整理重新整理前端前端資料集資料表;反之,當您呼叫資料配接資料集資料表;反之,當您呼叫資料配接器的 器的 UpdateUpdate 方法時,亦能夠順利將前端方法時,亦能夠順利將前端資料集資料表的異動資料集資料表的異動寫回寫回後端來源資料表。後端來源資料表。

Page 39: ADO.NET  開發高手系列

建立資料表之間的關聯性連結建立資料表之間的關聯性連結1.1. 請先建立一個 請先建立一個 DataRelation DataRelation 物件。物件。2.2. 將步驟 將步驟 1 1 所建立的 所建立的 DataRelation DataRelation 物件加物件加

入資料集的 入資料集的 DataRelationCollection DataRelationCollection 中。中。可以透過 可以透過 DataSet DataSet 的 的 Relations Relations 屬性來屬性來存取 存取 DataRelationCollectionDataRelationCollection 。 。

3.3. 套用所需的條件約束。套用所需的條件約束。4.4. 重複步驟 重複步驟 1 1 至 至 3 3 的操作。的操作。

Page 40: ADO.NET  開發高手系列

程式範例 程式範例 DemoForm12.vb DemoForm12.vb

示範如何建立一個示範如何建立一個一對多介面一對多介面。在此介面。在此介面中,父資料表的一方(也就是中,父資料表的一方(也就是「產品類「產品類別」別」資料表)會使用各個 資料表)會使用各個 TextBox TextBox 控制控制項來顯示各個欄位的內容並透過一組導覽項來顯示各個欄位的內容並透過一組導覽按鈕來加以導覽,當您導覽產品類別的資按鈕來加以導覽,當您導覽產品類別的資料列時,與該產品類別相關聯的產品資料料列時,與該產品類別相關聯的產品資料便會顯示於 便會顯示於 DataGrid DataGrid 控制項中。 控制項中。

Page 41: ADO.NET  開發高手系列

程式範例 程式範例 DemoForm13.vb DemoForm13.vb

示範如何建立一個 示範如何建立一個 DataGrid DataGrid 對 對 DataGriDataGrid d 的一對多介面,也就是父資料表(此處的一對多介面,也就是父資料表(此處為「產品類別」資料表)與子資料表(此為「產品類別」資料表)與子資料表(此處為「產品資料」資料表)皆使用 處為「產品資料」資料表)皆使用 DataGDataGrid rid 控制項來顯示其資料列。 控制項來顯示其資料列。

Page 42: ADO.NET  開發高手系列

程式範例 程式範例 DemoForm14.vb DemoForm14.vb

示範如何建立一個一多對介面,特別之處示範如何建立一個一多對介面,特別之處在於,父子雙方各自擁有一組導覽按鈕,在於,父子雙方各自擁有一組導覽按鈕,具體提高資料的導覽彈性 。具體提高資料的導覽彈性 。

Page 43: ADO.NET  開發高手系列

程式範例 程式範例 DemoForm15.vbDemoForm15.vb

呼叫 呼叫 DataRow DataRow 物件的 物件的 GetChildRows GetChildRows 方法並將 方法並將 DataRelation DataRelation 物件傳遞給它,物件傳遞給它,便會傳回一個內含與該筆資料列相關聯之便會傳回一個內含與該筆資料列相關聯之各筆子資料列的 各筆子資料列的 DataRow DataRow 物件陣列。物件陣列。

呼叫 呼叫 DataRow DataRow 物件的 物件的 GetParentRow GetParentRow 方法將 方法將 DataRelation DataRelation 物件傳遞給它,則物件傳遞給它,則會傳回與該筆資料列相關聯的父資料列。 會傳回與該筆資料列相關聯的父資料列。

Page 44: ADO.NET  開發高手系列

建立外部索引鍵條件約束建立外部索引鍵條件約束 建立兩資料表之間的關聯性連結時就會自動建立建立兩資料表之間的關聯性連結時就會自動建立

並套用下列的條件約束:並套用下列的條件約束: 唯一條件約束(唯一條件約束( Unique ConstraintUnique Constraint )) 外部索引鍵條件約束(外部索引鍵條件約束( ForeignKey ConstraintForeignKey Constraint ))

請透過 請透過 DataTable DataTable 的 的 Constraints Constraints 屬性來存取 屬性來存取 ConstraintCollectionConstraintCollection (條件約束集合)。(條件約束集合)。

將某些多載版本的 將某些多載版本的 DataRelation DataRelation 建構函式或 建構函式或 DDataRelationCollection ataRelationCollection 之 之 Add Add 方法的 方法的 createcreateConstraintsConstraints 參數設定成 參數設定成 falsefalse ,則在建立關聯,則在建立關聯性連結時就不會自動建立唯一條件約束與外部索性連結時就不會自動建立唯一條件約束與外部索引鍵條件約束。 引鍵條件約束。

Page 45: ADO.NET  開發高手系列

自行建立外部索引鍵條件約束自行建立外部索引鍵條件約束1.1. 使用 使用 ForeignKeyConstraint ForeignKeyConstraint 建構函式來建構函式來

建立 建立 ForeignKeyConstraint ForeignKeyConstraint 物件。物件。2.2. 設定此 設定此 ForeignKeyConstraint ForeignKeyConstraint 物件的相物件的相

關屬性。關屬性。3.3. 將 將 ForeignKeyConstraint ForeignKeyConstraint 物件新增至 物件新增至 DD

ataTable ataTable 的 的 ConstraintCollection ConstraintCollection 中。中。

Page 46: ADO.NET  開發高手系列

ForeignKeyConstraint ForeignKeyConstraint 建構函式的多載版本建構函式的多載版本ForeignKeyConstraint( _ForeignKeyConstraint( _ ByVal parentColumn As DataColumn, _ ByVal parentColumn As DataColumn, _ ByVal childColumn As DataColumn) ByVal childColumn As DataColumn)

ForeignKeyConstraint( _ForeignKeyConstraint( _ ByVal parentColumns() As DataColumn, _ ByVal parentColumns() As DataColumn, _ ByVal childColumns() As DataColumn) ByVal childColumns() As DataColumn)

ForeignKeyConstraint( _ForeignKeyConstraint( _ ByVal constraintName As String, _ ByVal constraintName As String, _ ByVal parentColumn As DataColumn, _ ByVal parentColumn As DataColumn, _ ByVal childColumn As DataColumn) ByVal childColumn As DataColumn)

ForeignKeyConstraint( _ForeignKeyConstraint( _ ByVal constraintName As String, _ ByVal constraintName As String, _ ByVal parentColumns() As DataColumn, _ ByVal parentColumns() As DataColumn, _ ByVal childColumns() As DataColumn) ByVal childColumns() As DataColumn)

ForeignKeyConstraint( _ ForeignKeyConstraint( _ ByVal constraintName As String, _ ByVal constraintName As String, _ ByVal parentTableName As String, _ ByVal parentTableName As String, _ ByVal parentColumnNames() As String, _ ByVal parentColumnNames() As String, _ ByVal childColumnNames() As String, _ ByVal childColumnNames() As String, _ ByVal acceptRejectRule As AcceptRejectRule, _ ByVal acceptRejectRule As AcceptRejectRule, _ ByVal deleteRule As Rule, _ ByVal deleteRule As Rule, _ ByVal updateRule As Rule) ByVal updateRule As Rule)

Page 47: ADO.NET  開發高手系列

程式範例 程式範例 DemoForm16.vbDemoForm16.vb

示範如何建立「客戶」與「訂貨主檔」兩示範如何建立「客戶」與「訂貨主檔」兩資料表的關聯性連結,並列出所自動建立資料表的關聯性連結,並列出所自動建立之唯一條件約束與外部索引鍵條件約束的之唯一條件約束與外部索引鍵條件約束的相關資訊。 相關資訊。

Page 48: ADO.NET  開發高手系列

程式範例 程式範例 DemoForm17.vb DemoForm17.vb

與前一個程式範例 與前一個程式範例 DemoForm16.vb DemoForm16.vb 最最主要的差異,是它在建立「客戶」與「訂主要的差異,是它在建立「客戶」與「訂貨主檔」兩資料表的關聯性連結時會要求貨主檔」兩資料表的關聯性連結時會要求不要自動建立條件約束,而會自行替「客不要自動建立條件約束,而會自行替「客戶」資料表(也就是父資料表)建立唯一戶」資料表(也就是父資料表)建立唯一條件約束並且替「訂貨主檔」資料表(也條件約束並且替「訂貨主檔」資料表(也就是子資料表)建立外部索引鍵條件約束。就是子資料表)建立外部索引鍵條件約束。

Page 49: ADO.NET  開發高手系列

如何使用外部索引鍵條件約束如何使用外部索引鍵條件約束 ForeignKeyConstraint ForeignKeyConstraint 的 的 DeleteRuleDeleteRule 和 和 UpdateRulUpdateRul

ee 屬性定義當使用者嚐試刪除或更新關聯資料表中的資屬性定義當使用者嚐試刪除或更新關聯資料表中的資料列時所要採取的動作。料列時所要採取的動作。

DeleteRule DeleteRule 和 和 UpdateRule UpdateRule 屬性的型別都是 屬性的型別都是 RuleRule 列列舉型別:舉型別: CascadeCascade SetNullSetNull SetDefaultSetDefault NoneNone

如果 如果 DataSet DataSet 擁有 擁有 ForeignKeyConstraintsForeignKeyConstraints ,則當您,則當您針對針對父父資料列呼叫 資料列呼叫 AcceptChanges AcceptChanges 或 或 RejectChangeRejectChanges s 方法時,將根據 方法時,將根據 ForeignKeyConstraint ForeignKeyConstraint 之 之 AcceptAcceptRejectRuleRejectRule 屬性的設定來決定要針對屬性的設定來決定要針對子子資料列執行哪些資料列執行哪些操作,此屬性的型別是 操作,此屬性的型別是 AcceptRejectRule AcceptRejectRule 列舉型別:列舉型別: CascadeCascade NoneNone

DataSet DataSet 的 的 EnforceConstraintsEnforceConstraints 屬性。屬性。

Page 50: ADO.NET  開發高手系列

取得與設定資料配接器之命令的參數(取得與設定資料配接器之命令的參數( 1/21/2 )) 指派給資料配接器之 指派給資料配接器之 SelectCommandSelectCommand

屬性的 屬性的 Transact-SQL Transact-SQL 陳述式或預存程序陳述式或預存程序用來從資料來源提取資料以便填入資料集,用來從資料來源提取資料以便填入資料集,您必須先設定資料配接器 您必須先設定資料配接器 SelectCommanSelectCommand d 屬性,才能呼叫資料配接器的 屬性,才能呼叫資料配接器的 FillFill 方法。方法。

指派給資料配接器之 指派給資料配接器之 InsertCommandInsertCommand 、、DeleteCommandDeleteCommand 與 與 UpdateCommandUpdateCommand 屬性的 屬性的 Transact-SQL Transact-SQL 陳述式或預存程序陳述式或預存程序則是用來新增、刪除、與更新資料來源中則是用來新增、刪除、與更新資料來源中的資料。您也必須先設定資料配接器的 的資料。您也必須先設定資料配接器的 InInsertCommandsertCommand 、、 DeleteCommand DeleteCommand 或或 UUpdateCommand pdateCommand 屬性,才能呼叫資料配屬性,才能呼叫資料配接器的 接器的 UpdateUpdate 方法。方法。

Page 51: ADO.NET  開發高手系列

取得與設定資料配接器之命令的參數(取得與設定資料配接器之命令的參數( 2/22/2 )) 參數的使用情況:參數的使用情況:

選取參數選取參數 在 在 SELECT SELECT 陳述式的 陳述式的 WHERE WHERE 子句中使用一或多個參數來子句中使用一或多個參數來動態篩選出所需的資料列。動態篩選出所需的資料列。

於執行階段將參數值指派給 於執行階段將參數值指派給 WHERE WHERE 子句中的參數。 子句中的參數。 例如:例如:

SELECT * FROM SELECT * FROM 章立民工作室 章立民工作室 WHERE WHERE 姓名姓名 = @Name= @Name 更新參數更新參數

UpdateCommandUpdateCommand 、、 InsertCommandInsertCommand 與與 DeleteCommanDeleteCommand d 屬性的命令都固定會內含參數。屬性的命令都固定會內含參數。

INSERT INTOINSERT INTO 章立民工作室 章立民工作室 (( 身份證字號身份證字號 , , 姓名姓名 , , 地址地址 )) VALUES ( VALUES (@Id@Id, , @Name@Name, , @Address@Address) )

UPDATEUPDATE 章立民工作室 章立民工作室 SET SET 姓名 姓名 = = @Name@Name WHERE WHERE 身份證字號 身份證字號 = = @Id @Id

DELETE FROMDELETE FROM 章立民工作室 章立民工作室 WHERE WHERE 身份證字號 身份證字號 = = @Id@Id

SQL Server .NET Framework SQL Server .NET Framework 資料提供者一定資料提供者一定要使用以 要使用以 @@ 符號開始的具名參數。符號開始的具名參數。

Page 52: ADO.NET  開發高手系列

取得與設定 取得與設定 Transact-SQL Transact-SQL 陳述式的參數陳述式的參數

1.1. 於參數集合(於參數集合( SqlParameterCollectionSqlParameterCollection )中替)中替每一個參數加入一個參數物件(每一個參數加入一個參數物件( SqlParameteSqlParameterr )。)。

2.2. 指定參數的名稱以及參數所對應之欄位的資料型指定參數的名稱以及參數所對應之欄位的資料型別與長度。別與長度。

3.3. 如果是 如果是 InsertCommandInsertCommand 、、 UpdateCommand UpdateCommand 與 與 DeleteCommand DeleteCommand 還必須再設定參數的對應還必須再設定參數的對應欄位。 欄位。

4.4. 設定參數的值。設定參數的值。 請使用 請使用 SqlParameter SqlParameter 的 的 Value Value 屬性來設定 屬性來設定 SelecSelec

tCommand tCommand 命令中的參數值。 命令中的參數值。 對 對 InsertCommandInsertCommand 、、 UpdateCommand UpdateCommand 與與 DeletDelet

eCommand eCommand 命令而言,您應該指定參數與資料集資命令而言,您應該指定參數與資料集資料表欄位的對應關係以便讓 料表欄位的對應關係以便讓 ADO.NET ADO.NET 自動替您設自動替您設定參數值。 定參數值。

Page 53: ADO.NET  開發高手系列

程式範例 程式範例 DemoForm18.vb DemoForm18.vb

示範如何設定資料配接器的 示範如何設定資料配接器的 SelectCommSelectCommandand 、、 InsertCommandInsertCommand 、、 UpdateComUpdateCommand mand 與 與 DeleteCommand DeleteCommand 屬性,以便屬性,以便從資料來源篩選出特定的資料子集來存放從資料來源篩選出特定的資料子集來存放於用戶端資料集當中,並將您於資料集所於用戶端資料集當中,並將您於資料集所做的資料異動寫回資料來源。 做的資料異動寫回資料來源。

Page 54: ADO.NET  開發高手系列

程式範例 程式範例 DemoForm19.vb DemoForm19.vb

示範如何設定資料配接器的 示範如何設定資料配接器的 SelectCommSelectCommandand 、、 InsertCommandInsertCommand 、、 UpdateComUpdateCommand mand 與 與 DeleteCommand DeleteCommand 屬性,以便屬性,以便從資料來源篩選出特定的資料子集來存放從資料來源篩選出特定的資料子集來存放於用戶端資料集當中,並將您於資料集所於用戶端資料集當中,並將您於資料集所做的資料異動寫回資料來源。 做的資料異動寫回資料來源。 DemoFormDemoForm19.vb 19.vb 與 與 DemoForm18.vb DemoForm18.vb 最大的不同,最大的不同,就是 就是 DemoForm19.vb DemoForm19.vb 是透過逐筆導覽是透過逐筆導覽的方式來存取下載至資料集當中的資料,的方式來存取下載至資料集當中的資料,並且允許您編輯「玉照」欄位的內容。 並且允許您編輯「玉照」欄位的內容。

Page 55: ADO.NET  開發高手系列

結束結束 別忘了定期上下列網站:別忘了定期上下列網站:

MSDN MSDN 中文網站中文網站http://www.microsoft.com/taiwan/msdn/http://www.microsoft.com/taiwan/msdn/

微軟技術社群網站微軟技術社群網站http://www.microsoft.com/taiwan/communityhttp://www.microsoft.com/taiwan/community

微軟最有價值專家 微軟最有價值專家 MVPMVPMicrosoft Most Valuable ProfessionalsMicrosoft Most Valuable Professionals 微軟爲什麼要選拔 微軟爲什麼要選拔 MVP MVP 誰可以申請為微軟最有價值專家(誰可以申請為微軟最有價值專家( MVPMVP ) )

下集再會下集再會