




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、WCF分布式開發(fā)步步為贏(8):使用數(shù)據(jù)集(DataSet)、數(shù)據(jù)表(DataTable)、集合(Collection)傳遞數(shù)據(jù) 所屬分類: WCF分布式開發(fā)步步為贏, SOA and EAI 數(shù)據(jù)集(DataSet)、數(shù)據(jù)表(DataTable)、集合(Collection)概念是.NET FrameWork里提供數(shù)據(jù)類型,在應(yīng)用程序編程過(guò)程中會(huì)經(jīng)常使用其來(lái)作為數(shù)據(jù)的載體,屬于ADO.NET的一部分。今天我們WCF分布式開發(fā)步步為贏第8節(jié)的內(nèi)容:使用數(shù)據(jù)集(DataSet)、數(shù)據(jù)表(DataTable)、集合(Collection)傳遞數(shù)據(jù)。本節(jié)內(nèi)容除了
2、介紹幾個(gè)類型概念外的,同樣會(huì)詳細(xì)給出代碼的實(shí)現(xiàn)過(guò)程。此外我們會(huì)分析這幾種數(shù)據(jù)類型的優(yōu)勢(shì)和缺點(diǎn),以及在面向?qū)ο蟮姆?wù)開發(fā)過(guò)程中如何解決這些問(wèn)題。(昨天博客園發(fā)布文章出錯(cuò),沒(méi)辦法只有現(xiàn)在重新發(fā)了,可惜我花了很久排版,沒(méi)保存成功,結(jié)果還是要重新組織。大家有好的方法可以介紹一下)【1】數(shù)據(jù)集(DataSet)、數(shù)據(jù)表(DataTable): 我們首先來(lái)介紹這兩個(gè)類型的相關(guān)概念,然后在介紹其在WCF應(yīng)用程序開發(fā)中的使用方式。【1.1】基本概念: 數(shù)據(jù)集(DataSet)、數(shù)據(jù)表(DataTable),相信大家都不回陌生,只要做過(guò)AD
3、O.NET進(jìn)行數(shù)據(jù)庫(kù)編程的開發(fā)人員來(lái)說(shuō),都會(huì)使用到這兩個(gè)類。DataSet 是 ADO.NET 結(jié)構(gòu)的主要組件,它是從數(shù)據(jù)源中檢索到的數(shù)據(jù)在內(nèi)存中的緩存。DataSet 由一組 DataTable 對(duì)象組成,您可使這些對(duì)象與 DataRelation 對(duì)象互相關(guān)聯(lián)。您還可通過(guò)使用 UniqueConstraint 和 ForeignKeyConstraint 對(duì)象在 DataSet 中實(shí)施數(shù)據(jù)完整性。有關(guān)使用 DataSet 對(duì)象的詳細(xì)信息,請(qǐng)參見(jiàn) 在 ADO.NET 中使用 DataSet。 盡管 DataTable 對(duì)象中包含數(shù)據(jù),但是 DataRela
4、tionCollection 允許您遍覽表的層次結(jié)構(gòu)。這些表包含在通過(guò) Tables 屬性訪問(wèn)的 DataTableCollection 中。當(dāng)訪問(wèn) DataTable 對(duì)象時(shí),請(qǐng)注意它們是按條件區(qū)分大小寫的。例如,如果一個(gè) DataTable 被命名為“mydatatable”,另一個(gè)被命名為“Mydatatable”,則用于搜索其中一個(gè)表的字符串被認(rèn)為是區(qū)分大小寫的。但是,如果“mydatatable”存在而“Mydatatable”不存在,則認(rèn)為該搜索字符串不區(qū)分大小寫。有關(guān)使用 DataTable 對(duì)象的更多信息,請(qǐng)參見(jiàn) 創(chuàng)建 DataTable。
5、DataSet 可將數(shù)據(jù)和架構(gòu)作為 XML 文檔進(jìn)行讀寫。數(shù)據(jù)和架構(gòu)可通過(guò) HTTP 傳輸,并在支持 XML 的任何平臺(tái)上被任何應(yīng)用程序使用。可使用 WriteXmlSchema 方法將架構(gòu)保存為 XML 架構(gòu),并且可以使用 WriteXml 方法保存架構(gòu)和數(shù)據(jù)。若要讀取既包含架構(gòu)也包含數(shù)據(jù)的 XML 文檔,請(qǐng)使用 ReadXml 方法。在典型的多層實(shí)現(xiàn)中,用于創(chuàng)建和刷新 DataSet 并依次更新原始數(shù)據(jù)的步驟包括: 1. 通過(guò) DataAdapter 使用數(shù)據(jù)源中的數(shù)據(jù)生成和填充 DataSet 中的每個(gè) DataTable。 2. 通過(guò)添加、更新或刪除 DataRow 對(duì)象更改單個(gè) Da
6、taTable 對(duì)象中的數(shù)據(jù)。 3. 調(diào)用 GetChanges 方法以創(chuàng)建只反映對(duì)數(shù)據(jù)進(jìn)行的更改的第二個(gè) DataSet。 4. 調(diào)用 DataAdapter 的 Update 方法,并將第二個(gè) DataSet 作為參數(shù)傳遞。 5. 調(diào)用 Merge 方法將第二個(gè) DataSet 中的更改合并到第一個(gè)中。 6. 針對(duì) DataSet 調(diào)用 AcceptChanges?;蛘?,調(diào)用 RejectChanges 以取消更改?!?.2】 DataSet 和 DataTable 對(duì)象從 MarshalByValueComponent 繼承而來(lái),并支持用于遠(yuǎn)程處理的
7、ISerializable 接口。這些是僅有的可以遠(yuǎn)程處理的 ADO.NET 對(duì)象。 我們先來(lái)看一下DataSet的定義,使用Reflector工具查看,部分代碼如下:Serializable, ToolboxItem("Microsoft.VSDesigner.Data.VS.DataSetToolboxItem, Microsoft.VSDesigner, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"),
8、60;DefaultProperty("DataSetName"), XmlSchemaProvider("GetDataSetSchema"), ResDescription("DataSetDescr"), XmlRoot("DataSet"), Designer("Microsoft.VSDesigner.Data.VS.DataSetDesigner, Microsoft.VSDesigner, Version=,
9、;Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")public class DataSet : MarshalByValueComponent, IListSource, IXmlSerializable, ISupportInitializeNotification, ISupportInitialize, ISerializable / Fields &
10、#160; private bool _caseSensitive; private CultureInfo _culture; private bool _cultureUserSet; private string _datasetPrefix; private object _defaultView
11、ManagerLock; private readonly int _objectID; private static int _objectTypeCount; private SerializationFormat _remotingFormat; private string dataSetName;
12、0; private DataViewManager defaultViewManager; private bool enforceConstraints; internal PropertyCollection extendedProperties; private bool fBoundToDocument;
13、0; internal bool fEnableCascading; internal bool fInitInProgress; DataTable的部分實(shí)現(xiàn)代碼如下:Serializable, Editor("Microsoft.VSDesigner.Data.Design.DataTableEditor, Microsoft.VSDesigner, Version=, Culture=neutral,
14、0;PublicKeyToken=b03f5f7f11d50a3a", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"), DefaultProperty("TableName"), DesignTimeVisible(false), ToolboxItem(false),
15、160;XmlSchemaProvider("GetDataTableSchema"), DefaultEvent("RowChanging")public class DataTable : MarshalByValueComponent, IListSource, ISupportInitializeNotification, ISupportInitialize, ISerializable, IXmlSerializable
16、 / Fields private bool _caseSensitive; private bool _caseSensitiveUserSet; internal DataColumn _colUnique; private CompareOptions _compareFlags;
17、160; private CompareInfo _compareInfo; 在WCF分布式應(yīng)用程序開發(fā)過(guò)程中,可以使用來(lái)作為數(shù)據(jù)契約類型,在服務(wù)和客戶端傳遞。兩者在定義之初都包含了Serializable聲明,因此兩者的對(duì)象都是可以序列化的。可以使用在客戶端和服務(wù)端傳遞數(shù)據(jù)?!?】集合(Collection): 集合也是我們編程開發(fā)中經(jīng)常使用的類型。【2.1】基本概念: .NET Framework 提供了用于數(shù)據(jù)存儲(chǔ)和檢索的專用類
18、。這些類提供對(duì)堆棧、隊(duì)列、列表和哈希表的支持。大多數(shù)集合類實(shí)現(xiàn)相同的接口,可繼承這些接口來(lái)創(chuàng)建適應(yīng)更為專業(yè)的數(shù)據(jù)存儲(chǔ)需要的新集合類。針對(duì) .NET Framework 的 2.0 版和更高版本的應(yīng)用程序應(yīng)當(dāng)使用 System.Collections.Generic 命名空間中的泛型集合類,與對(duì)應(yīng)的非泛型類相比,這些類提供了更高的類型安全性和效率。 集合類具有以下特點(diǎn):集合類定義為 System.Collections 或 System.Collections.Generic 命名空間的一部分。大多數(shù)集合類都派生自 ICollection、IComparer、
19、IEnumerable、IList、IDictionary 和 IDictionaryEnumerator 接口以及它們的等效泛型接口。使用泛型集合類可以提供更高的類型安全性,在某些情況下還可以提供更好的性能,尤其是在存儲(chǔ)值類型時(shí),這些優(yōu)勢(shì)會(huì)體現(xiàn)得更明顯。有關(guān)更多信息,請(qǐng)參見(jiàn)泛型的優(yōu)點(diǎn)。 如果將緊密相關(guān)的數(shù)據(jù)組合到一個(gè)集合中,則能夠更有效地處理這些緊密相關(guān)的數(shù)據(jù)。代替編寫不同的代碼來(lái)處理每一單獨(dú)的對(duì)象,您可以使用相同的調(diào)用代碼來(lái)處理一個(gè)集合的所有元素。若要管理集合,可使用 Array 類和 System.Collections 類添加、移除和修改該集合中的
20、個(gè)別元素或某一范圍內(nèi)的元素。甚至可以將整個(gè)集合復(fù)制到另一個(gè)集合中。某些 Collections 類具有排序功能并且大多數(shù)都有索引。自動(dòng)處理內(nèi)存管理,集合的容量會(huì)根據(jù)需要擴(kuò)展。當(dāng)訪問(wèn)集合成員時(shí)同步提供線程安全。某些 Collections 類可以生成包裝,這些包裝令集合是只讀的或固定大小的。任何 Collections 類都可以生成自己的枚舉數(shù),該枚舉數(shù)簡(jiǎn)化了對(duì)元素的循環(huán)訪問(wèn)。 在 .NET Framework 2.0 版中,泛型集合類提供了新功能,并且使得創(chuàng)建強(qiáng)類型集合變得容易。請(qǐng)參見(jiàn) System.Collections.Generic 和 System.Collec
21、tions.ObjectModel 命名空間。【2.2】集合數(shù)據(jù)契約: 集合有如此強(qiáng)大的特性,這也是我們使用的一個(gè)重要原因?!?】示例代碼分析: 下面我們來(lái)介紹一下使用Dataset、 Datatable和集合類來(lái)傳遞數(shù)據(jù)的程序開發(fā)過(guò)程。依次介紹服務(wù)契約、宿主、客戶端的開發(fā)配置過(guò)程,另外服務(wù)端設(shè)計(jì)了一個(gè)數(shù)據(jù)庫(kù),添加了部分演示數(shù)據(jù),目的是方便Demo?!?.1】服務(wù)契約: 服務(wù)契約定義了3個(gè)操作契約,分別是使用Dataset、Datatable、List來(lái)傳遞數(shù)據(jù),WCF服務(wù)類實(shí)現(xiàn)了接口定
22、義的操作契約,分別返回不同的數(shù)據(jù)結(jié)構(gòu)類型。具體代碼如下:/ServiceContract 屬性以及 Indigo 使用的所有其他屬性均在 System.ServiceModel 命名空間中定義,/因此本例開頭使用 using 語(yǔ)句來(lái)引用該命名空間。/為了掩飾WCF服務(wù)的操作重載namespace WCFService /1.服務(wù)契約,操作契約重載 ServiceContract
23、(Namespace = " interface IWCFService /操作契約,數(shù)據(jù)表 OperationContract System.Data.DataTable
24、 GetDataByTable(); /操作契約,數(shù)據(jù)集 OperationContract System.Data.DataSet GetDataByDataSet(); /操作契約,數(shù)據(jù)集合
25、; OperationContract List<User> GetDataByCollection(); /2.服務(wù)類,集成接口。實(shí)現(xiàn)契約 public class WCFService : IWCFService
26、60; /實(shí)現(xiàn)接口定義的方法,DataTable傳遞數(shù)據(jù) public System.Data.DataTable GetDataByTable()
27、160; /這里可以定義數(shù)據(jù)持久化操作,訪問(wèn)數(shù)據(jù)庫(kù)等 System.Data.DataSet dataSet = new System.Data.DataSet(); System.Data.DataTable dataTable =
28、 null; SqlConnection sqlConnection = new SqlConnection("Data Source=.SQLEXPRESS;AttachDbFilename=|DataDirectory|DatabaseDatabaseWCF.mdf;Integrated Security=True;User Instance=True"
29、;); try System.Data.SqlClient.SqlDataAdapter sqlDataAdapt
30、er = new System.Data.SqlClient.SqlDataAdapter("SELECT id, name, english_name FROM TableWCF", sqlConnection); sqlDataAdapter.Fill(dataSet, "T
31、ableWCF"); if (dataSet != null && dataSet.Tables.Count > 0)
32、; dataTable = dataSet.Tables0;
33、60; catch (Exception e)
34、0; finally sqlConnection.Close();
35、; Console.WriteLine("Calling WCF Service,Transfer data using DataTable"); return dataTable;
36、60; /實(shí)現(xiàn)接口定義的方法,DataSet傳遞數(shù)據(jù) public System.Data.DataSet GetDataByDataSet()
37、0; /這里可以定義數(shù)據(jù)持久化操作,訪問(wèn)數(shù)據(jù)庫(kù)等 System.Data.DataSet dataSet = new System.Data.DataSet(); SqlConnection sqlConnection&
38、#160;= new SqlConnection("Data Source=.SQLEXPRESS;AttachDbFilename=|DataDirectory|DatabaseDatabaseWCF.mdf;Integrated Security=True;User Instance=True"); try
39、160; System.Data.SqlClient.SqlDataAdapter sqlDataAdapter = new System.Data.SqlClient.SqlDataAdapter("SELECT id, name, english_name
40、;FROM TableWCF", sqlConnection); sqlDataAdapter.Fill(dataSet, "TableWCF");
41、; catch (Exception e) finally
42、; sqlConnection.Close(); &
43、#160; Console.WriteLine("Calling WCF Service,Transfer data using dataSet"); return dataSet;
44、60; /實(shí)現(xiàn)接口定義的方法,Collection傳遞數(shù)據(jù) public List<User> GetDataByCollection() /這里可以定義數(shù)據(jù)持久化操作,訪問(wèn)數(shù)據(jù)庫(kù)等
45、0; List<User> list = new List<User>(); for (int i = 0; i < 10; i+)
46、; User user = new User(); user.age = 2
47、0+i; = "Frank Xu Lei:" + i.ToString();
48、60; Console.WriteLine("Calling WCF Service,Transfer data using Collection"); return list;
49、; /3數(shù)據(jù)契約 DataContract public class User DataMember public string name;
50、; DataMember public int age; 【3.2】托管宿主: 托管宿主的配置過(guò)程與前幾節(jié)宿主類似,這里不在詳述,配置文件里契約和MEX原數(shù)據(jù)節(jié)點(diǎn)一定要配置,具體代碼如下:<services> <service behaviorConfigur
51、ation="WCFService.WCFServiceBehavior" name="WCFService.WCFService"> <endpoint address="http:/localhost:9003/WCFService"
52、0; binding="wsHttpBinding" contract="WCFService.IWCFService"> </endpoint> <
53、;endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> <host> <baseAddresses>
54、160; <add baseAddress="http:/localhost:9003/"/> </baseAddresses> </host> </service
55、> </services> <behaviors> <serviceBehaviors> <behavior name="WCFService.WCFServiceBehavior">
56、160; <serviceMetadata httpGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="false" /> </behavior>
57、; </serviceBehaviors> </behaviors>【3.4】客戶端: 宿主配置完畢,編譯運(yùn)行宿主程序,我們?cè)诳蛻舳颂砑臃?wù)的引用,輸入正確的元數(shù)據(jù)交換地址,查詢服務(wù),可以看到如下的操作查詢結(jié)果,如圖: 我們可以看到客戶端反序列化的本地類的信息。DataTable和DataSet使用的依然是.NET 類庫(kù)的類型。對(duì)應(yīng)的代理服務(wù)操作如下:
58、 public System.Data.DataTable GetDataByTable() return base.Channel.GetDataByTable();
59、; public System.Data.DataSet GetDataByDataSet() return base.Channel.GetDataByDataSet(); 但是我們定義的
60、集合操作在反序列化為客戶端操作以后以及發(fā)生了變化,客戶單使用數(shù)組代替了我們的集合List.代碼如下: public User GetDataByCollection() return base.Channel.GetDataByCollection();
61、0; WCF為集合類型提供了專屬的封送機(jī)制,客戶端發(fā)序列化的本地操作使用與之對(duì)應(yīng)的數(shù)組。【4】運(yùn)行結(jié)果: 這里客戶端使用了WinForm界面,借助DataGridView控件來(lái)顯示數(shù)據(jù),方便DEMO。分別綁定事件方法,通過(guò)客戶端服務(wù)代理,調(diào)用WCF操作服務(wù),獲取數(shù)據(jù)。代碼如下:/Get data using DataTable By WCF proxy private vo
62、id buttonDataTable_Click(object sender, EventArgs e) WCFServiceClient wcfServiceProxy =
63、0; new WCFServiceClient("WSHttpBinding_IWCFService"); /調(diào)用服務(wù),獲取數(shù)據(jù)表dataTable, System.Data.DataTable dataTable
64、160;= wcfServiceProxy.GetDataByTable(); if (dataTable != null) dataGridViewWCFDataTable.DataSource = dataTable;/綁定數(shù)據(jù)源到控件
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 華為合伙人持股合同范本
- 合同范本與格式條款
- 臺(tái)球前臺(tái)合同范例
- 雙方活動(dòng)協(xié)議合同范本
- 個(gè)人huan款合同范本
- 南文村拆遷合同范例
- 科技改變生活移動(dòng)奶茶店的科技應(yīng)用案例
- 制藥品采購(gòu)合同范例
- 臨時(shí)合同變更正式合同范本
- 2024-2025學(xué)年安徽省三市高二上學(xué)期聯(lián)考語(yǔ)文試卷
- 算力中心建設(shè)的技術(shù)要求
- 2024煤礦安全規(guī)程解讀
- 德州環(huán)鋰新能源科技有限公司2萬(wàn)噸年廢舊鋰電池回收項(xiàng)目環(huán)境影響報(bào)告書
- 2025年江蘇省中職《英語(yǔ)》學(xué)業(yè)水平考試核心考點(diǎn)試題庫(kù)500題(重點(diǎn))
- 延期實(shí)習(xí)申請(qǐng)書
- GB/T 1346-2024水泥標(biāo)準(zhǔn)稠度用水量、凝結(jié)時(shí)間與安定性檢驗(yàn)方法
- 2025年江蘇信息職業(yè)技術(shù)學(xué)院高職單招職業(yè)適應(yīng)性測(cè)試近5年??及鎱⒖碱}庫(kù)含答案解析
- 易制毒化學(xué)品理論考試試題及答案
- 2024年煙臺(tái)汽車工程職業(yè)學(xué)院高職單招職業(yè)適應(yīng)性測(cè)試歷年參考題庫(kù)含答案解析
- 2024年江西旅游商貿(mào)職業(yè)學(xué)院高職單招語(yǔ)文歷年參考題庫(kù)含答案解析
- IIT臨床醫(yī)學(xué)項(xiàng)目管理
評(píng)論
0/150
提交評(píng)論