<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
       :: 首頁 :: 新隨筆 ::  :: 聚合  :: 管理

    ParamDBTableDataDemo

    這是一個按參數從數據庫取值的小例子;
    參數為 tableName 和 columnNames 兩項;
    即傳入 數據庫表名 以及 所需要的列名 取出所需要的值;
    這里連的數據庫為FineReport的內置數據庫,適用時可輸入表名:stscore 列名 name;sex (這里封號是自定義的間隔符,表示取name和sex兩列)   
    建議使用安裝目錄下 /bin/DesignerDOS.exe 打開設計器。


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

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.ArrayList;
    import java.util.logging.Level;

    import com.fr.base.FRContext;
    import com.fr.data.AbstractTableData;
    import com.fr.report.parameter.Parameter;

    /*
     *  ParamDBTableDataDemo
     *
     *  這是一個按參數從數據庫取值的小例子;
     *  參數為 tableName 和 columnNames 兩項;
     *  即傳入 數據庫表名 以及 所需要的列名 取出所需要的值;
     *  這里連的數據庫為FineReport的內置數據庫,適用時可輸入表名:stscore 列名 name;sex (這里封號是自定義的間隔符,表示取name和sex兩列)
     *  建議使用安裝目錄下 /bin/DesignerDOS.exe 打開設計器
     */

    public class ParamDBTableDataDemo extends AbstractTableData {
     
     // 自定義間隔符 暫定為‘;’ 即輸入列名參數時需像如此  name;sex;age;
     private String splitMark = ";";
     
     // 列字段名數組 保存在數據集窗口下一開始顯示的數據列名稱
     private String[] columnNames = null;
     
     //自定義需要列出的列數量  即在數據集窗口列出的數據集下的字段數量
     private int columnNum = 10;
     
     // 保存取到的字段 即輸入的參數字段,假如是name;sex 參數字段即為name 和 sex 兩項
     String[] colNames = null;
     
     // 保存查詢得到的值列
     private ArrayList valueList = null;
     
     // 構造函數
     public ParamDBTableDataDemo() {
      // 定義需要的參數 tablename columnNames 如定義 pp=new Parameter[]{new Parameter("param")}; 即只需要 param 一個參數
      this.parameters = new Parameter[]{new Parameter("tableName"),new Parameter("columnNames")};
      // 初始化下列名,暫定為columnName#0,columnName#1......顯示在數據集窗體中的
      columnNames = new String[columnNum];
      for (int i = 0; i < columnNum ; 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();
      // 假如取出的結果中沒有相應的字段,設為空。例如,您在模板中定義需要顯示4個字段,但是參數中您只輸入了3個,那么第4個就設為空
      // 注意您輸入的參數順序是和數據集窗口中顯示的字段一致的,例如您傳的參數為name;sex;classno 那么columnName#0 對應 name
      // columnName#1 對應 sex ,columnName#2 對應 classno
      if (columnIndex >= colNames.length) {
       return null;
      }
      return ((Object[])valueList.get(rowIndex))[columnIndex];
     }
     
     // 按照取到的參數進行處理,得到結果集
     public void init() {
      //確保此函數只被執行一次
      if (this.valueList != null) {
       return;
      }
      // 保存得到的數據庫表名
      String tableName = null;
      // 保存取到的結果集
      valueList = new ArrayList();
      // 這里必須按照名稱再做一次匹配取值,因為對象中的parameters數組在調用時,被排序過,暫時是以英文排序。
      for (int i = 0;i < parameters.length ; i++) {
       if (parameters[i].getName().equals("tableName")) //做匹配
        tableName = parameters[i].getValue().toString();
       else
        colNames = this.getParameters()[i].getValue().toString().split(splitMark);
      }
      // 開始構造SQL語句
      String sql="select ";
      // 傳入參數中輸入的字段
      for ( int i = 0; i<colNames.length ; i++) {
       colNames[i].trim();
       if (i == colNames.length-1)
        sql += colNames[i];
       else
        sql += colNames[i] + ",";
      }
      sql+=" from " + tableName + ";";
      // 在日志中打印sql語句
      FRContext.getLogger().log(Level.INFO, "Query SQL of ParamDBTableData: \n" +sql);
      // 下面開始建立數據庫連接,按照剛才的sql語句進行查詢
      Connection conn = this.getConnection();
      try {
       Statement stmt = conn.createStatement();
       ResultSet rs = stmt.executeQuery(sql);
       //用對象數據保存一行數據
       Object[] objArray=null;
       while(rs.next()){
        objArray = new Object[colNames.length];
        for(int i = 0; i<colNames.length ; i++ ){
         objArray[i]=rs.getObject(colNames[i]);
        }
        // 在valueList中加入這一行數據
        valueList.add(objArray);
       }
       //釋放數據庫資源
       rs.close();
       stmt.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;
     }
     
     // 釋放一些資源,因為可能會有重復調用,所以需釋放valueList,將上次查詢的結果釋放掉
     public void release() throws Exception {
      super.release();
      this.valueList = null;
     }
    }




    主站蜘蛛池模板: 老司机午夜性生免费福利| 亚洲午夜电影一区二区三区| 亚洲AV无码之国产精品| 永久免费AV无码国产网站| 2020年亚洲天天爽天天噜| 成人AV免费网址在线观看| 久久亚洲精品国产亚洲老地址| 免费看韩国黄a片在线观看| 国产成人精品日本亚洲18图| 在线观看人成网站深夜免费| 久久精品熟女亚洲av麻豆| 免费一级特黄特色大片在线观看| 日日摸夜夜添夜夜免费视频| 在线精品亚洲一区二区小说| 日韩电影免费在线观看中文字幕| 亚洲黄色网站视频| 成年女人色毛片免费看| 亚洲AV网一区二区三区| 国产精品亚洲mnbav网站 | 久久精品国产亚洲AV嫖农村妇女| 午夜不卡久久精品无码免费| 亚洲AV成人无码天堂| 国产猛烈高潮尖叫视频免费| 国产精品免费观看视频| 亚洲αv久久久噜噜噜噜噜| 黄色成人免费网站| 免费无码AV一区二区| 婷婷精品国产亚洲AV麻豆不片| 97国产免费全部免费观看| 成人亚洲国产精品久久| 亚洲成AV人片在线观看WWW| 青青视频观看免费99| 青青青视频免费观看| 久久精品国产精品亚洲毛片| 国产性生交xxxxx免费| 99久久国产精品免费一区二区| 亚洲娇小性xxxx| 国产自偷亚洲精品页65页| 在线观看AV片永久免费| 羞羞视频免费网站在线看| 亚洲成A人片在线播放器|