2009-11-06 35 views
8

私はMSアクセスデータベースをクエリし、結果セットとしてクエリを返し、最終的にその結果セットを文字列配列に変換して渡すことができるプログラムを作成していますそれをSwing JComboBoxのコンストラクタに追加します。そのため、ComboBoxはクエリによって返されたアイテムをリストします。Javaの結果セットを文字列配列に変換する

結果セットの行をArrayListに格納してから、そのArrayListをオブジェクト配列に変換して、コンボボックスに正しい項目をオブジェクトとしてリストすることができました。そのArrayListをString配列にキャストすることはできません。これが可能なら誰でも知っていますか?ここにいくつかのコードがあります...

// Convert the Resultset into an array list 

public ArrayList<ArrayList<Object>> Results2Array(ResultSet rs) throws SQLException { 
    ResultSetMetaData metaData = rs.getMetaData(); 
    int columns = metaData.getColumnCount(); 

    ArrayList<ArrayList<Object>> al = new ArrayList<ArrayList<Object>>(); 

    while (rs.next()) { 
     ArrayList<Object> record = new ArrayList<Object>(); 

     for (int i = 1; i <= columns; i++) { 
      Object value = rs.getObject(i); 
      record.add(value); 
     } 
     al.add(record); 
    } 
    return al; 
} 

// Convert ArrayList to Object Array, and pass into GUI 

ArrayList<String> Locations = new ArrayList<String>(); 
ArrayList<String> Months = new ArrayList<String>(); 
ArrayList<String> Years = new ArrayList<String>(); 

try { 
    DB.loadDriver(); 
    DB.makeConnection(); 
    DB.buildStatement(); 

    Locations = DB.getLocations(); 
    Months = DB.getMonths(); 
    Years = DB.getYears(); 

    Object[] arrLocations = Locations.toArray(); 
    Object[] arrMonths = Months.toArray(); 
    Object[] arrYears = Years.toArray(); 

    dbGUI ui = new dbGUI(arrLocations, arrMonths, arrYears); 
    ui.setVisible(true); 

誰もが提案できますか?ありがとう!


UPDATE:

java.lang.ArrayStoreException 
    at java.lang.System.arraycopy(Native Method) 
    at java.util.Arrays.copyOf(Unknown Source) 
    at java.util.ArrayList.toArray(Unknown Source) 
    at kidsfirstdb.Main.main(Main.java:23) 

答えて

5
String[] arrLocations = locations.toArray(new String[0]); 

が正解です。あなたの例外の理由は、すべてのオブジェクトが実際に文字列ではないということです。

String value = rs.getString(i); 

またはこの:

あなたが返すことができる場合は、最後の1がnullチェックが必要になります
String value = rs.getObject(i).toString(); 

これに

Object value = rs.getObject(i); 

:あなたはこれを変更する必要が

ヌル列。

toString()の表現は、すべての場合であなたが探しているものと正確に同じではない場合がありますが、それはあなたを始めます。

編集:コンボボックスを塗りつぶしている場合は、1行に1列必要ですか?そうでない場合は、行全体を何らかの方法で文字列として表現する必要があります。

ArrayList<String> al = new ArrayList<String>(); 
    while (rs.next()) { 
      ArrayList<String> record = new ArrayList<String>(); 
      for (int i = 1; i <= columns; i++) { 
        String value = rs.String(i); 
        record.add(value); 
      } 
      String value = methodWhichConvertsArrayListToStringTheWayYouNeedItFormatted(record); 
      al.add(value); 
    }   
    return al; 
+0

ご協力いただきありがとうございます。私はあなたが提案したものを試しましたが、私はまだそれらの例外をString [] arrLocations = locations.toArray(new String [0])にしているようです。 – littleK

+0

あなたが気にしないなら、スタックトレースを共有してください。 –

+0

元の投稿にスタ​​ックトレースを追加しました。ありがとうございます。 – littleK

3

String[] arrLocations = locations.toArray(new String[0]);

をコード上の文字列配列に文字列のリストを変換します。ここでは

私は受け付けており、スタックトレースがあります。あなたの場合、あなたはオブジェクトのリストを作成しているので、直接String配列に変換することはできません。

  1. 最初は文字列のリストとするときリストを移入する(オブジェクト#1のtoStringをやったり抽出し、エーテル/ meningful String値を生成する)文字列に自分の価値観を変換し、あなたにそれを保存としてのあなたのリストを定義します。一般的に、あなたは2つの選択肢を持っていますリスト、例えばあなたのコードでこれを行う String value = rs.getObject(i).toString();
  2. もしあなたがステップ1でそれをしないなら、あなたのリストをループし、現在の値をStringに変換して配列に貼り付ける必要があります。私はただ、サイドノートとしてオプション1

となるだろう - のJavaのメソッドは小文字で始めるべきです

+0

は、私はその前に試みたが、それは私に与えていた。 java.lang.ArrayStoreException java.lang.System.arraycopy(ネイティブメソッド)で \tをjava.util.Arrays.copyOfで \t(不明なソース) \t at java.util.ArrayList.toArray(Unknown Source) \t at kidsfirstdb.Main.main(Main.java:23) – littleK

+1

私の延長ポストを参照してください – Bostone

+0

良い仕事DroidIn。しかし、実際には、返されるListはListのリストです。 toString()またはrs.getString()を使用してもメソッドによって返されたListに対してはうまくいかないでしょう。 –

5

rs.getString()を使用しないのはなぜ:次に、あなたは値にし、あなたのループは次のようになりする必要ので、最終的に配列リストに値を直接置くことを置きます。私はそれを行うことをお勧めしません。しかしそれはあなたの問題を解決するでしょう。私は文字列を最初から扱うことを意味します。例:

// Not a good idea to pass a active resultset as a parameter. 
// Use disconnected implementation instead, for example rowset. 
public ArrayList<ArrayList<Object>> results2Array(ResultSet rs) 
      throws SQLException { 
    ResultSetMetaData metaData = rs.getMetaData(); 
    int columns = metaData.getColumnCount(); 

    ArrayList<String[]> list = new ArrayList<String[]>(); 

    while (rs.next()) { 
      String[] record = new String[columns]; 

      for (int i = 1; i <= columns; i++) { 
        // Not a good idea to get everything as a string. This way you will 
        // get a default string representation of objects. Suppose, you 
        // want to format dates and doubles as per some requirement. 
        record[i-1] = rs.getString(i); 
      } 
      list.add(record); 
    } 
    return list; 
} 

次に、このようにする必要があります。

String[][] arrLocations = locations.toArray(new String[locations.size()][0]); 

あなたが持っているメタデータを使用して、タイプを確認して値を適切に取得してください。これはデータ、つまり日付と倍数の書式設定に役立ちます。

関連する問題