Java軟件報表軟件技術(shù)博客

          java報表軟件技術(shù)匯總 java報表軟件制作 報表軟件新聞
          posts - 355, comments - 100, trackbacks - 0, articles - 3
             :: 首頁 :: 新隨筆 ::  :: 聚合  :: 管理

          ParamDBTableDataDemo

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


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

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




          主站蜘蛛池模板: 监利县| 高淳县| 西丰县| 宜州市| 买车| 丹江口市| 格尔木市| 炉霍县| 石景山区| 古交市| 昆山市| 南澳县| 宁陵县| 邓州市| 丁青县| 冕宁县| 凌云县| 漯河市| 胶州市| 林口县| 舒兰市| 特克斯县| 庆阳市| 新津县| 苏州市| 巴里| 湄潭县| 正阳县| 枣强县| 江川县| 安吉县| 吴旗县| 闽侯县| 吴忠市| 东乌珠穆沁旗| 五河县| 南澳县| 镇远县| 定西市| 龙泉市| 定南县|