呵呵!你的要求好高呀!Java中的Resultset在.NET中没有对应的概念。所以,我建议你最好把Resultset转化为Java和.net都支持的数据类型,如Array等。

解决方案 »

  1.   

    对了,如果你可以转换为message style的话也可以呀!message style的意思就是直接传送xml对象,好像目前只支持org.w3c.dom.Document对象!
      

  2.   

    也就是说你如果可以把你的ResultSet转变为标准的xml对象,就可以直接传过去了!但是由于目前的axis只支持Dom,所以会有些限制,你的ResultSet不能太大!(不能几万条记录吧)
      

  3.   

    那有什么好的解决方法?那个MESSAGE STYLE是什么来的?在哪里可以下载?
      

  4.   

    不用下载,Axis就支持!详细的例子,你可以看看:axis\samples\message
      

  5.   

    也可以用RPC,全部把你的数据转换成一个String[]返回,给你一个简单的WebService DEMO:public class MyService
    {
       public String[] sayhello()
      {
        
        String[] sArr = {"one","two"};
        
        return sArr;
      }
    }
    就看你的.net客户端怎么去转换这个String[]类型为自己的的数据类型了,我也很想知道。
      

  6.   

    呵呵,上面的方法,我前面就说了呀!
    其实,你一定要做的话,可以参考一下MSDN里面的一个传ResultSet的例子。那里面详细说明了.NET的ResultSet的Xml表现形式。不管你使用什么样的载体(String[]也好,Object[]也好,直接使用xml也好)你都必须在服务端或者Client把它转换成对方能够识别的类型。这还是有一定难度的。加油呀!有什么成果大家分享一下,可好?hehe
      

  7.   

    我认为这种转换成公共认识的类型,必需要一个统一的标准文档才行,是不是WSDL文档呀???
    比如现在的情况是Web Service是JAVA的,它部署了,生成一个WSDL文档,而.net客户端调用这个Web Service时,完成不想知道是什么语言写的,它只参考这个统一标准的WSDL文件,看它上面写的endpoint在哪,返回的数据类型是什么,它只要知道自己的什么数据类型和这个WSDL文件定义的数据类型匹配就行了,这样岂不是问题都解决了。我没有实践过,只是这样想的,不知道对不对。
      

  8.   

    对!同意pstone2002(一只特立独行的猪)
      

  9.   

    我现在发布一个WSDL文件,看谁马上做一个.net客户端,根据我这个文件的描述来访问我的WEB SERVICE,在线等待
    <?xml version="1.0" encoding="UTF-8" ?> 
    - <wsdl:definitions targetNamespace="http://218.97.169.38/services/MyService" xmlns:impl="http://218.97.169.38/services/MyService-impl" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:intf="http://218.97.169.38/services/MyService" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://schemas.xmlsoap.org/wsdl/">
    - <types>
    - <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://218.97.169.38/services/MyService">
    - <complexType name="ArrayOf_xsd_string">
    - <complexContent>
    - <restriction base="SOAP-ENC:Array">
      <attribute ref="SOAP-ENC:arrayType" wsdl:arrayType="xsd:string[]" /> 
      </restriction>
      </complexContent>
      </complexType>
      <element name="ArrayOf_xsd_string" nillable="true" type="intf:ArrayOf_xsd_string" /> 
      </schema>
      </types>
    - <wsdl:message name="sayhelloResponse">
      <wsdl:part name="return" type="intf:ArrayOf_xsd_string" /> 
      </wsdl:message>
      <wsdl:message name="sayhelloRequest" /> 
    - <wsdl:portType name="MyService">
    - <wsdl:operation name="sayhello">
      <wsdl:input message="intf:sayhelloRequest" /> 
      <wsdl:output message="intf:sayhelloResponse" /> 
      </wsdl:operation>
      </wsdl:portType>
    - <wsdl:binding name="MyServiceSoapBinding" type="intf:MyService">
      <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" /> 
    - <wsdl:operation name="sayhello">
      <wsdlsoap:operation soapAction="" /> 
    - <wsdl:input>
      <wsdlsoap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://218.97.169.38/services/MyService" /> 
      </wsdl:input>
    - <wsdl:output>
      <wsdlsoap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://218.97.169.38/services/MyService" /> 
      </wsdl:output>
      </wsdl:operation>
      </wsdl:binding>
    - <wsdl:service name="MyServiceService">
    - <wsdl:port name="MyService" binding="intf:MyServiceSoapBinding">
      <wsdlsoap:address location="http://218.97.169.38/services/MyService" /> 
      </wsdl:port>
      </wsdl:service>
      </wsdl:definitions>
      

  10.   

    HEHE ,楼上的,只要用WSDL工具一搞,就可以在。NET的客户端生成代理类的拉,
    问题是我现在连JAVA端生成的RESULTSET也没搞出来。
      

  11.   

    唉~~~~~~ 
    我感觉大家目前对WebService的了解都仅限于基本概念和使用老外的工具这个层面上呀!
    不知道,有没有人写过Soap引擎或者Wsdl引擎呀!
      

  12.   

    不知道楼上所指的WSDL引擎是指怎么样的?
    解析还是需要生成Web Service Proxy?
    还是自动生成WSDL?
      

  13.   

    Wsdl Engine就是分析Wsdl文件的程序。有点类似Wsdl4j,但是我这里说的是动态的,不是Wsdl4j这样的静态的。
      

  14.   

    有呀!Axis自带的例子,都很不错!
      

  15.   

    To mdot() :
    如果你要直接序列化ResultSet,难度比较大,我建议你把ResultSet转化成HashMap或者数组试试!
      

  16.   

    例子就没有了,我可以给你说说我的思路:你在服务端写一个方法输入参数是ResultSet的对象,在这个函数里利用java.sql.*包里面的强大功能将结果一条一条取出,并且format为一个个的字符串,最后组成字符串数组,输出。你提供WebService的那个方法,就收来自.NET客户端的SQL参数,然后组成SQL语句,并且运行得到ResultSet作为参数传入上前面的方法,返回字符给.NET的客户端。
      

  17.   

    是不是这样public ResultSet aa(String sql)
    {
    .....查询数据库
      return rs(rs为RESULTSET)}public String bb(ResultSet rs)
    whilr (rs.next())
    String bb="";
    bb=.....将rs中字段组成字符串之后返回bb给。NET?那String 如果很长的话,会不会超界呢?
      

  18.   

    呵呵!只要的内存够大,String就不会超界。
      

  19.   

    下面是一个WEB SERVICE的JAVA客户端的例子,各位只要把它拷备后编译(要用AXIS包)后运行,就应该可以看到从远程服务器上返回的结果,你会惊讶分布式计算的简单,这里是一个加法函数,会返回3。如果要查看WSDL,请访问:http://218.97.169.38/services/MyService?wsdl
    import java.util.Vector;
    import org.apache.axis.client.Call;
    import org.apache.axis.client.Service;
    import javax.xml.rpc.namespace.QName;
    import org.apache.axis.encoding.XMLType;
     
    public class TestClient {
    public static void main(String [] args) 
    {
    try 
    {
    String endpoint = "http://218.97.169.38/services/MyService";
    Service  service = new Service();
    Call     call    = (Call) service.createCall();
    call.setTargetEndpointAddress( new java.net.URL(endpoint) );
    Float i = new Float(1);
    Float j = new Float(2);
    call.setOperationName( "add" );
    call.addParameter("i",org.apache.axis.encoding.XMLType.XSD_FLOAT,javax.xml.rpc.ParameterMode.PARAM_MODE_IN);
    call.addParameter("j",org.apache.axis.encoding.XMLType.XSD_FLOAT,javax.xml.rpc.ParameterMode.PARAM_MODE_IN);
    call.setReturnType( XMLType.XSD_FLOAT);
    Float ret = (Float)call.invoke( new Object[] {i,j} );
    System.out.println("Got result : " + ret);
    } catch (Exception e) {
    System.err.println(e.toString());
    }
    }
    }
    请试一试吧!
      

  20.   

    这里面有两个问题:
    1、ResultSet本身是不支持序列化的,这是因为ResultSet往往是与数据源绑定的。为了便于分布应用和ResultSet的存储,SUN发布了rowset包,其中的CachedRowSet就是对ResultSet的序列化实现类。使用起来极其方便和简单,rowset现在版本是rowset1.0ea4,发布包带有示例。
    2、你的应用跨跃了两种语言,虽然都是web services,但两种语言是不能互通对象的。我所能想到的最好办法是用xml来描述你的对象特征,幸运的是你要传递的对象恰恰是二维结果集对象,把结果集转化成xml这个技术已经有好多成熟技术在用了。如Oracle的XML SQL Utility等。
      

  21.   

    其实,方法肯定有的,上面说的都可以。问题是程序员要做多少工作。axis对于这种复杂类型根本无能为力,它只能提供一个优良框架,你还是必须用大量的代码来自己写序列化和反序列化的方法。(当然,这里没有反序列化,因为.NET Client传过来的String)。我觉得这种情况下就不适合使用WebService,显而易见,速度肯定慢,传输量也超大。我觉得CORBA跟加合适。不要太迷信WebService,它目前还处在一个初级阶段,只能支持一些简单类型。
      

  22.   

    什么序列化的工作都不要做,AXIS都帮你做了。
      

  23.   

    再给你一个DEMO吧,这个web service虽然是从EJB里取的数据,但原理和结果集是一样的,最后用DOM把这些数据转换成XML走SOAP过去,可以参考一下。
    ---------------------------------------------------------------------------------
    import org.w3c.dom.Element ;
    import org.apache.axis.MessageContext ;
    import org.apache.axis.Message ;
    import org.apache.axis.SOAPPart;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.parsers.DocumentBuilder;
    import org.w3c.dom.Document;import tradesources.emp.bannersystem.*;
    import java.util.Vector;
    import java.util.Collection;
    import java.util.Iterator;public class MessageService {
        
        public Element[] echoElements(MessageContext msgC, Vector elems) {
            try
            {
             Message m = msgC.getCurrentMessage();
             SOAPPart sp = m.getSOAPPart();
             sp.writeTo(System.out);
         }catch(Exception e){
         System.out.println(e);
         }
            
            Element[]  result = new Element[1];
            result[0] = getEjbData();
            return( result );
            
            /*
            Element[]  result = new Element[elems.size()];        for ( int i = 0 ; i < elems.size() ; i++ )
                result[i] = (Element) elems.get(i);
            
            return( result );
            */
        }
        
        public Element getEjbData()
        {
         try
    {
    java.util.Properties h = new java.util.Properties();
           h.put(javax.naming.Context.INITIAL_CONTEXT_FACTORY,"jrun.naming.JRunContextFactory");
           h.put(javax.naming.Context.PROVIDER_URL, "localhost:2909");
    javax.naming.InitialContext ctx = new javax.naming.InitialContext(h);
    Object obj = ctx.lookup("BannerSystemSession");
    BannerSystemSessionHome home = (BannerSystemSessionHome)javax.rmi.PortableRemoteObject.narrow(obj, BannerSystemSessionHome.class);
    BannerSystemSession bannerSystemSession = home.create();

    //find Collection

    String keyword = "1";
    int num = bannerSystemSession.findBannerInfo("STATUS='1'", "KEYWORD", keyword, null, null, null);
    System.out.println(num); String s  = bannerSystemSession.getConditionStr(1, "STATUS='1'", "KEYWORD", keyword, null, null, null, 0, num, "ID");
    System.out.println(s);
    Collection c= bannerSystemSession.findBannerInfo("STATUS='1'", "KEYWORD", keyword, null, null, null, 0, num, "ID");
    System.out.println("isNull?"+c.isEmpty());

    Iterator iterator = c.iterator();
    BannerSystemValue bv = null;

    //XML root element "ejbdata"
    DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
             Document doc            = builder.newDocument();   
    Element ejbdata = doc.createElement("ejbdata");

    while(iterator.hasNext())
    {
    //每个bannerInfo用来组装每个BannerSystemValue
    Element bannerInfo = doc.createElement("bannerInfo");

    bv = (BannerSystemValue)iterator.next();

    Element id = doc.createElement("id");
           id.appendChild(doc.createTextNode(bv.id));
           bannerInfo.appendChild(id);//添加id

    Element impressions = doc.createElement("impressions");
           impressions.appendChild(doc.createTextNode(bv.impressions));
           bannerInfo.appendChild(impressions);//添加impressions

    Element name = doc.createElement("name");
           name.appendChild(doc.createTextNode(bv.name));
           bannerInfo.appendChild(name);//添加name
          
    Element linkedUrl = doc.createElement("linkedUrl");
           linkedUrl.appendChild(doc.createTextNode(bv.linkedUrl));
           bannerInfo.appendChild(linkedUrl);//添加linkedUrl
          
           Element uri = doc.createElement("uri");
           uri.appendChild(doc.createTextNode(bv.uri));
           bannerInfo.appendChild(uri);//添加uri
          
           Element altText = doc.createElement("altText");
           altText.appendChild(doc.createTextNode(bv.altText));
           bannerInfo.appendChild(altText);//添加altText
          
           Element dimension = doc.createElement("dimension");
           dimension.appendChild(doc.createTextNode(bv.dimension));
           bannerInfo.appendChild(dimension);//添加dimension
          
               Element fileFormat = doc.createElement("fileFormat");
           fileFormat.appendChild(doc.createTextNode(bv.fileFormat));
           bannerInfo.appendChild(fileFormat);//添加fileFormat
          
           Element ekeyword = doc.createElement("keyword");
           ekeyword.appendChild(doc.createTextNode(bv.keyword));
           bannerInfo.appendChild(ekeyword);//添加keyword
          
           Element dateStart = doc.createElement("dateStart");
           dateStart.appendChild(doc.createTextNode(bv.dateStart));
           bannerInfo.appendChild(dateStart);//添加dateStart
          
           Element dateEnd = doc.createElement("dateEnd");
           dateEnd.appendChild(doc.createTextNode(bv.dateEnd));
           bannerInfo.appendChild(dateEnd);//添加dateEnd
          
           Element dataCreate = doc.createElement("dataCreate");
           dataCreate.appendChild(doc.createTextNode(bv.dataCreate));
           bannerInfo.appendChild(dataCreate);//添加dataCreate
          
           Element dateUpdate = doc.createElement("dateUpdate");
           dateUpdate.appendChild(doc.createTextNode(bv.dateUpdate));
           bannerInfo.appendChild(dateUpdate);//添加dateUpdate
             
           Element updateBy = doc.createElement("updateBy");
           updateBy.appendChild(doc.createTextNode(bv.updateBy));
           bannerInfo.appendChild(updateBy);//添加updateBy
          
           Element status = doc.createElement("status");
           status.appendChild(doc.createTextNode(bv.status));
           bannerInfo.appendChild(status);//添加status
                     
             ejbdata.appendChild(bannerInfo);
    }
    return ejbdata;


    }catch(Exception e){
    System.out.println(e);
    return null;
    }
        }
        
        /*
        public Message echoElements(MessageContext msgC,Vector elems) 
        {
         Message m = msgC.getCurrentMessage();
         return m;
        }
        */
    }