ParamDBTableDataDemo
這是一個按參數(shù)從數(shù)據(jù)庫取值的小例子;
參數(shù)為 tableName 和 columnNames 兩項;
即傳入 數(shù)據(jù)庫表名 以及 所需要的列名 取出所需要的值;
這里連的數(shù)據(jù)庫為FineReport的內(nèi)置數(shù)據(jù)庫,適用時可輸入表名: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
*
* 這是一個按參數(shù)從數(shù)據(jù)庫取值的小例子;
* 參數(shù)為 tableName 和 columnNames 兩項;
* 即傳入 數(shù)據(jù)庫表名 以及 所需要的列名 取出所需要的值;
* 這里連的數(shù)據(jù)庫為FineReport的內(nèi)置數(shù)據(jù)庫,適用時可輸入表名:stscore 列名 name;sex (這里封號是自定義的間隔符,表示取name和sex兩列)
* 建議使用安裝目錄下 /bin/DesignerDOS.exe 打開設計器
*/
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;
// 構造函數(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;
}
// 取出相應的列的數(shù)量
public String getColumnName(int columnIndex) {
return columnNames[columnIndex];
}
// 取出得到的結果集的總的行數(shù)
public int getRowCount() {
init();
return valueList.size();
}
// 取出相應位置的值
public Object getValueAt(int rowIndex, int columnIndex) {
init();
// 假如取出的結果中沒有相應的字段,設為空。例如,您在模板中定義需要顯示4個字段,但是參數(shù)中您只輸入了3個,那么第4個就設為空
// 注意您輸入的參數(shù)順序是和數(shù)據(jù)集窗口中顯示的字段一致的,例如您傳的參數(shù)為name;sex;classno 那么columnName#0 對應 name
// columnName#1 對應 sex ,columnName#2 對應 classno
if (columnIndex >= colNames.length) {
return null;
}
return ((Object[])valueList.get(rowIndex))[columnIndex];
}
// 按照取到的參數(shù)進行處理,得到結果集
public void init() {
//確保此函數(shù)只被執(zhí)行一次
if (this.valueList != null) {
return;
}
// 保存得到的數(shù)據(jù)庫表名
String tableName = null;
// 保存取到的結果集
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);
}
// 開始構造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語句進行查詢
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;
}
// 釋放一些資源,因為可能會有重復調(diào)用,所以需釋放valueList,將上次查詢的結果釋放掉
public void release() throws Exception {
super.release();
this.valueList = null;
}
}