9

私はMSAccessデータベースにクエリを実行し、クエリを結果セットとして返すプログラムを作成しています。その後、最終的にその結果セットを文字列配列に変換して、SwingJComboBoxのコンストラクターに渡すことができるようにします。そのため、ComboBoxはクエリによって返されたアイテムを一覧表示します。

結果セットの行を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);

誰かが何か提案をすることができますか?ありがとう!


アップデート:

これが私が受け取っているスタックトレースです:

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)
4

3 に答える 3

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

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

これを変更する必要があります:

   Object value = rs.getObject(i);

これに:

   String value = rs.getString(i);

またはこれ:

   String value = rs.getObject(i).toString();

null列を返すことができる場合は、最後の1つにnullチェックが必要になります。

toString()表現は、すべての場合に探しているものと正確に一致しない場合があることに注意してください。

編集:コンボボックスを埋める場合、行ごとに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;
于 2009-11-06T02:41:21.560 に答える
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]);

それでも、タイプを確認し、所有しているメタデータを使用して値を適切に取得することをお勧めします。これは、データ、つまり日付と倍精度浮動小数点数をフォーマットするのに役立ちます。

于 2009-11-06T02:45:55.317 に答える
3

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

上記のコードは、文字列のリストを文字列配列に変換します。今あなたの場合、あなたはオブジェクトのリストを作成しているので、それを文字列配列に直接変換することはできません。通常、2つの選択肢があります。

  1. 最初にリストを文字列のリストとして定義し、リストにデータを入力するときに、値を文字列に変換し(Object#toStringを実行するか、意味のある文字列値を抽出/生成することにより)、それをリストに格納します。たとえば、コードでこれを行います。 String value = rs.getObject(i).toString();
  2. 手順1でこれを行わない場合は、文字列配列を割り当て、リストをループし、現在の値を文字列に変換して配列に貼り付ける必要があります。オプション1を使用します。

補足として-Javaのメソッドは小文字で始める必要があります

于 2009-11-06T02:33:05.057 に答える