<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Java軟件報表軟件技術博客

    java報表軟件技術匯總 java報表軟件制作 報表軟件新聞
    posts - 355, comments - 100, trackbacks - 0, articles - 3
       :: 首頁 :: 新隨筆 ::  :: 聚合  :: 管理
    ParamDBTableDataDemo2
     
    這是一個按參數從數據庫取值的小例子;
    參數為 param ,例如 grade:=77;87;97;
    即傳入數據庫字段名和值 取出所需要的值列;
    這里連的數據庫為FineReport報表的內置數據庫,適用時可輸入grade:=87;97;或者classno:=class1;class2;

    代碼如下:

      /*
      * Copyright(c) 2001-2009, FineReport Inc, All Rights Reserved.
      */
    package com.fr.demo;

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.ResultSetMetaData;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.logging.Level;

    import com.fr.base.FRContext;
    import com.fr.data.AbstractTableData;
    import com.fr.report.parameter.Parameter;
    /*
     *  ParamDBTableDataDemo2
     *
     *  這是一個按參數從數據庫取值的小例子;
     *  參數為 param ,例如 grade:=77;87;97;
     *  即傳入數據庫字段名和值 取出所需要的值列;
     *  這里連的數據庫為FineReport的內置數據庫,適用時可輸入grade:=87;97;或者classno:=class1;class2;
     *  建議使用安裝目錄下 /bin/DesignerDOS.exe 打開設計器,這樣就能看到控制臺輸出
     */

    public class ParamDBTableDataDemo2 extends AbstractTableData {
     
     // 自定義間隔符 暫定為':='和‘;’ 即輸入參數時需像如此  grade:=77;87;97; 表示輸出grade的值為77、87或者97的值列。
     // 您也可以輸入您需要的id字段,例如id:=77;87;97。請注意這里需要輸入數據庫內的實際字段名.
     private String splitMark1 = ":=";
     private String splitMark2 = ";";
     
     // 列字段名數組 保存在數據集窗口下一開始顯示的數據列名稱
     private String[] columnNames = null;
     
     // 保存查詢的多有字段名及其對應類型,例如 classNo->varchar grade->double
     Map col = new HashMap();
     
     // 保存查詢得到的值列
     private ArrayList valueList = null;
     
     // 構造函數
     public ParamDBTableDataDemo2() {
      // 定義需要的參數 param
      this.parameters = new Parameter[]{new Parameter("param")};
      // 初始化下列名,暫定為columnName#0,columnName#1......顯示在數據集窗體中的
      // 假如您的需求固定,可以直接在這里輸入您確定的列名
      // 例如,您查找學生表有,name,sex,age 3個字段,那么編碼如下
      // String[] columnNames = new String[3];columnNames[0]="name";columnNames[1]="sex"columnNames[2]="age";
      // 因為程序數據源的字段是一開始就固定的,所以您需要先設定。這里暫且以columnNames#N命名。
      columnNames = new String[10];
      for (int i = 0; i < 10 ; i++) {
       columnNames[i] = "columnNames#" + String.valueOf(i);
      }
     }
     
     // 取出列的數量
     public int getColumnCount() {
      return columnNames.length;
     }
     
     // 取出相應的列的數量
     public String getColumnName(int columnIndex) {
      return columnNames[columnIndex];
     }
     
     // 取出得到的結果集的總的行數
     public int getRowCount() {
      init();
      return valueList.size();
     }
     
     // 取出相應位置的值
     public Object getValueAt(int rowIndex, int columnIndex) {
      init();
      // 注意您查詢的字段順序是和數據集窗口中顯示的字段一致的,例如您查詢的字段順序為name,sex,age
      //那么columnName#0 對應 name columnName#1 對應 sex ,columnName#2 對應 age
      if (columnIndex >= col.size()) {
       return null;
      }
      return ((Object[])valueList.get(rowIndex))[columnIndex];
     }
     
     // 按照取到的參數進行處理,得到結果集
     public void init() {
      //確保此函數只被執行一次
      if (this.valueList != null) {
       return;
      }
      // 保存得到的參數
      String param = null;
      // 保存取到的結果集
      valueList = new ArrayList();
      // 這里必須按照名稱再做一次匹配取值,因為對象中的parameters數組在調用時,被排序過,暫時是以英文排序。
      // 雖然這個例子中只有一個參數,但需要解釋清楚
      for (int i = 0;i < parameters.length ; i++) {
       if (parameters[i].getName().equals("param")) //做匹配
        param = parameters[i].getValue().toString();
      }
      // 數據庫表名,這里固定,您也可以按照上一個例子用參數取值
      String tableName = "StScore";
      // 開始構造SQL語句,這里用*取全部值,您也可以自己定義需求,例如您想獲得name,sex,age3個字段,那么這里改為"select name,sex,age from "
      String sql="select * from "+tableName;
      // 截取查詢字段和值 paramArray[0]保存字段名 paramArray[1]保存值
      String[] paramArray = param.split(splitMark1);
      if( paramArray.length != 2 ) {
       FRContext.getLogger().log(Level.INFO, "Error: \n" +"參數格式不正確");
       return;
      }
      // 將值字段截取,保存到paranValue數組中
      String[] paramValue = paramArray[1].split(splitMark2);
      sql+=" where " + paramArray[0].trim() + " = ? ;";
      // 在日志中打印sql語句
      FRContext.getLogger().log(Level.INFO, "Query SQL of ParamDBTableData: \n" +sql);
      // 下面開始建立數據庫連接,按照剛才的sql語句進行查詢
      Connection conn = this.getConnection();
      // 定義結果集
      ResultSet rs = null;
      try {
       // 以下取得該表的所有字段及其對應的類型,并匹配參數中輸入的查詢字段,得到查詢字段的類型。
       String querySql = "select * from " + tableName + " where 1=2;";
       Statement stmt = conn.createStatement();
       rs = stmt.executeQuery(querySql);
       // showRs(rs);假如您不知道所查表的具體字段名以及對應類型,這里可以使用showRs方法在控制臺輸出一下。
       // type即為輸入的參數中查詢字段的類型 例如示例所用StScore表中,grade為double classNo為varchar
       String type = getColumnType(rs,col,paramArray[0]);
       // 假如沒有該字段,返回空
       if(type == null) {
        FRContext.getLogger().log(Level.INFO, "Error: \n" +"參數對應字段不存在");
        return;
       }
       // 這里開始查詢
       PreparedStatement ps = conn.prepareStatement(sql);
       for(int i = 0;i < paramValue.length;i++){
        // 根據type類型做一下匹配,再賦值,示例中只有varchar和double兩種類型
        // 您可以根據您實際數據庫中類型更改,假如您不知道,可以用上面提到的showRs方法查看一下。
        // 假如您只需要輸入id(一般都是int型),那么這里直接 ps.setInt(1,paramValue[i]);即可
        if(type.equals("varchar")){
         ps.setString(1, paramValue[i]);
        } else if(type.equals("double")) {
         ps.setDouble(1,Integer.parseInt(paramValue[i]));
        }
        rs = ps.executeQuery();
        //用對象數據保存一行數據
        Object[] objArray=null;
        while(rs.next()){
         objArray = new Object[col.size()];
         for(int j = 0; j < col.size() ; j++ ){
          objArray[j] = rs.getObject(j+1);
         }
         // 在valueList中加入這一行數據
         valueList.add(objArray);
        }
       }
       // 釋放數據庫資源
       rs.close();
       ps.close();
       conn.close();
       // 打印一共取到的數據行數量
       FRContext.getLogger().log(Level.INFO, "Query SQL of ParamDBTableData: \n" + valueList.size() + " rows selected");
      } catch (SQLException e) {
       e.printStackTrace();
      }
     }
     
     // 獲取數據庫連接 driverName 和 url 可以換成您需要的
     public Connection getConnection() {
      String driverName = "sun.jdbc.odbc.JdbcOdbcDriver";
      String url = "jdbc:odbc:FRDemo";
      String username = "";
      String password = "";
      Connection con = null;
      try {
       Class.forName(driverName);
       con = DriverManager.getConnection(url,username,password);
      } catch (Exception e) {
       e.printStackTrace();
       return null;
      }
      return con;
     }
     
     // 將表字段及其類型存入Map中,得到傳入參數對應的字段類型
     public String getColumnType(ResultSet rs , Map col , String param){
      try {
       ResultSetMetaData md = rs.getMetaData();
       int cols = md.getColumnCount();
       for(int i = 1;i <= cols;i++){
        col.put(md.getColumnName(i).toLowerCase(), md.getColumnTypeName(i).toLowerCase());
       }
       return (String)col.get(param.toLowerCase());
      } catch (Exception e) {
       e.printStackTrace();
      }
      return null;
     }
     
     // 得到結果集中的字段名及其字段類型
     public static void showRs(ResultSet rs){
      try{
       StringBuffer sb = new StringBuffer();
       ResultSetMetaData md = rs.getMetaData();
       int cols = md.getColumnCount();
       for(int i = 1;i <= cols;i++){
        sb.append(md.getColumnName(i) + "->");
        sb.append(md.getColumnType(i) + "==");//返回的是類型編號
        sb.append(md.getColumnTypeName(i) + "\n");//返回數據庫中類型名字
       }
       while(rs.next()){
        for(int i = 1;i <= cols;i++){
         sb.append(md.getColumnName(i) + "=");
         sb.append(rs.getString(i) + "   ");
        }
        sb.append("\n");
       }
       System.out.println(sb);
      }catch(Exception e){
       e.printStackTrace();
      }
     }
     
     // 釋放一些資源,因為可能會有重復調用,所以需釋放valueList,將上次查詢的結果釋放掉
     public void release() throws Exception {
      super.release();
      this.valueList = null;
     }
    }



    主站蜘蛛池模板: 国产亚洲精AA在线观看SEE| 在线免费观看毛片网站| 亚洲精品蜜桃久久久久久| 免费在线观看自拍性爱视频| 国产男女猛烈无遮挡免费视频网站 | 国产精品日本亚洲777| 免费看美女让人桶尿口| 久久亚洲AV成人无码国产最大| 毛片免费全部播放一级| 亚洲AV成人精品日韩一区| 国产精品免费一级在线观看| 麻豆安全免费网址入口| 亚洲最大av无码网址| 精品无码国产污污污免费网站国产| 4338×亚洲全国最大色成网站| 国产精品免费视频观看拍拍| 亚洲精品无码专区在线在线播放 | 一级特黄录像视频免费| 亚洲中文字幕久久精品无码APP| 爽爽爽爽爽爽爽成人免费观看| 久久91亚洲精品中文字幕| 精品无码免费专区毛片| 中文字幕无码精品亚洲资源网久久| 国产精品免费看久久久久| 一本岛v免费不卡一二三区| 久久青青成人亚洲精品| 一二三四影视在线看片免费| 亚洲国产精品自在自线观看| 亚洲国产精品日韩| 特级精品毛片免费观看| 亚洲国产精品成人午夜在线观看| 国产精品色午夜免费视频| 中文精品人人永久免费| 亚洲国产精品成人综合色在线婷婷| 成人爽A毛片免费看| 一级毛片免费播放试看60分钟| 久久亚洲AV成人出白浆无码国产| 成年女人午夜毛片免费视频| 国产特黄特色的大片观看免费视频| 亚洲一本综合久久| 免费看大美女大黄大色|