Ten eerste, middelenbeheer...
U zou slechts één enkele verbinding met de database moeten openen als dat mogelijk is. Zorg ervoor dat u deze sluit voordat de toepassing wordt gesloten. Het verbindingsproces kan duur zijn, dus u wilt het alleen echt doen als het echt moet...
Je sluit je resources af als je er klaar mee bent. Dit kan het beste worden bereikt door een try-finally
. te gebruiken blokkeren...
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) {
}
}
}
Nu het probleem bij de hand...
Het lijkt erop dat je twee verwijzingen hebt gemaakt naar con
. Een als klasseveld en een als een methodevariabele (in search
).
Je passeert dan con
naar Jasper Reports, waarvan ik vermoed dat het null
. is . Gebruik in plaats daarvan de getConnection()
zoals hierboven beschreven.
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();
}
}
Bijgewerkt met achtergrondmedewerker...
Een rapport kan enige tijd in beslag nemen om te compileren en in te vullen. U moet dit werk naar een achtergrondthread verplaatsen, zodat het uw gebruikersinterface niet verstoort (of het eruit laat zien alsof uw toepassing is vastgelopen).
De eenvoudigste oplossing zou zijn om een SwingWorker
. te gebruiken . Het heeft functionaliteit om de threads opnieuw te synchroniseren met de gebruikersinterface
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
}
}
Bekijk Concurrency in Swing voor meer details.
Hints
Als u het rapport vooraf kunt compileren en laden (in plaats van het laden van de XML), zal het rapportproces sneller verlopen.