sql >> データベース >  >> RDS >> Sqlserver

ドキュメントにページがありません。ジャスパーレポート

    まず、リソース管理...

    可能であれば、データベースへの接続を 1 つだけ開く必要があります。アプリケーションを閉じる前に、必ず閉じてください。接続プロセスはコストがかかる可能性があるため、どうしても必要な場合にのみ実行する必要があります...

    リソースの使用が終了したら、リソースを閉じます。これは、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 への参照を 2 つ作成したようです . 1 つはクラス フィールドとして、もう 1 つはメソッド変数として (search で) ).

    次に、 con を渡します null であると思われる Jasper Reports へ .代わりに 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();
        }
    }
    

    バックグラウンド ワーカーで更新...

    レポートの編集と入力には時間がかかる場合があります。この作業をバックグラウンド スレッドにオフロードして、UI に干渉しないようにする必要があります (または、アプリケーションがハングしたように見えないようにします)。

    最も簡単な解決策は、SwingWorker を使用することです。 .スレッドを 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
        }
    }
    

    Swing での同時実行 をご覧ください。 詳細はこちら

    ヒント

    レポートを事前にコンパイルして読み込むことができれば (XML を読み込むのではなく)、レポートの処理が速くなります。




    1. データベースごとに、mysqldumpファイルを複数のデータベースに分割します

    2. sqlalchemyを使用して句に複数列を記述する方法

    3. WHERE句を使用して、経度と緯度からの距離の範囲内でPOIを検索します

    4. MariaDBでのSUBTIME()のしくみ