WCF分布式開發(fā)步步為贏(8)使用數(shù)據(jù)集(DataSet)數(shù)_第1頁(yè)
WCF分布式開發(fā)步步為贏(8)使用數(shù)據(jù)集(DataSet)數(shù)_第2頁(yè)
WCF分布式開發(fā)步步為贏(8)使用數(shù)據(jù)集(DataSet)數(shù)_第3頁(yè)
WCF分布式開發(fā)步步為贏(8)使用數(shù)據(jù)集(DataSet)數(shù)_第4頁(yè)
WCF分布式開發(fā)步步為贏(8)使用數(shù)據(jù)集(DataSet)數(shù)_第5頁(yè)
已閱讀5頁(yè),還剩5頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論