Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Tài liệu không có trang nào. Báo cáo Jasper

Thứ nhất, quản lý tài nguyên ...

Bạn chỉ nên mở một kết nối duy nhất đến cơ sở dữ liệu nếu có thể. Đảm bảo rằng bạn đóng nó trước khi ứng dụng được đóng lại. Quá trình kết nối có thể tốn kém, vì vậy bạn chỉ thực sự muốn làm điều đó khi bạn hoàn toàn phải ...

Bạn đóng tài nguyên của mình sau khi bạn đã hoàn thành với chúng. Điều này đạt được tốt nhất bằng cách sử dụng try-finally khối ...

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

Bây giờ đến vấn đề trong tầm tay ...

Có vẻ như bạn đã tạo hai tham chiếu đến con . Một dưới dạng trường lớp và một dưới dạng biến phương thức (trong search ).

Sau đó, bạn đang chuyển con cho Báo cáo Jasper, mà tôi nghi ngờ là null . Thay vào đó, bạn nên sử dụng getConnection() như đã nêu ở trên.

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

Đã cập nhật với nhân viên nền ...

Một báo cáo có thể mất một khoảng thời gian để biên dịch và điền vào. Bạn không nên tải tác phẩm này vào một chuỗi nền để nó không ảnh hưởng đến giao diện người dùng của bạn (hoặc làm cho nó giống như ứng dụng của bạn bị treo).

Giải pháp đơn giản nhất là sử dụng SwingWorker . Nó có chức năng đồng bộ lại các chuỗi với giao diện người dùng

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

Hãy xem Đồng tiền trong Swing để biết thêm chi tiết.

Gợi ý

Nếu bạn có thể biên dịch trước báo cáo và tải nó (thay vì tải XML), điều đó sẽ làm cho quá trình báo cáo nhanh hơn.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bật SQL Server 'xp_cmdshell'

  2. Trả về một giá trị và một tập hợp kết quả từ asp cổ điển thủ tục được lưu trữ

  3. Tablix:Lặp lại các hàng tiêu đề trên mỗi trang không hoạt động - Trình tạo Báo cáo 3.0

  4. Tập lệnh để lưu dữ liệu varbinary vào đĩa

  5. Làm thế nào để chạy một thủ tục được lưu trữ trong máy chủ sql mỗi giờ?