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

On ResultSet rs = state.executeQuery() của tôi, tôi sử dụng này SQLSELECT tuyên bố trong 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"); 

Trước tiên tôi chạy dòng này (pTotalDue không đi đến JTable.)

Và trên nỗ lực thứ hai của tôi để hiển thị nó tôi làm điều này:

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

Bây giờ tôi đã thử cái này, và tôi nghĩ cái gì đó thật ly sai về mã của tôi. BTW cột này có MONEY DATA TYPE

tại sao nó không hiển thị cho số JTable của tôi? bất cứ ai có thể cho tôi biết vấn đề với mã của tôi là gì?

(Sự cố trong câu trả lời đã trao cho tôi) lớp công khai QueryOnWorkerBài viết mở rộng SwingWorker { bảng JTable cuối cùng riêng tưĐể cập nhật;

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

làm bạn có bất kỳ chữ số thập phân trường trong bảng cơ sở dữ liệu bệnh nhân –

+0

có các pTotalDue đó là TIỀN DỮ LIỆU KIỂU và chứa số thập phân. –

+0

chuyển đổi thành chuỗi –

Trả lời

6

Trong bạn lặp, điều kiện xuất cảnh của bạn là

j<columns 

điều này có nghĩa Thant cột cuối cùng sẽ không bao giờ được phục hồi. thử này insted:

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

sir Joan, cùng một kết quả xảy ra. Tôi có nghĩa là không có gì xảy ra vẫn .... nó đã không hiển thị các loại dữ liệu tiền tệ –

+0

Bạn đã thay đổi vòng lặp dân số column_name? Nó có cùng một điều kiện. – Joan

8

thử này

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

thưa ông tôi đã cố gắng mã của bạn, đây là những gì Ive có: Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Không thể định dạng đối tượng được coi là một Số \t tại java.text.DecimalFormat.format (DecimalFormat. java: 505) \t tại java.text.Format.format (Format.java:157) \t tại javax.swing.JTable $ DoubleRenderer.setValue (JTable.java:5367) \t tại javax.swing.table.DefaultTableCellRenderer .getTableCellRendererComponent (DefaultTableCellRenderer.java:257) \t tại javax.swing.JTable.prepareRenderer (JTable.java:5735) –

+0

nó là định dạng số ngoại lệ .... chỉ cho tôi mã của bạn –

+0

Tôi sẽ chỉnh sửa câu hỏi ngay lập tức ... –

5

Thực tế là cột cuối cùng của bạn không xuất hiện có lẽ liên quan đến báo cáo vòng lặp của bạn, như đã được chỉ ra bởi @Joan.

Tuy nhiên, có nhiều vấn đề hơn với mã này. Bạn chỉ nên cập nhật các thành phần Swing trên Thread Dispatch Thread, và trên Thread đó bạn không nên thực hiện các hoạt động chạy dài. Tóm lại, việc trộn các truy vấn SQL và các cập nhật của JTable không nên xảy ra trên cùng một luồng. Tham khảo hướng dẫn Concurrency in Swing để biết thêm thông tin.

Sử dụng một SwingWorker thể giải quyết vấn đề này:

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

Các SwingWorker có thể được bắt đầu bằng cách gọi

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

Lưu ý làm thế nào tôi thay đổi các vòng trong mã của bạn

+0

sir @Robin vui lòng nhìn vào phần chỉnh sửa ở phần cuối, tôi không thể đăng nó như bình luận vì nó quá dài, tôi cũng chỉ ra vấn đề với mã mà bạn cung cấp ở đây là gì. –

+0

@CrystalMaiden tại sao bạn đã thêm 'ném ngoại lệ'. Phương pháp đó có thể không ném một ngoại lệ. Bạn nên nắm bắt chúng (như tôi đã làm cho 'InterruptedException' và' ExecutionException' – Robin

4

Hãy thử lấy cột đó qua số ResultSet.getBigDecimal() thay vì qua số ResultSet.getString(). Sau đó, bạn lấy số BigDecimal.toPlainString() vào ô bảng của bạn.

Ví dụ:

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

thưa ngài, có một đường màu đỏ không thể tìm thấy biểu tượng: phương thức getPlainString(), tại sao vậy? Và nếu tôi sử dụng Intellisense sau ("pTotalDue") nó chỉ xuất hiện một thứ và đó là getClass() –

+0

Xin lỗi, tên phương thức chính xác là 'toPlainString()' –

3

cố gắng sử dụng một TableCellRenderer.

Triển khai Trình kết xuất và hiển thị Cột bằng Loại tiền trong biểu mẫu bạn muốn.

Kính trọng, HL