2013-04-10 8 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); 
     } 

Auf meinem ResultSet rs = state.executeQuery() ich verwendet, um dieses SQLSELECT-Anweisung in 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"); 

Zuerst habe ich laufen diese Zeile (pTotalDue nicht zu jTable kommen hat.)

Und auf meinem zweiten Versuch, zeige es ich mache das:

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

Jetzt habe ich dieses versucht, und ich denke, etwas ist real falsch über meine Codes. BTW diese Spalte hat GELD DATENTYP

Warum zeigt es nicht zu meiner JTable? Könnte mir jemand sagen, was das Problem mit meinen Codes ist?

(Problem in der Antwort, die mir gegeben hat) öffentliche Klasse QueryOnWorkerThread erweitert SwingWorker { private endgültige 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

tun Sie ein beliebiges Feld Dezimal in Datenbanktabelle Patienten haben –

+0

ja die pTotalDue die MONEY-Datentyp ist und Dezimalzahlen enthalten. –

+0

konvertieren, um String –

Antwort

6

In Sie Schleifen Ihre Exit-Bedingung ist

j<columns 

bedeutet dies thant die letzte Spalte wird nie zurückgewonnen werden. versuchen, diese insted:

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

Sir Joan, das gleiche Ergebnis passieren. Ich meine, nichts passiert noch .... es zeigte nicht den Geld-Datentyp –

+0

Haben Sie die column_name Population-Schleife geändert? Es hat die gleiche Bedingung. – Joan

8

diese versuchen

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 i Ihre Codes versucht, hier ist was Ive erhielt: Exception in thread "AWT-Eventqueue-0" java.lang.IllegalArgumentException: kann nicht formatiert gegeben Objekt als Nummer \t bei java.text.DecimalFormat.format (DecimalFormat. java: 505) \t bei java.text.Format.format (Format.java:157) \t bei javax.swing.JTable $ DoubleRenderer.setValue (JTable.java:5367) \t bei javax.swing.table.DefaultTableCellRenderer .getTableCellRendererComponent (DefaultTableCellRenderer.java:257) \t bei javax.swing.JTable.prepareRenderer (JTable.java:5735) –

+0

es ist Nummer Format Ausnahme .... zeigen Sie mir Ihren Code –

+0

Ich werde die Frage sofort bearbeiten ... –

5

Die Tatsache, dass die letzte Spalte erscheint nicht wahrscheinlich in Ihren Loop-Anweisungen verwendet ist, wie bereits durch @Joan angegeben.

Es gibt jedoch weitere Probleme mit diesem Code. Sie sollten die Swing-Komponenten nur im Event-Dispatch-Thread aktualisieren, und auf diesem Thread sollten Sie keine lang andauernden Operationen ausführen. Kurz gesagt, Mischen von SQL-Abfragen und Updates der JTable sollte nicht auf dem gleichen Thread geschehen. Weitere Informationen finden Sie im Handbuch Concurrency in Swing.

eine SwingWorker Verwendung könnte dieses Problem lösen:

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

Die SwingWorker kann durch den Aufruf

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

Hinweis gestartet werden, wie ich die Schleifen im Code geändert

+0

sir @Robin freundlich Blick auf die Bearbeitung am Ende, kann ich es nicht als Kommentar posten, weil es zu lang ist, habe ich auch angegeben, was ist das Problem mit den Codes, die Sie hier zur Verfügung stellen. –

+0

@CrystalMaiden Warum haben Sie die 'throws Exception' hinzugefügt. Diese Methode darf keine Ausnahme auslösen. Sie sollten sie fangen (wie ich für die "InterruptedException" und die "ExecutionException" – Robin

4

Versuchen Sie diese Spalte immer über ResultSet.getBigDecimal() anstatt über ResultSet.getString(). Dann legen Sie Ihre abgerufene BigDecimal.toPlainString() in Ihre Tabellenzelle.

Beispiel:

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

Herr, es gibt eine rote Linie kann das Symbol nicht finden: Methode getPlainString(), warum ist das? Und wenn ich Intellisense nach ("pTotalDue") es erscheint nur eine Sache und das ist getClass() –

+0

Sorry, der korrekte Methodenname ist 'toPlainString()' –

3

versuchen, eine Table zu verwenden.

Implementieren Sie den Renderer, und rendern Sie die Spalte mit dem Money Type in der gewünschten Form.

Grüße, HL