Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Dokumen tidak memiliki halaman. Laporan Jasper

Pertama, manajemen sumber daya...

Anda hanya boleh membuka satu koneksi ke database jika Anda bisa. Pastikan Anda menutupnya sebelum aplikasi ditutup. Proses koneksi bisa mahal, jadi Anda hanya benar-benar ingin melakukannya saat Anda benar-benar harus...

Anda menutup sumber daya Anda setelah Anda selesai dengan mereka. Ini paling baik dicapai dengan menggunakan try-finally blokir...

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

Sekarang untuk masalah yang dihadapi...

Tampaknya Anda telah membuat dua referensi ke con . Satu sebagai bidang kelas dan satu sebagai variabel metode (dalam search ).

Anda kemudian melewati con ke Jasper Reports, yang saya duga adalah null . Sebagai gantinya, Anda harus menggunakan getConnection() seperti diuraikan di atas.

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

Diperbarui dengan pekerja latar belakang...

Sebuah laporan dapat memakan waktu untuk dikompilasi dan diisi. Anda harus memindahkan pekerjaan ini ke utas latar belakang sehingga tidak mengganggu UI Anda (atau membuatnya tampak seperti aplikasi Anda yang digantung).

Solusi paling sederhana adalah dengan menggunakan SwingWorker . Ini memiliki fungsi untuk menyinkronkan ulang utas dengan 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
    }
}

Lihat Concurrency in Swing untuk lebih jelasnya.

Petunjuk

Jika Anda dapat mengkompilasi laporan terlebih dahulu dan memuatnya (bukan memuat XML), itu akan membuat proses laporan lebih cepat.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server membagi CSV menjadi beberapa baris

  2. Paket SSIS berjalan 500x lebih lama di satu server

  3. Saya Membutuhkan Daftar Negara di T-SQL

  4. Parsing nama file dan path dari path lengkap

  5. Bagaimana cara menjalankan paket SSIS dari .NET?