For det første ressourcestyring...
Du bør kun åbne en enkelt forbindelse til databasen, hvis du kan. Sørg for at lukke den, før applikationen lukkes. Tilslutningsprocessen kan være dyr, så du vil først rigtig gøre det, når du absolut skal...
Du lukker dine ressourcer, når du er færdig med dem. Dette opnås bedst ved at bruge en try-finally
blokere...
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 til det aktuelle problem...
Det ser ud til, at du har oprettet to referencer til con
. Et som klassefelt og et som en metodevariabel (i search
).
Du sender derefter con
til Jasper Reports, som jeg formoder er null
. I stedet skal du bruge getConnection()
som skitseret ovenfor.
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();
}
}
Opdateret med baggrundsarbejder...
En rapport kan tage lidt tid at kompilere og udfylde. Du bør indlæse dette arbejde til en baggrundstråd, så det ikke forstyrrer din brugergrænseflade (eller får det til at se ud som om, at din applikation er hængt).
Den enkleste løsning ville være at bruge en SwingWorker
. Det har funktionalitet til at gensynkronisere trådene med brugergrænsefladen
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
}
}
Tag et kig på Concurrency in Swing for flere detaljer.
Tips
Hvis du kan prækompilere rapporten og indlæse den (snarere ved at indlæse XML), vil det gøre rapportprocessen hurtigere.