2012-05-30 81 views
0

我正試圖在JTable中顯示數據庫中的數據。如何從JTable中的數據庫中獲取數據?

這是我的我的主類的ActionListener的一部分......

if(e.getSource()==jjb) 
{ 
    String j[] = null; 
    Vector r = new Vector(); 
    Vector finl = new Vector(); 
    try 
    { 
     d10.connection(); 
     int b = d10.getclmncnt(); 
     for(int g = 1; g<=b+1;g++) 
     { 
      j = new String[g]; 

     } 
     for(int g = 1; g<=b;g++) 
     { 
      j[g] = d10.gettableclmn(g); 
     } 
     Vector v = new Vector(); 
     for(int g = 1; g<=b;g++) 
     { 
      v.addElement(j[g]); 
     } 
     int a = d10.getrwcnt(); 
     System.out.println("no of rows are :::: "+a); 

     r = d10.getalldata(b); 

     JTable t = new JTable(r,v); 
     t.setLayout(null); 
     TableColumn tc; 
     for(int hh = 0;hh<t.getColumnCount();hh++) 
     {    
      tc = t.getColumnModel().getColumn(hh); 
      tc.setWidth(75); 
     } 
     JScrollPane js = new JScrollPane(t); 

     js.setBounds(10, 100, 1000, 500); 
     p5.add(js); 
     p5.repaint(); 
    } 
    catch (ClassNotFoundException e1) 
    { 
     e1.printStackTrace(); 
    } 
    catch (SQLException e1) 
    { 
     e1.printStackTrace(); 
    } 
} 

這是我與數據庫連接類...

public void connection()throws SQLException, ClassNotFoundException 
{ 
    Class.forName("oracle.jdbc.driver.OracleDriver"); 
    System.out.println("Driver Loaded"); 
    Properties p = new Properties(); 
    p.setProperty("user","system"); 
    p.setProperty("password", "oracle10"); 
    p.setProperty("url","jdbc:oracle:thin:@Suneel-PC:1521:XE"); 
    c = DriverManager.getConnection(p.getProperty("url"),p.getProperty("user"),p.getProperty("password")); 
    System.out.println("connected"); 
} 

public String gettableclmn(int b2) 
{ 
    String s = null; 
    int fh = b2; 
    try 
    { 
     Statement ss = c.createStatement(); 
     ResultSet rs = ss.executeQuery("select * from data"); 
     ResultSetMetaData rsmd = rs.getMetaData(); 
     s = rsmd.getColumnName(fh); 
     System.out.println("columns names are  "+rsmd.getColumnName(fh));   
    } 
    catch (SQLException e) 
    { 
     e.printStackTrace(); 
    } 

    return s; 
} 

public int getclmncnt() 
{ 
    int h = 0; 

    ResultSetMetaData rsmd; 
    try { 
     Statement ss = c.createStatement(); 
     ResultSet rs = ss.executeQuery("select * from data"); 
     rsmd = rs.getMetaData(); 
     h = rsmd.getColumnCount(); 
    } 
    catch (SQLException e) 
    { 
     e.printStackTrace(); 
    } 

    return h; 
} 

public Vector getalldata(int b) 
{ 
    int d = b; 
    String j = null; 
    Vector rr = new Vector(); 
    Vector v = new Vector(d); 
    try 
    { 
     Statement s = c.createStatement(); 
     ResultSet r = s.executeQuery("select * from data"); 

     while(r.next()) 
     { 
      v.add(r.getInt(1)); 
      v.add(r.getInt(2)); 
      v.add(r.getInt(3)); 
      v.add(r.getInt(4)); 
      v.add(r.getInt(5)); 
      v.add(r.getInt(6)); 
      v.add(r.getInt(7)); 
      v.add(r.getInt(8)); 
      v.add(r.getInt(9)); 
      v.add(r.getInt(10)); 
      v.add(r.getInt(11)); 
      v.add(r.getString(12)); 
     } 
     rr.add(v); 
    } 
    catch (SQLException e) 
    { 
     e.printStackTrace(); 
    } 

    return rr; 
} 

public int getrwcnt() 
{ 
    ResultSet r; 
    int j = 0; 
    try 
    { 
     Statement s = c.createStatement(); 
     r = s.executeQuery("select count (*) from data"); 
     r.next(); 
     j = r.getInt(1); 
    } 
    catch (SQLException e) 
    { 
     e.printStackTrace(); 
    } 

    return j; 
} 

當我運行此代碼,只第一個結果顯示在JTable中,但是當我撥打function d10.getrwcnt();時,它將輸出爲79行。我的代碼有什麼問題?

+2

你能把硬編碼數據插入表動態?你能否成功地列出數據庫的輸出(例如命令行)?這看起來像是兩個不同的問題。另外,爲了更快地獲得更好的幫助,請發佈[SSCCE](http://sscce.org/)。 –

回答

1

移動的第一行和最後一行,

Vector v = new Vector(d); 
    .... 
    while(r.next()) { 
     v.add(r.getInt(1)); 
     v.add(r.getInt(2)); 
     ... 
     v.add(r.getString(12)); 
    } 

    rr.add(v); 

內循環,如下,

while(r.next()) { 
     Vector v = new Vector(d); 
     v.add(r.getInt(1)); 
     v.add(r.getInt(2)); 
     ... 
     v.add(r.getString(12)); 

     rr.add(v); 
    } 

而且,我可以看到你的代碼是相當FUBAR,請不要不介意。您可以連接適當做一些事情,

  • 新政,嘗試使用一些連接池API
  • 閉上你的resultSet使用Vector使用
  • 停止後,用ArrayList代替,尤其是當向量不提供任何目的
  • 嘗試使用Java命名約定
  • 使用有意義的變量,而不是bgj等符合..
+0

我嘗試了你的建議。但仍然不能正常工作....以前只有第一行被添加到JTable中。現在同一行正在重複,直到行數被佔用。 – shounak

+0

@shounak:更新了我的答案。我希望現在可以工作。 –

1

你的問題是getalldata方法的循環。

Vector v = new Vector(d); 
    try { 

     Statement s = c.createStatement(); 
     ResultSet r = s.executeQuery("select * from data"); 

     while(r.next()) 
     //Every time when this loop gets executed you are adding 
     //data to the same vector v, instead one instance depicts one row in database, 
     //so you will have to create a new instance everytime. 
     { 
      v = new Vector(d); //create an instance for every row in database. 
      v.add(r.getInt(1)); 
      v.add(r.getInt(2)); 
      v.add(r.getInt(3)); 
      v.add(r.getInt(4)); 
      v.add(r.getInt(5)); 
      v.add(r.getInt(6)); 
      v.add(r.getInt(7)); 
      v.add(r.getInt(8)); 
      v.add(r.getInt(9)); 
      v.add(r.getInt(10)); 
      v.add(r.getInt(11)); 
      v.add(r.getString(12)); 
      rr.add(v); // add the values here 
     } 



    } catch (SQLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
+0

感謝它工作成功! – shounak

+0

看看[this](http:// stackoverflow。com/questions/10620448 /最簡單代碼填充-jtable-from-resultset/10623543#10623543)我的答案 – mprabhat

1

只有 點,因爲您沒有搜索一些關於如下

  • 矢量是如何工作的

  • JTable中是如何工作的

  • LayotManagers如何工作

  • 相關閱讀問題(右下角)

  • 不推倒重來,搜索ResultSetTableModel或TableFromDatabase

  • 你有問題與併發性在Swing