Posted on 2009-09-02 17:39
FineReport——报表技术领跑者 阅读(185)
评论(0) 编辑 收藏 所属分类:
Java报表技术知识
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;
}
}