まず、リソース管理...
可能であれば、データベースへの接続を 1 つだけ開く必要があります。アプリケーションを閉じる前に、必ず閉じてください。接続プロセスはコストがかかる可能性があるため、どうしても必要な場合にのみ実行する必要があります...
リソースの使用が終了したら、リソースを閉じます。これは、try-finally
を使用することで最もよく達成されます ブロック...
private Connection con;
protected void close() throws SQLException {
if (con != null) {
con.close();
}
}
protected Connection getConnection() throws ClassNotFoundException, SQLException {
if (con == null) {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String url = "jdbc:odbc:*****";
String user = "******";
String pass = "******";
Connection con = DriverManager.getConnection(url, user, pass);
}
return con;
}
private void search() throws Exception {
Statement state = null;
ResultSet rs = null;
try {
state = getConnection().createStatement();
rs = state.executeQuery("SELECT "
+ "pIDNo AS 'Patient ID',"
+ "pLName AS 'Last Name',"
+ "pFName AS 'First Name',"
+ "pMI AS 'M.I.',"
+ "pSex AS 'Sex',"
+ "pStatus AS 'Status',"
+ "pTelNo AS 'Contact No.',"
+ "pDocID AS 'Doctor ID',"
+ "pAddr AS 'St. No.',"
+ "pStreet AS 'St. Name',"
+ "pBarangay AS 'Barangay',"
+ "pCity AS 'City',"
+ " pProvince AS 'Province',"
+ " pLNameKIN AS 'Last Name',"
+ "pFNameKIN AS 'First Name',"
+ "pMIKIN AS 'M.I.',"
+ "pRelationKIN AS 'Relation',"
+ "pTotalDue AS 'Total Due'"
+ " FROM dbo.Patients");
ResultSetMetaData rsmetadata = rs.getMetaData();
int columns = rsmetadata.getColumnCount();
DefaultTableModel dtm = new DefaultTableModel();
Vector column_name = new Vector();
Vector data_rows = new Vector();
for (int i = 1; i < columns; i++) {
column_name.addElement(rsmetadata.getColumnName(i));
}
dtm.setColumnIdentifiers(column_name);
while (rs.next()) {
data_rows = new Vector();
for (int j = 1; j < columns; j++) {
data_rows.addElement(rs.getString(j));
}
dtm.addRow(data_rows);
}
tblPatient.setModel(dtm);
} finally {
try {
rs.close();
} catch (Exception e) {
}
try {
state.close();
} catch (Exception e) {
}
}
}
さて、当面の問題に...
con
への参照を 2 つ作成したようです . 1 つはクラス フィールドとして、もう 1 つはメソッド変数として (search
で) ).
次に、 con
を渡します null
であると思われる Jasper Reports へ .代わりに getConnection()
を使用する必要があります
public void reportviewer() {
try{
String report = "C:\\Users\\cleanfuel\\Documents\\NetBeansProjects\\StringManipulation\\src\\stringmanipulation\\report1.jrxml";
JasperReport jasp_report = JasperCompileManager.compileReport(report);
JasperPrint jasp_print = JasperFillManager.fillReport(jasp_report, null, getConnection());
JasperViewer.viewReport(jasp_print);
} catch (Exception e) {
e.printStackTrace();
}
}
バックグラウンド ワーカーで更新...
レポートの編集と入力には時間がかかる場合があります。この作業をバックグラウンド スレッドにオフロードして、UI に干渉しないようにする必要があります (または、アプリケーションがハングしたように見えないようにします)。
最も簡単な解決策は、SwingWorker
を使用することです。 .スレッドを UI と再同期する機能があります
public void reportviewer() {
// Disable any UI components you don't want the user using while
// the report generates...
new ReportWorker().execute();
}
public class ReportWorker extends SwingWorker<JasperPrint, Void> {
@Override
protected JasperPrint doInBackground() throws Exception {
String report = "C:\\Users\\cleanfuel\\Documents\\NetBeansProjects\\StringManipulation\\src\\stringmanipulation\\report1.jrxml";
JasperReport jasp_report = JasperCompileManager.compileReport(report);
JasperPrint jasp_print = JasperFillManager.fillReport(jasp_report, null, getConnection());
return jasp_print;
}
@Override
protected void done() {
try {
JasperPrint jasp_print = get();
JasperViewer.viewReport(jasp_print);
} catch (Exception exp) {
exp.printStackTrace();
}
// Renable any UI components you disabled before the report run
}
}
Swing での同時実行 をご覧ください。 詳細はこちら
ヒント
レポートを事前にコンパイルして読み込むことができれば (XML を読み込むのではなく)、レポートの処理が速くなります。