转自【转的也是转的】【http://blog.csdn.net/fox123871/article/details/8637839】

1. 概述
  
  很多正在开发或者打算开发XML Web Services的程序员都问过这样的一个问题:"我的WebService返回的结果是一个DataSet类型的对象,但如果我的客户端不是用.NET写的(因而没有内建的DataSet类型),那该如何调用这个WebService并访问DataSet中的数据呢?"。
  
  对于这个问题,首先应该说的是:1)在多种语言共存的编程环境下,是不适合使用类似DataSet这种只属于特定语言的数据类型的。不管是在XMLWebServices还是CORBA的环境中,都应该尽量使用简单数据类型以及简单数据类型的数组。2)应当很谨慎的决定是否需要通过WebService来返回大量数据。由于网络传输的开销既包括HTTP连接建立的时间,也包括传送数据的时间,因此需要在减少访问服务器次数和减少网络传输量之间寻找一个合适的平衡。如非必须,则不适合通过WebService传送含有几十条或者几百条数据的数据表。
  
  然后,就问题本身而言,.NET WebServices返回的DataSet类型是可以直接被其他非.NET的客户端解析的,因为即便是DataSet类型的返回值,也会被表达成XML格式再进行传输。下面的例子就是一个返回类型为DataSet的WebMethod,及其被调用后返回的XML格式数据:
  
  表1. 返回类型为DataSet的Web Method

 [WebMethod]
  public DataSet GetPersonData()
  {
  DataTable table=new DataTable("Person");
  table.Columns.Add("Name");
  table.Columns.Add("Gender");
  table.Rows.Add(new string[]{"Alice","Female"});
  table.Rows.Add(new string[]{"Bob","Male"});
  table.Rows.Add(new string[]{"Chris","Male"});
  
  DataSet dataset=new DataSet("PersonTable");
  dataset.Tables.Add(table);
  return dataset;
  }

表2. 被格式化成XML的DataSet

 <?xml version="1.0"encoding="utf-8"?>
  <DataSetxmlns="http://tempuri.org/">
  <xs:schema id="PersonTable" xmlns=""xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
  <xs:element name="PersonTable"msdata:IsDataSet="true" msdata:Locale="zh-CN">
  <xs:complexType>
  <xs:choicemaxOccurs="unbounded">
  <xs:element name="Person">
  <xs:complexType>
  <xs:sequence>
  <xs:element name="Name" type="xs:string"minOccurs="" />
  <xs:element name="Gender" type="xs:string"minOccurs="" />
  </xs:sequence>
  </xs:complexType>
  </xs:element>
  </xs:choice>
  </xs:complexType>
  </xs:element>
  </xs:schema>
  <diffgr:diffgramxmlns:msdata="urn:schemas-microsoft-com:xml-msdata"
  xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
  <PersonTable xmlns="">
  <Person diffgr:id="Person1" msdata:rowOrder=""diffgr:hasChanges="inserted">
  <Name>Alice</Name>
  <Gender>Female</Gender>
  </Person>
  <Person diffgr:id="Person2" msdata:rowOrder=""diffgr:hasChanges="inserted">
  <Name>Bob</Name>
  <Gender>Male</Gender>
  </Person>
  <Person diffgr:id="Person3" msdata:rowOrder=""diffgr:hasChanges="inserted">
  <Name>Chris</Name>
  <Gender>Male</Gender>
  </Person>
  </PersonTable>
  </diffgr:diffgram>
  </DataSet>

  从上面的例子可以看出,直接使用DataSet作为返回类型,其结果是相当复杂的,其中不但包含了DataSet中的数据,还包括了数据更改的信息,以及DataSet的Schema。虽然有些工具能够生成一个类似DataSet的客户端类型,但无论是直接解析复杂的XML还是使用类似DataSet的类,都不够直接不够清晰。

  解决这个问题的方案有两种:
  
  1)用简单数据类型构造自定义类型,用每一个自定义类型对象封装数据集中的一行,将自定义类型对象的数组(Array)返回客户端;由于是用简单数据类型定义,客户端能够完全不变的还原出自定义类型的定义;
  
  2)用DataSet.WriteXML()方法将数据集中的数据提取成XML格式,并以字符串的形式返回给客户端,再由客户端解析XML字符串,还原出数据。由于使用WriteXML()的时候能够过滤掉冗余信息,返回的内容和图表2中的内容相比大大简化了。
  
  2. 创建.NET Web Services,返回数据集合
  
  借助于Visual Studio.NET,只需编写Web Method本身的代码,即可非常快速的创建可以实用的WebServices:
  
  表3. 用.NET实现的XML Web Services

 [WebMethod]
  public Person[] GetPersons()
  {
   Person Alice=newPerson("Alice","Female");
   Person Bob=newPerson("Bob","Male");
   Person Chris=newPerson("Chris","Female");
   Person Dennis=newPerson("Dennis","Male");
  
   return newPerson[]{Alice,Bob,Chris,Dennis};
  }
  
  [WebMethod]
  public string GetPersonTable()
  {
   DataTabletable=new DataTable("Person");
   table.Columns.Add("Name");
   table.Columns.Add("Gender");
   table.Rows.Add(new string[]{"Alice","Female"});
   table.Rows.Add(new string[]{"Bob","Male"});
   table.Rows.Add(new string[]{"Chris","Female"});
   table.Rows.Add(new string[]{"Dennis","Male"});
   table.Rows.Add(newstring[]{"Eric","Male"});
  
   DataSetdataset=new DataSet("PersonTable");
   dataset.Tables.Add(table);
  
   System.Text.StringBuilderstrbuilder=new System.Text.StringBuilder();
   StringWriter writer=new StringWriter(strbuilder);
   dataset.WriteXml(writer,System.Data.XmlWriteMode.IgnoreSchema);
  
   returnstrbuilder.ToString();
  }

  在上面的代码中,函数GetPersons()和GetPersonTable()分别对应于"1.概述"中所提到的两种解决方案。其中,Person类型就是用于封装数据集中一行数据的自定义的数据类型:
  
  表4. 自定义类型Person

 [Serializable]
  public class Person
  {
   public Person()
   {
   }
  
   public Person(stringname,string gender)
   {
   this.Name=name;
   this.Gender=gender;
   }
  
   public string Name="";
   public stringGender="";
  }

【转】java 访问.net webservice返回的数据集的更多相关文章

  1. java使用POST发送soap报文请求webservice返回500错误解析

    本文使用JAX-WS2.2编译webservice,并使用HttpUrlConnection的POST方式对wsdl发送soap报文进行请求返回数据, 对错误Server returned HTTP ...

  2. 如何解析android访问webservice返回的SoapObject数据(可用)

    怎么解析android访问webservice返回的SoapObject数据 本帖最后由 kkDragon123 于 2013-03-26 15:50:07 编辑 我的数据如下:mingdanResp ...

  3. delphi调用java编写的webservice

    delphi调用java编写的webservice JAVApojo: public class GroupInfo implements Serializable{    private stati ...

  4. Android 登陆功能的实现(访问WebServices 解析返回的JSON结果)

    1. WebServices返回的JSON结果 { , "Result": [{ ", ", ", " }] } 2.访问WEB服务代码 i ...

  5. Java MyBatis 插入数据库返回主键

    最近在搞一个电商系统中由于业务需求,需要在插入一条产品信息后返回产品Id,刚开始遇到一些坑,这里做下笔记,以防今后忘记. 类似下面这段代码一样获取插入后的主键 User user = new User ...

  6. mysql procedure返回多数据集

    返回多数据集写法:第一种 DROP PROCEDURE IF EXISTS `p_query_user` ; DELIMITER // CREATE PROCEDURE p_query_user( p ...

  7. Java调用.Net WebService参数为空解决办法 (远程)调试webservice方法 转

    Java调用.Net WebService参数为空解决办法 (远程)调试webservice方法   同事遇到一个很囧的问题,java调,netwebservice的时候,调用无参数方法成功,调用有参 ...

  8. Java动态调用webService,axis2动态调用webService

    Java动态调用webService axis2动态调用webService >>>>>>>>>>>>>>>& ...

  9. JQuery请求WebService返回数据的几种处理方式

    打开自己的博客仔细浏览了一番,发现已经好久没有写博客了,由于最近一直比较忙碌懈怠了好多.默默反省三分钟.......言归正传,现在就对最近在学习webservice的过程中遇到的几种类型的问题中我的理 ...

随机推荐

  1. 最大公约数Greatest Common Divisor(GCD)

    一 暴力枚举法 原理:试图寻找一个合适的整数i,看看这个整数能否被两个整形参数numberA和numberB同时整除.这个整数i从2开始循环累加,一直累加到numberA和numberB中较小参数的一 ...

  2. transactionCurrencyId needs to be supplied to format a transaction money field.

    问题背景: 在CRM 4 表单中加入了自定义的,money类型的字段,如果就报错 解决方法:要显示金额类型的字段时,要保证 entity 的 TransactionCurrencyId 这个字段中是有 ...

  3. 微信JSSDK上传多张图片

    之前是使用for循环实现的,但是安卓手机没有问题,苹果手机只能上传最后一张图片. 好在有高手在前面趟路,实用的循环调用.苹果是没有,安卓不清楚.以下内容转自:http://leo108.com/pid ...

  4. Eclipse Android HH and theme

    一. 汉化方法: 1.Eclipse版本查询:安装目录readme,查版本号;参照查代号如下表: 代号 平台版本 项目 主要版本发行日期 SR1发行日期 SR2发行日期 N/A 3.0 [1] N/A ...

  5. AIX 下某些日志定时清空

    最近发现weblogic proxy日志一直增加,达到18G把tmp空间撑满,导致系统无法访问,故设定时任务先拷贝后5000行日志做备份后清空proxy日志. vi wl_proxyclear.sh ...

  6. C++ primer 练习9.49

    如果一个字母延伸到中线之上,如d或f,则称其有上出头部分.如果一个字母延伸到中线之下,如p或g, 则称其有下出头部分.编写程序,读入一个单词,输出最长的即不包含上出头部分,也不包含下出头部分单 词. ...

  7. JQuery基础教程:事件(下)

     事件传播     为了说明不可单击的页面元素处理单击事件的能力,例如样式转换器中包含按钮的div元素或者兄弟元素h3,我们来实现一个鼠标指针进入元素和离开元素时的效果,首先需要添加一种翻转状态,表明 ...

  8. 在探索中感悟,在摸索中前进--ET之快递法

    飞测说:最近很多朋友问如果没有需求文档,我该怎么测试?我自然想起了探索测试,今天来说说自己在探索测试路上的一点点感悟-------快递测试法,让我们在探索中感悟,在摸索中前进-- 快递测试法,是从ET ...

  9. Begin using git (Part1) - Git的安装与配置

    Git提供了适用于Linux, Windows, OSX的客户端, 本节以Windows为例介绍基本安装与配置. 所需工具:msysgit, kdiff3. Get windows installer ...

  10. Perlin Noise 及其应用

    Perlin Noise 可以用来表现自然界中无法用简单形状来表达的物体的形态,比如火焰.烟雾.表面纹路等.要生成 Perlin Noise 可以使用工具离线生成,也可以使用代码运行时生成.最简单常用 ...