Първо, управление на ресурсите...
Трябва да отворите само една връзка към базата данни, ако можете. Уверете се, че сте го затворили, преди приложението да бъде затворено. Процесът на свързване може да бъде скъп, така че наистина искате да го направите само когато е абсолютно необходимо...
Затваряте ресурсите си, след като приключите с тях. Това се постига най-добре с помощта на 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
. Едно като поле за клас и едно като променлива на метод (в search
).
След това предавате con
към Jasper Reports, което подозирам, че е null
. Вместо това трябва да използвате 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();
}
}
Актуализирано с фонов работник...
Съставянето и попълването на отчет може да отнеме известно време. Трябва да преместите тази работа във фонова нишка, така че да не пречи на потребителския ви интерфейс (или да изглежда така, сякаш приложението ви е увиснало).
Най-простото решение би било да използвате SwingWorker
. Има функционалност за повторно синхронизиране на нишките с потребителския интерфейс
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), това ще направи процеса на отчета по-бърз.