2013-04-10 14 views
9
public void search() throws Exception{ 
      Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
       String url = "jdbc:odbc:******"; 
       String user = "*****"; 
       String pass = "*****"; 
       Connection con = DriverManager.getConnection(url, user, pass); 
       Statement state = con.createStatement(); 
       ResultSet rs = state.executeQuery(""); 
       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); 
     } 

Na moim ResultSet rs = state.executeQuery() użyłem tego SQLSELECT w JAVA

       "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"); 

najpierw uruchomić tę linię (pTotalDue nie przyszedł do JTable.)

A na mojej drugiej próbie pokaż to Robię to:

"SELECT pTotalDue AS 'Total Due' FROM dbo.Patients" 

Teraz próbowałem tego i wydaje mi się, że coś jest naprawdę nie mam racji co do moich kodów. BTW ta kolumna ma TYP PIENIĘDNY TYPU

dlaczego nie wyświetliła się moja JTable? czy ktoś mógłby mi powiedzieć, jaki jest problem z moimi kodami?

(Problem z udzieloną odpowiedzią) klasa publiczna QueryOnWorkerThread przedłuża SwingWorker { prywatne ostateczne JTable tableToUpdate;

public QueryOnWorkerThread(JTable aTableToUpdate) { 
    tableToUpdate = aTableToUpdate; 
    } 

    @Override 
    protected TableModel doInBackground() throws Exception { 
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
    String url = "jdbc:odbc:OJT_dsn"; 
    String user = "sa"; 
    String pass = ""; 
    Connection con = DriverManager.getConnection(url, user, pass); 
    Statement state = con.createStatement(); 
    ResultSet rs = state.executeQuery(""); 
    ResultSetMetaData rsmetadata = rs.getMetaData(); 
    int columns = rsmetadata.getColumnCount(); 
    DefaultTableModel dtm = new DefaultTableModel(); 
    Vector column_name = new Vector(); 
    Vector data_rows; 

    //note the <= check iso the < check (as the count starts at index 1) 
    for (int i=1; i<=columns;i++){ 
     column_name.addElement(rsmetadata.getColumnName(i)); 
    } 
    dtm.setColumnIdentifiers(column_name); 

    while(rs.next()){ 
     data_rows = new Vector(); 
     //note the <= check iso the < check (as the count starts at index 1) 
     for (int j=1; j<=columns; j++){ 
     data_rows.addElement(rs.getString(j)); 
     } 
     dtm.addRow(data_rows); 
    } 
    return dtm; 
    } 


     `@Override <<<<<<<<<<<<<<<<<<<<< I have a problem here it says : done() in javaapplication25.SearchPatient.QueryWorkerThread cannot override done() in javax.swing.SwingWorker overriden method does not throw java.lang.Exception , what does it mean sir?` 
    protected void done() throws Exception{ 
    //this method runs on the EDT, so it is safe to update our table here 
    try { 
     tableToUpdate.setModel(get()); 
    } catch (InterruptedException e) { 
     throw new RuntimeException(e); 
    } catch (ExecutionException e) { 
     throw new RuntimeException(e); 
    } 
    } 
+0

masz jakiś przecinku pola w tabeli bazy danych pacjentów –

+0

tak pTotalDue że jest typu DATA pieniądze i zawierać liczby dziesiętne. –

+0

przekonwertować to na ciąg –

Odpowiedz

6

W ty pętle, Twój stan wyjścia jest

j<columns 

oznacza Thant ostatnia kolumna nigdy nie zostaną odzyskane. spróbuj tego insted:

for (int j=1; j<=columns; j++) 
+0

sir Joan, ten sam rezultat się zdarzył. Chodzi mi o to, że nic się jeszcze nie wydarzyło ... nie wyświetlało się TYP DANYCH PIENIĘŻNYCH –

+0

Czy zmieniłeś pętlę populacyjną column_name? Ma ten sam warunek. – Joan

8

spróbować tej

DefaultTableModel dtm=(DefaultTableModel)table.getModel(); 
for (int i = dtm.getRowCount() - 1; i > -1; i--) { 
dtm.removeRow(i); 
} 

Connection con = DriverManager.getConnection(url, user, pass); 
Statement state = con.createStatement(); 
ResultSet rs = state.executeQuery("Your SQL Query"); 

while(rs.next()) 
{ 
String str1=rs.getString(1); 
String str2=rs.getString(2); 
String str3=rs.getString(3); 
String str4=rs.getString(4); 
String str5=rs.getString(5); 
: 
: 
: 
dtm.addRow(new Object[]{str1,str2,str3,str4,str5}); 
} 
+0

sir Próbowałem kody, oto co Ive got: Wyjątek w wątku "AWT-EventQueue-0" java.lang.IllegalArgumentException: Nie można sformatować dany przedmiot jako liczba \t na java.text.DecimalFormat.format (DecimalFormat. Java: 505) \t na java.text.Format.format (Format.java:157) \t na javax.swing.JTable $ DoubleRenderer.setValue (JTable.java:5367) \t na javax.swing.table.DefaultTableCellRenderer .getTableCellRendererComponent (DefaultTableCellRenderer.java:257) \t na javax.swing.JTable.prepareRenderer (JTable.java:5735) –

+0

to wyjątek formatu liczb .... pokaż mi swój kod –

+0

Natychmiast wydam to pytanie ... –

5

Fakt, że ostatnia kolumna nie pojawia jest prawdopodobnie związane z twoich wypowiedzi pętlowych, jak już wskazano @Joan.

Istnieje jednak więcej problemów z tym kodem. Należy aktualizować komponenty Swing tylko w wątku wysyłania zdarzeń, a na tym wątku nie należy wykonywać długo działających operacji. Krótko mówiąc, mieszanie zapytań SQL i aktualizacji JTable nie powinno się odbywać w tym samym wątku. Więcej informacji można znaleźć w przewodniku Concurrency in Swing.

Korzystanie z SwingWorker może rozwiązać ten problem:

public class QueryOnWorkerThread extends SwingWorker<TableModel, Void>{ 
    private final JTable tableToUpdate; 

    public QueryOnWorkerThread(JTable aTableToUpdate) { 
    tableToUpdate = aTableToUpdate; 
    } 

    @Override 
    protected TableModel doInBackground() throws Exception { 
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
    String url = "jdbc:odbc:******"; 
    String user = "*****"; 
    String pass = "*****"; 
    Connection con = DriverManager.getConnection(url, user, pass); 
    Statement state = con.createStatement(); 
    ResultSet rs = state.executeQuery(""); 
    ResultSetMetaData rsmetadata = rs.getMetaData(); 
    int columns = rsmetadata.getColumnCount(); 
    DefaultTableModel dtm = new DefaultTableModel(); 
    Vector column_name = new Vector(); 
    Vector data_rows; 

    //note the <= check iso the < check (as the count starts at index 1) 
    for (int i=1; i<=columns;i++){ 
     column_name.addElement(rsmetadata.getColumnName(i)); 
    } 
    dtm.setColumnIdentifiers(column_name); 

    while(rs.next()){ 
     data_rows = new Vector(); 
     //note the <= check iso the < check (as the count starts at index 1) 
     for (int j=1; j<=columns; j++){ 
     data_rows.addElement(rs.getString(j)); 
     } 
     dtm.addRow(data_rows); 
    } 
    return dtm; 
    } 

    @Override 
    protected void done() { 
    //this method runs on the EDT, so it is safe to update our table here 
    try { 
     tableToUpdate.setModel(get()); 
    } catch (InterruptedException e) { 
     throw new RuntimeException(e); 
    } catch (ExecutionException e) { 
     throw new RuntimeException(e); 
    } 
    } 
} 

SwingWorker można uruchomić poprzez wywołanie

QueryOnWorkerThread worker = new QueryOnWorkerThread(tblPatient); 
worker.execute(); 

Uwaga jak zmieniłem pętle w kodzie

+0

sir @Robin proszę spojrzeć na edycję w części końcowej, nie mogę opublikować jej jako komentarza, ponieważ jest zbyt długa, wskazałem także, jaki jest problem z kodami, które tu podajesz. –

+0

@CrystalMaiden, dlaczego dodałeś "Wyrzuca wyjątek". Ta metoda może nie spowodować wyjątku. Powinieneś ich złapać (tak jak ja w przypadku 'InterruptedException' i' ExecutionException' – Robin

4

Spróbuj znaleźć tę kolumnę przez ResultSet.getBigDecimal() zamiast przez ResultSet.getString(). Następnie umieść pobrane BigDecimal.toPlainString() w swojej komórce tabeli.

przykład:

data_rows.addElement(rs.getBigDecimal("pTotalDue").toPlainString());//Assuming your select returns a pTotalDue Column (e.g. SELECT pTotalDue,... FROM ...) 
+0

sir, tam czerwona linia nie może znaleźć symbolu: method getPlainString(), dlaczego tak jest? I czy użyłem Intellisense after ("pTotalDue") pojawia się tylko jedna rzecz i to jest getClass() –

+0

Niestety, poprawna nazwa metody to 'toPlainString()' –

3

próby użycia TableCellRenderer.

Zaimplementuj Renderer i wyświetl kolumnę z typem pieniędzy w żądanym formularzu.

Pozdrawiam, HL