2012-02-21 3 views
0

데이터베이스의 테이블 목록을 검색하고 Vector에 저장하려고합니다. 그런 다음 Vector를 반복합니다. 버튼 동작 명령이 요소 중 하나 (예 : 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

당신은 '의 (의 직접 String 추가하는 대신)을 allTables 벡터로의'의 Vector를 추가하고, 따라서 그것은에 allways 비교를 실패합니다. tableList을 제거하십시오.

0

특정 목적 (멀티 스레드 동기화)이 없으면 Iterator 구문도 필요하지 않지만 (여전히 사용할 수 있음) 새로운 코드에서는 실제로 사용하지 말아야합니다. VectortoUpperCase으로 전화를 걸었으나 equalsIgnoreCase으로 전화를 걸 수도 있습니다.

즉, Vectoritr.next()이고 그 다음은 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) 방법을 사용하려면 여기를 반복자로 갈 수

결과, 카운터를 사용합니다. IMHO 위의 내용은 읽기가 더 쉽습니다.

+0

빠른 응답을 보내 주셔서 감사합니다. 나는 stackoverflow 자바에 관한 답변을 찾는 내 주요 리소스라고 행복 해요. 당신은 내 문제를 해결했습니다. 나는 ArrayList를 사용했다. 하나의 문제가 남아 있지만 짧은 시간에 몇 번씩 버튼을 클릭하면 서버에서이 오류 메시지가 나타납니다. "각 이벤트가 끝난 후에도 연결이 너무 많습니다." – arjang27

+0

@ arjang27 - 위의 코드에서 결과 집합을 닫는 중입니다.하지만이 오류는 db 자체에 대한 연결에 대한 것입니다. 나는 당신이 연결 ('conn' 객체)을 여는 것을 알지 못하지만, 이전 연결을 닫지 않고 여러 번하고있는 것처럼 들린다. –