The document has no pages. Jasper Report

后端 未结 1 499
被撕碎了的回忆
被撕碎了的回忆 2021-01-14 14:58

I\'m having a problem searching for a solution to this issue. My codes works fine after I run it. It suppose to display the data on my sql database to my jtable, and there\'

相关标签:
1条回答
  • 2021-01-14 15:31

    Firstly, resource management...

    You should only open a single connection to the database if you can. Make sure you close it before the application is closed. The connection process can be expensive, so you only really want to do it when you absolutely have to...

    You close your resources once you have finished with them. This is best achieved by using a try-finally block...

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

    Now to the problem at hand...

    It appears you have create two references to con. One as class field and one as a method variable (in search).

    You are then passing con to Jasper Reports, which I suspect is null. Instead you should use the getConnection() as outlined above.

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

    Updated with background worker...

    A report can take some time to compile and fill. You should off load this work to a background thread so it doesn't interfere with your UI (or make it look like you application as hung).

    The simplest solution would be to use a SwingWorker. It has functionality to resync the threads with the 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
        }
    }
    

    Take a look at Concurrency in Swing for more details.

    Hints

    If you can pre-compile the report and load it (rather the loading the XML), it will make the report process quicker.

    0 讨论(0)
提交回复
热议问题