2012-02-21 8 views
0

データベース内のテーブルのリストを取得し、Vectorに格納しようとしています。私はVectorを繰り返し処理したいと思っています。 Buttonアクションコマンドが要素の1つ(つまり、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ベクトルにS」のVectorを追加しているので、それがオールウェイズ比較が失敗します。 tableListを削除してください。

0

特定の目的(マルチスレッド同期)がなく、Iterator構造も必要でない(ただし、まだ使用できる)場合を除き、実際にはVectorを新しいコードで使用しないでください。 toUpperCaseに電話していますが、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がjavaに関連する答えを見つけるための私の主なリソースだと言ってうれしい。あなたは私の問題を解決しました。私はArrayListを使用しました。しかし、残っている問題が1つあります。短時間でボタンを数回クリックすると、このエラーが発生します。「サーバーからのメッセージです。 – arjang27

+0

@ arjang27 - 上記のコードで結果セットを終了していますが、そのエラーはdb自体への接続についてのものです。私はあなたが接続( 'conn'オブジェクト)をどこで開いているのか分かりませんが、以前のものを閉じずに何度もやっているように聞こえます。 –

関連する問題