Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Das Dokument hat keine Seiten. Jasper-Bericht

Erstens Ressourcenverwaltung...

Sie sollten möglichst nur eine einzige Verbindung zur Datenbank öffnen. Stellen Sie sicher, dass Sie es schließen, bevor die Anwendung geschlossen wird. Der Verbindungsprozess kann kostspielig sein, also solltest du ihn wirklich nur machen, wenn es unbedingt sein muss...

Sie schließen Ihre Ressourcen, sobald Sie mit ihnen fertig sind. Dies wird am besten durch die Verwendung eines try-finally erreicht blockieren...

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) {
        }
    }
}

Nun zum vorliegenden Problem...

Anscheinend haben Sie zwei Verweise auf con erstellt . Einmal als Klassenfeld und einmal als Methodenvariable (in search ).

Sie übergeben dann con an Jasper Reports, von dem ich vermute, dass es null ist . Stattdessen sollten Sie getConnection() verwenden wie oben beschrieben.

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();
    }
}

Mit Hintergrund-Worker aktualisiert...

Das Erstellen und Ausfüllen eines Berichts kann einige Zeit in Anspruch nehmen. Sie sollten diese Arbeit in einen Hintergrund-Thread auslagern, damit sie Ihre Benutzeroberfläche nicht stört (oder es so aussehen lässt, als wäre Ihre Anwendung hängen geblieben).

Die einfachste Lösung wäre die Verwendung eines SwingWorker . Es verfügt über eine Funktion zum erneuten Synchronisieren der Threads mit der Benutzeroberfläche

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
    }
}

Sehen Sie sich Parallelität in Swing an für weitere Details.

Tipps

Wenn Sie den Bericht vorkompilieren und laden können (anstatt das XML zu laden), wird der Berichtsprozess schneller.