将Java结果集转换为String数组

lit*_*leK 9 java swing arraylist resultset

我正在编写一个程序,它将查询MS访问数据库,将查询作为结果集返回,然后我想最终将该结果集转换为String数组,以便我可以将它传递给Swing JComboBox的构造函数 - 所以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);
Run Code Online (Sandbox Code Playgroud)

有人可以提供任何建议吗?谢谢!


更新:

这是我收到的堆栈跟踪:

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)
Run Code Online (Sandbox Code Playgroud)

Yis*_*hai 5

   String[] arrLocations = locations.toArray(new String[0]);
Run Code Online (Sandbox Code Playgroud)

是正确的答案.您的异常的原因是所有对象实际上不是字符串.

你需要改变这个:

   Object value = rs.getObject(i);
Run Code Online (Sandbox Code Playgroud)

对此:

   String value = rs.getString(i);
Run Code Online (Sandbox Code Playgroud)

或这个:

   String value = rs.getObject(i).toString();
Run Code Online (Sandbox Code Playgroud)

如果您可以返回空列,那么最后一个将需要空检查.

请注意,在所有情况下,toString()表示可能并不完全符合您的要求,但它会让您入门.

编辑:如果你正在填写一个组合框,你每行需要一列,不是吗?如果没有,您需要以某种方式将整行表示为字符串.然后你把它放在值中并将值直接放在最终的数组列表中,所以你的循环需要如下所示:

    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;
Run Code Online (Sandbox Code Playgroud)

  • 因为你返回的ArrayList不是String的列表,而是ArrayList的列表,并且ArrayList最终有字符串. (2认同)

Ade*_*ari 5

为什么不使用rs.getString().我不建议这样做.但它会解决你的问题.我的意思是从一开始就处理String.例,

// 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;
}
Run Code Online (Sandbox Code Playgroud)

现在你需要得到它,如下所示.

String[][] arrLocations = locations.toArray(new String[locations.size()][0]);
Run Code Online (Sandbox Code Playgroud)

最好还是使用您拥有的元数据检查类型并适当地获取值.这将帮助您格式化数据,即日期和双打.