我这里有一个这里的网友以前写的一个帖子,我收藏的,希望对你有帮助。
相信很多人都有如此之困惑,得此解决方法不敢独享,公之于众,以利后来人。
声明:此方法的至于彭璐大侠,彭大侠可能不常上网,这麽好的方法也不告诉我等之小虾米,只好代劳了,彭大侠的email不便公开,应该是金蝶的人吧。
好了,不废话了,有两种方法:
1、用vector:
/**
>    * Finds all EJBeans with a balance greater than a given amount.
>    * Returns an Enumeration of found EJBean primary keys.
>    *
>    * @param balanceGreaterThan double Test Amount
>    * @return                   Enumeration EJBean Primary Keys
>    * @exception                javax.ejb.EJBException
>    *                           if there is a communications or systems failure
>    */
>   public Enumeration ejbFindBigAccounts(double balanceGreaterThan) {
>     log("ejbFindBigAccounts (balance > " + balanceGreaterThan + ")");
>     Connection con = null;
>     PreparedStatement ps = null;

>     try {
>       con = getConnection();
>       ps = con.prepareStatement("select id from ejbAccounts where bal > ?");
>       ps.setDouble(1, balanceGreaterThan);
>       ps.executeQuery();
>       ResultSet rs = ps.getResultSet();
>       Vector v = new Vector();
>       String pk;
>       while (rs.next()) {
>         pk = rs.getString(1);
>         v.addElement(pk);
>       }
>       return v.elements();
>     } catch (SQLException sqe) {
>       log("SQLException: " + sqe);
>       throw new EJBException (sqe);
>     } finally {
>       cleanup(con, ps);
>     }
>   }
结论:不爽,不方便。2、RowSet
RowSet tutorial chapter :
http://developer.java.sun.com/developer/Books/JDBCTutorial/chapter5.htmlrowset是个interface,需要有东西去实现它,sun的规范中给了三个class:cachedrowset,jdbcrowset,webrowset,如果去查jdk1.4 doc和j2skee1.2,有rowset,却没有那三个class,一般的开发工具(至少我的wsad)中也是这样,所以需要下jdbc2.0 opt-pack:
http://developer.java.sun.com/developer/earlyAccess/crs/下下来了再怎么办呢?
装呗!
怎么装呢?
setup呀!
没有呀?
啊,没setup呀,sun干什么吃的,连setup都不做个,也太懒了吧。
/////////////////////////////////
哎,我们确实是都被ms惯坏了,看到只有jar,没setup就没辙了,大家好好想想,java最大的特性是什么,就是它的类库可以自由扩充呀,现在明白该怎么做了吧:1、解包,得到rowset.jar,放在哪随您的意,别丢了就行。
2、在您的开发工具中增加一个路径,如:ROWSET_PATH对应:d:\jdk1.4\jre\rowset.jar(和1的路径对应就行)。
3、右键您的工程文件,出现:property(大多数工具应该都有吧),加上rowset_path。
4、在您的源文件中:import sun.jdbc.rowset.*;OK,搞定!下面就看您的了。(当然也可以把rowset压到jre里去)
应该说rowset(其实主要是CachedRowSet)真的是个好东西,和ms ado的resultset和borland的tclientset非常相似,最大的好处是Cache功能!
好了,看例子吧:
/////////////server端/////////////
package example4;import java.sql.*;
import javax.sql.*;
import sun.jdbc.rowset.*;
import javax.naming.*;
import javax.ejb.*;public class CoffeesBean implements SessionBean {   private SessionContext sc = null;
   private Context ctx = null;
   private DataSource ds = null;
   
   public CoffeesBean () {}
   
   public void ejbCreate() throws CreateException {       try {
           ctx = new InitialContext();
           ds = (DataSource)ctx.lookup("jdbc/CoffeesDB");
       }
       catch (Exception e) {
           System.out.println(e.getMessage());
           throw new CreateException();
       }
   }   public RowSet getCoffees() throws SQLException {
       
       Connection con = null;
ResultSet rs;
       CachedRowSet crs;       try {
           con = ds.getConnection("webCustomer", "webPassword");
           Statement stmt = con.createStatement();
           rs =  stmt.executeQuery("select * from coffees");
           
           crs = new CachedRowSet();
           crs.populate(rs);
           // the writer needs this because JDBC drivers
           // don't provide this meta-data.
           crs.setTableName("coffees");
           
           rs.close();
           stmt.close();
       } finally {
           if (con != null) 
               con.close();
       }
       return rset;
   }
   
   public updateCoffees(RowSet rs) throws SQLException {       Connection con = null;       try {
           CachedRowSet crs = (CachedRowSet)rs;
           con = ds.getConnection("webCustomer", "webPassword");
           // moves the changes back to the database
           crs.acceptChanges(con);
       } finally {
           if (con != null) 
               con.close();
       }
   }   //
   // Methods inherited from SessionBean
   //
   
   public void setSessionContext(SessionContext sc) {
       this.sc = sc;
   }
   
   public void ejbRemove() {}
   public void ejbPassivate() {}
   public void ejbActivate() {}   
}
//////////////////client端//////////////
package example4;import java.sql.*;
import javax.sql.*;
import sun.jdbc.rowset.*;
import javax.naming.*;
import javax.ejb.*;
import javax.rmi.*;class CoffeesClient {   public static void main(String[] args) {       try {
           // init the bean
           Context ctx = new InitialContext();
           Object obj = ctx.lookup("ejb/Coffees");
           CoffeesHome coffeesHome = (CoffeesHome)
               PortableRemoteObject.narrow(obj, CoffeesHome.class);
           Coffees coffees = coffeesHome.create();
           
           // get the rowset from the bean
           CachedRowSet rset = (CachedRowSet)coffees.getCoffees();           // find the Columbian coffee
           while (rset.next()) {
               String coffeeName = rset.getString("COF_NAME");
               if (coffeeName.equalsIgnoreCase(new String("Columbian"))) {
                   // columbian coffee has gone up 10%
                   rset.updateFloat("PRICE", 
                                    (float)(rset.getFloat("PRICE") * 1.10));
                   rset.updateRow();
               }
           }           // finally send the updated back to the bean...
           System.out.println("Calling update method");
           coffees.updateCoffees((RowSet)rset);
       }
       catch (Exception e) {
           System.out.println(e.getMessage());
       }
   }
}
例子很简单就不多讲了。
cheers.
Robin
12/27/2001Any question mailto:[email protected]

解决方案 »

  1.   

    http://www.csdn.net/Develop/Read_Article.asp?Id=11723
    介绍的是将ResultSet转换成sun.jdbc.CacheRowSet,然后反给客户端!
      

  2.   

    收藏.是个好例子。BTW:ResultSet不能回传客户是因为ResultSet对象非可序列化,只有实现java.io.Serializable接口的东西才能在RMI中传送,比如上例中的Vector
      

  3.   

    sun的文挡中有一个是关于J2EE的设计模式,其中一个讲的就是这个。你可以去看看
      

  4.   

    谢谢大家的回答,我没有查看以前的帖子,但是十分感谢wjmmml(笑着悲伤) 的摘录,我就是在寻找这种东东。