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;
 }
}





只有注册用户登录后才能发表评论。


网站导航: