Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Dokument nie zawiera stron. Raport Jaspera

Po pierwsze, zarządzanie zasobami...

Jeśli możesz, powinieneś otworzyć tylko jedno połączenie z bazą danych. Upewnij się, że zamknąłeś go przed zamknięciem aplikacji. Proces łączenia może być kosztowny, więc naprawdę chcesz to zrobić tylko wtedy, gdy absolutnie musisz...

Zamykasz swoje zasoby po ich zakończeniu. Najlepiej to osiągnąć za pomocą try-finally zablokuj...

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

Teraz przejdźmy do problemu...

Wygląda na to, że utworzyłeś dwa odniesienia do con . Jedno jako pole klasy, a drugie jako zmienna metody (w search ).

Następnie przechodzisz con do Jasper Reports, które, jak podejrzewam, jest null . Zamiast tego powinieneś użyć getConnection() jak opisano powyżej.

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

Zaktualizowano pracownika w tle...

Opracowanie i wypełnienie raportu może zająć trochę czasu. Powinieneś załadować tę pracę do wątku w tle, aby nie zakłócała ​​interfejsu użytkownika (lub sprawiała, że ​​aplikacja wyglądała jak zawieszona).

Najprostszym rozwiązaniem byłoby użycie SwingWorker . Posiada funkcję ponownej synchronizacji wątków z interfejsem użytkownika

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

Spójrz na Współbieżność w Swingu po więcej szczegółów.

Wskazówki

Jeśli możesz wstępnie skompilować raport i załadować go (zamiast ładowania XML), przyspieszy to proces tworzenia raportu.




  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 konwertuje ciąg na datę i godzinę

  2. Dlaczego błąd:[Menedżer sterowników ODBC] Nie znaleziono nazwy źródła danych...? (działa dobrze w środowisku deweloperskim)

  3. Ile pamięci RAM faktycznie używa SQL Server?

  4. Grupy dostępności programu SQL Server AlwaysOn:instalacja i konfiguracja, część 1

  5. Kaskadowo skopiuj wiersz ze wszystkimi wierszami podrzędnymi i ich wierszami podrzędnymi itp.