2009-11-06 56 views
8

我写一个程序,将查询MS Access数据库,返回查询结果集,然后我想最终转换是结果集到一个String数组,所以我可以通过它进入Swing JComboBox的构造函数 - 所以ComboBox将列出查询返回的项目。将Java结果集为String数组

我已经能够存储结果集到一个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]); 

是正确的答案。你的例外的原因是所有的对象实际上不是字符串。

您需要更改此:

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; 
+0

感谢您的帮助。我尝试了你的建议,而且我似乎仍然在String [] arrLocations = locations.toArray(new String [0])上获取这些异常。 – littleK 2009-11-06 02:54:01

+0

现在如果您不介意,请分享堆栈跟踪。 – 2009-11-06 03:02:25

+0

我添加了堆栈跟踪到原来的帖子,谢谢。 – littleK 2009-11-06 03:16:04

3

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

上面的代码,将转换的字符串列表到字符串数组。现在在你的情况下,你正在创建对象列表,所以你不能直接将它转换为字符串数组。一般来说,你有两个选择:

  1. 最初定义列表作为字符串列表,并填充列表时(通过执行对象#的toString或提取/生成meningful字符串值醚)的值转换为字符串,并存储到您的列表,例如在你的代码中这样做 String value = rs.getObject(i).toString();
  2. 如果你没有在第1步做,那么你将不得不分配一个字符串数组,循环你的List,将当前值转换为String并将其粘贴到数组中。我会去的选项1

正如一个侧面说明 - 在Java方法应该以小写字母开头

+0

我试过面前,这是给我一个: java.lang.ArrayStoreException \t在java.lang.System.arraycopy(本机方法) \t在java.util.Arrays.copyOf(来源不明) \t at java.util.ArrayList.toArray(Unknown Source) \t at kidsfirstdb.Main.main(Main.java:23) – littleK 2009-11-06 02:36:03

+1

看到我的扩展后文章 – Bostone 2009-11-06 05:15:35

+0

很好的工作DroidIn。但事实是,返回的列表是List列表。即使我们使用toString()或rs.getString()。它不适用于该方法返回的列表。 – 2009-11-06 06:42:43

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]); 

更好的是使用您正在使用的元数据来检查类型并正确获取值。这将帮助您格式化数据,即日期和双打。