2009-11-06 3 views
8

MS 액세스 데이터베이스를 쿼리하고 결과 집합으로 쿼리를 반환 한 다음 결과 집합을 궁극적으로 String 배열로 변환하여 전달할 수있는 프로그램을 작성하고 있습니다. Swing JComboBox의 생성자에 추가합니다. ComboBox는 쿼리에서 반환 한 항목을 나열합니다.Java 결과 집합을 문자열 배열

결과 집합의 행을 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]); 

가 정답입니다. 예외의 이유는 모든 오브젝트가 실제로 문자열이 아니기 때문입니다. 당신이 반환 할 수있는 경우 마지막에 null 체크가 필요합니다

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

그건 :

String value = rs.getString(i); 

하거나이에

Object value = rs.getObject(i); 

:

는이 작업을 변경해야 null 열.

모든 경우에 toString() 표현이 정확하게 찾을 수는 없지만 시작할 수는 있습니다.

편집 : 콤보 상자를 작성하는 경우 행당 하나의 열이 필요합니까? 그렇지 않으면 전체 행을 어떤 방식 으로든 문자열로 나타낼 필요가 있습니다.그런 다음 그 값에 루프가 같이 할 필요가 있으므로, 최종 배열 목록에 값을 직접 넣어 넣어 : rs.getString를

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

+0

괜찮 으면 스택 추적을 공유하십시오. –

+0

스택 추적을 원래 게시물에 추가했습니다. 감사합니다. – littleK

3

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

위의 코드는 문자열 배열에 문자열의 목록을 변환합니다. 이제는 List of Objects를 작성하여 String 배열로 직접 변환 할 수 없습니다. 일반적으로 당신이 개 선택할 수 있습니다

  1. 이 처음 문자열 목록으로 목록을 정의하고 목록을 채우는 경우 (meningful 문자열 값을 생성/개체 #의 toString을 수행하거나 추출하여 에테르) 문자열로 값을 변환 및로 그를 저장하여 목록, 예 귀하의 코드에서 이것을 수행 String value = rs.getObject(i).toString();
  2. 만약 당신이 1 단계에서 그것을하지 않으면 문자열 배열을 할당하고, 목록을 반복하며, 현재 값을 String으로 변환하고 그것을 배열에 집어 넣어야합니다. 나는 그냥 보조 노트와 같은 옵션 1.

와 함께 갈 것 - 자바 방법은 소문자로 시작해야

+0

나는 그 전에 시도, 그것은 나에게주고 있었다 : java.lang.ArrayStoreException java.lang.System.arraycopy (기본 방법)에서 \t을 java.util.Arrays.copyOf에서 \t (알 수없는 소스) \t at java.util.ArrayList.toArray (알 수없는 출처) \t at kidsfirstdb.Main.main (Main.java:23) – littleK

+1

내 게시물을 참조하십시오. – Bostone

+0

좋은 직장 DroidIn. 그러나 반환 된 목록은 목록 목록입니다. toString() 또는 rs.getString()을 사용하는 경우에도 마찬가지입니다. 메서드에 의해 반환 된 List에서는 작동하지 않습니다. –

5

왜 사용하지(). 나는 그것을하는 것을 추천하지 않을 것이다. 그러나 그것은 당신의 문제를 해결할 것입니다. 처음부터 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]); 

더 나은 메타 데이터를 사용하여 유형을 확인하고 값을 적절하게 얻는 것이 좋습니다. 이렇게하면 데이터, 즉 날짜와 복식을 포맷하는 데 도움이됩니다.