开发者

Convert Java resultset to String array

I am writing a program that will query an MS access database, return the query as a result set, and then I want to ultimately convert that result set into a String array, so that I can pass it into the constructor of a Swing JComboBox - so the ComboBox will list the items returned by the query.

I have been able to store the rows of the result set into an ArrayList, and then convert that ArrayList into an object array, and the combobox will list the correct items, but as objects. I simply cannot ever cast that ArrayList to a String array. Does anyone know if this is possible? Here is some of my code...

// 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()) {
        Arra开发者_如何转开发yList<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);

Can anyone offer any suggestions? Thanks!


UPDATE:

Here is the stack trace that I am receiving:

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)


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

Is the correct answer. The reason for your exception is that all the objects are in fact not strings.

You need to change this:

   Object value = rs.getObject(i);

to this:

   String value = rs.getString(i);

or this:

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

That last one will need a null check if you can be returning null columns.

Note that the toString() representation may not be exactly what you are looking for in all cases, but it will get you started.

Edit: If you are filling a combo box, you are going to need one column per row, no? If not, you need to represent the whole row as a string in some fashion. Then you put that in the value and put the value directly in the final array list, so your loop needs to look like this:

    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;


Why not use rs.getString(). I will not recommend to do that though. But it would solve your problem. I mean just deal with String from the start. Example,

// 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;
}

Now you need to get it like below.

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

Better still check the type and get the values appropriately, using meta-data you are having. This will help you format data, namely, dates and doubles.


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

The code above will convert List of Strings to String array. Now in your case you are creating List of Objects so you can't directly convert it to the String array. Generally you have 2 choices:

  1. Initially define your List as List of Strings and when populating the List convert your values to Strings (ether by doing Object#toString or extracting/generating meningful String value) and store that into your List, e.g. in your code do this String value = rs.getObject(i).toString();
  2. If you don't do it in step 1 then you will have to allocate a String array, loop through your List, convert current value into String and stick it into array. I would go with option 1.

Just as a side note - methods in Java should start with lowercase letter

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜