2012-02-21 62 views
0

我试图检索数据库中的表的列表并将它们存储在Vector中。然后我希望遍历Vector。如果Button动作命令匹配其中一个元素(即actioncommand = dbTable),我将从代码中其他位置的选定表中检索数据。ActionCommand和Vector

到目前为止,我能够得到一张表的矢量列表。但是,当我执行我的if语句时,我没有得到任何结果。如果有人指导我如何解决问题,我将不胜感激。谢谢。

public void actionPerformed(ActionEvent e) { 
    String actionCMD = e.getActionCommand(); 
    for (Iterator itr = allTables.iterator();itr.hasNext();){ 
     if(actionCMD.toUpperCase().equalsIgnoreCase(   
       itr.next().toString().toUpperCase())){ 
      dbTable = ationCMD; 
      break; 
     } 
    } 
} 

public void getDBTables(){ 
    try { 
      DatabaseMetaData md = conn.getMetaData(); 
      ResultSet resultset = md.getTables(null, null, "%", null); 
      this.rs = resultset; 
      allTables = new Vector(); 
      while (rs.next()) {    
       tableList = new Vector(); 
       tableList.addElement(rs.getString(3)); 
       allTables.addElement(tableList); 
      }// end while 
    } catch (SQLException ex) { 
      Logger.getLogger(TableModel.class.getName()).log(Level.SEVERE, null, ex); 
    } finally{ 
     if (rs != null) { 
      try { 
       rs.close(); 
      } catch (SQLException ex) { 
       Logger.getLogger(Menu.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     } 
    } 
} 

回答

0

你加入Vector年代到allTables矢量(而不是直接添加String的),因此它将永诺失败的比较。消除tableList

0

除非您有特定的目的(多线程同步),并且Iterator构造也不是必需的(但仍然可以使用),否则您确实不应该在新代码中使用Vector。您还打电话给toUpperCase,但也叫equalsIgnoreCase

这就是说,因为它是通过itr.next()Vector然后调用toString()就可以了。这永远不会匹配。您需要遍历Vector中的String。你还需要一种方法来摆脱外环的,一旦你匹配

boolean found = false; 
for (Iterator itr = allTables.iterator();itr.hasNext() && !found;) { 
    Vector v = itr.next(); 
    for (Iterator itr2 = v.iterator(); itr2.hasNext() && !found;) {  
     if(actionCMD.equalsIgnoreCase(itr2.next().toString())) { 
      dbTable = ationCMD; 
      found = true; 
     } 
    } 
} 

现代的方法来完成,这将是使用一个ArrayList<ArrayList<String>>

List<List<String>> allTables; 
... 
allTables = new ArrayList<ArrayList<String>>(); 
... 
tableList = new ArrayList<String>(); 

而且你的循环如下所示:

for (List<String> tables : allTables) 
{ 
    for (String s : tables) 
    { 
     if (actionCMD.equalsIgnoreCase(s)) // Why up-case? You're ignoring case 
     { 
      dbTable = ationCMD; 
      found = true; 
      break; 
     } 
    } 
    if (found) 
     break; 
} 

你也可以仍与这里的迭代器去消除if (found)声明,或使用List.get(index)方法来达到同样的结果,使用计数器。恕我直言,上述只是更容易阅读。

+0

非常感谢您的快速回复。我很高兴地说,stackoverflow是我找到有关java的答案的主要资源。你解决了我的问题。我使用ArrayList。有一个问题仍然存在,那就是当我在短时间内几次点击按钮时,我得到这个错误“来自服务器的消息:”尽管在每个事件之后关闭连接,但连接“太多”! – arjang27 2012-02-21 02:12:35

+0

@ arjang27 - 你在上面的代码中关闭了你的结果集,但是那个错误是在讨论与db本身的连接。我不知道你打开连接的位置('conn'对象),但是听起来好像你在多次关闭连接而没有关闭连接。 – 2012-02-21 02:24:09