我正在编写一个程序,它将查询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);
任何人都可以提供任何建议吗?谢谢!
更新:
这是我收到的堆栈跟踪:
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)
答案 0 :(得分:5)
String[] arrLocations = locations.toArray(new String[0]);
答案是否正确?您的异常的原因是所有对象实际上都不是字符串。
你需要改变这个:
Object value = rs.getObject(i);
到此:
String value = rs.getString(i);
或者这个:
String value = rs.getObject(i).toString();
如果您可以返回空列,那么最后一个将需要空检查。
请注意,在所有情况下,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;
答案 1 :(得分: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;
}
现在你需要得到如下所示。
String[][] arrLocations = locations.toArray(new String[locations.size()][0]);
最好还是使用您拥有的元数据检查类型并正确获取值。这将有助于您格式化数据,即日期和双打。
答案 2 :(得分:3)
String[] arrLocations = locations.toArray(new String[0]);
上面的代码会将字符串列表转换为字符串数组。现在,在您的情况下,您正在创建对象列表,因此您无法直接将其转换为String数组。通常,您有两种选择:
String value = rs.getObject(i).toString();
正如旁注 - Java中的方法应以小写字母
开头