把纪录集查询出来放到Vector,然后在页面显示。

解决方案 »

  1.   

    用Vector的效率不高,建议你采用其它方法
      

  2.   

    我习惯的封装方式是Hashtable+Vector的方式
    Hashtable里面的key是数据库字段的名字,Vector就是这个字段的数据
    要实现分页每次页面都要传参数给查询方法的,这样才可以知道取那些记录
    这是我写的一个程序,有兴趣可以参考一下。
      /**
         * 根据起SQL、始位置、记录数取得结果集
         * @param sql SQL语句
         * @param pageSize 页面大小,0表示不限制
         * @param pageth 当前页数
         * @return 装有结果集的Hashtable
         */
        public Hashtable query(String sql, String pageSize, String pageth){
            Hashtable resultH = new Hashtable();
            resultH.put("rowNum","0");
            SqlAccess dbOper = new SqlAccess(dsName);
            ResultSet rs = dbOper.prepareStatementQuery(sql);
            int rowNum = 0;
            try{
                if(rs != null){
                    ResultSetMetaData rsmd = rs.getMetaData();
                    int max = rsmd.getColumnCount();
                    //建立存储结果信息的数据结构
                    for(int i = 0 ; i < max ; i++){
                        resultH.put(rsmd.getColumnName(i+1),new Vector());
                    }
                    //处理分页信息
                    int iPageSize = Integer.parseInt(pageSize.trim());
                    int offset = 0;
                    //要分页
                    if(iPageSize != 0){
                        int iPageth = Integer.parseInt(pageth.trim());
                        offset = iPageSize*(iPageth - 1);
                        if(offset > 0){
                            rs.absolute(offset);
                        }
                        int rows = 0;
                        //装数据
                        Debug.println(resultH.toString());
                        while(rs.next() && rows < iPageSize){
                            for(int i = 0 ; i < max ; i++){
                                ((Vector)resultH.get(rsmd.getColumnName(i+1))).add(rs.getString(i+1).trim());
                            }
                            rows++;
                        }
                        if(rs.last()){
                            rowNum = rs.getRow();
                            resultH.put("rowNum",""+rowNum);
                        }
                    }
                    //不要分页
                    else{
                        //装数据
                        while(rs.next()){
                            for(int i = 0 ; i < max ; i++){
                                ((Vector)resultH.get(rsmd.getColumnName(i+1))).add(moiaString.unConvert(rs.getString(i+1)));
                            }
                        }
                    }
                }        }
            catch(SQLException e){
                e.printStackTrace();
            }
            catch(Exception e){
                e.printStackTrace();
            }
            finally{
                dbOper.close();
            }
            return resultH;
        }
      

  3.   

    to yeaker(易克方笑)   “用Vector的效率不高,建议你采用其它方法”
    那用什么效率高呀?可否探讨一下
      

  4.   

    用sql效率最高啊。这个话题很久就讨论过了。呵呵,查查以前的帖就有啊
      

  5.   

    用Vector的效率不高,建议你采用其它方法
    方法一,用sql语句,
    select top PageItem * from table where table_id not in (select top (PageCount-1)*PageItem from table)
    起思想就是取小于也数*每页数量的前(每页数量的结果),比如,取第三页20-30,就是取不再前20条的后面的10页。
    方法二是用sun.jdbc.rowset.Cachedrowset来操作数据库记录,据说这个工具的功能非常强大。
      

  6.   

    给你几个函数参考  private static String[] resultSetLabels(ResultSet R) throws SQLException {
        ResultSetMetaData rsmd = R.getMetaData();
        String S[] = new String[rsmd.getColumnCount()];
        for (int i = 0; i < S.length; i++) {
          S[i] = rsmd.getColumnLabel(i + 1);
        }
        return S;
      }  private static int resultSetColumnCount(ResultSet R) throws SQLException {
        ResultSetMetaData rsmd = R.getMetaData();
        return rsmd.getColumnCount();
      }  private static String[] resultSetTypes(ResultSet R) throws SQLException {
        ResultSetMetaData rsmd = R.getMetaData();
        String S[] = new String[rsmd.getColumnCount()];
        for (int i = 0; i < S.length; i++) {
          S[i] = rsmd.getColumnTypeName(i + 1);
        }
        return S;
      }  private static String[] resultRowValues(ResultSet R) throws SQLException {
        String S[] = new String[resultSetColumnCount(R)];
        for (int i = 0; i < S.length; i++) {
          S[i] = R.getString(i + 1);
        }
        return S;
      }  private static String[][] vectorToStringMatrix(Vector V) {
        // V is actually a vector of string-arrays.
        if (V == null || V.size() == 0) {
          String[][] R = new String[0][0];
          return R;
        }
        String[][] R = new String[V.size()][];
        for (int i = 0; i < R.length; i++) {
          R[i] = (String[]) (V.elementAt(i));
        }
        return R;
      }  private static String[][] resultRowsToStringMatrix(ResultSet R) {
        try {
          Vector V = new Vector(); // result
          // V.addElement(resultSetLabels(R)); // table header line
          while (R.next()) {
            V.addElement(resultRowValues(R));
          }
          R.close();
          return vectorToStringMatrix(V);
        }
        catch (SQLException E) {
          E.printStackTrace();
          return null;
        }
      }
      

  7.   

    谢谢各位!!
    我现在取得的记录分为好几种,然后将这几种分别显示。我的做法是:对于每种,都对应不同的Vector。所以很罗嗦,而且每一种的记录数还不一样,到时候分也显示时就存在很多问题!
    不知道各位还有什么好建议吗?
      

  8.   

    我觉得最好为要显示的东西写一个类出来,页面上只是View就可以。
    装载类的容器我习惯用 ArrayList,可以方便的使用 size() 属性得知里面有多少个对象,分页对象数量应该在生成 ArrayList 前进行限制,不应该把全部记录直接返回到页面上再分页。