2014-11-10 1 views
0

Код для getDbTable() является:как получить один параметр из Resultset в массив строк

public String[][] getDbTable(String vs_name) 
{ 
    int i = 0; 
    String a[][] = new String[3600][16]; 
    System.out.println("datetime is" +d); 
    System.out.println("datetime is" +currentDate); 
    try 
    { 
     con = getConnection(); 


     String sql = "exec vcs_gauge @gauge_name=?,@first_rec_time=?,@last_rec_time=?"; 
     DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
     System.out.println("date is "+df.format(currentDate)); 
     clstmt = con.prepareCall(sql); 
     clstmt.setString(1,"vs1_bag"); 

     clstmt.setString(2, "2014-09-01 10:00:00"); 
     clstmt.setString(3, "2014-09-01 11:00:00"); 

      clstmt.execute(); 
      rs = clstmt.getResultSet(); 



     while (rs.next()) 
     { 
      for(int j=0; j<16; j++) 
      { 
        a[i][j] = rs.getString(j+1); 

      } 

      i++; 
     } 

    } 

    catch(Exception e) 
    { 
     System.out.println("\nException in Display Bean in getDbTable(String code):"+e); 
    } 
    finally 
    { 

     //closeConnection(); 
    } 
    return a; 
} 

Как получить один параметр из ResultSet в String типа массива. Я хочу получить «logtime», который является моим первым столбцом в таблице и сохранит его в String Array. Я попытался следующий код:

public String[] getcahrttime() throws SQLException 
{ 
    getConnection(); 
    getDbTable(vs_name); 
    String[] timeStr = null; 
    while(rs.next()){ 
     char[] time= rs.getString("logtime").toCharArray(); 
     timeStr = new String[time.length]; 
     for (int i=0,len=time.length; i<len; i++){ 
      timeStr[i] = String.valueOf(time[i]); 
     } 
    } 
    System.out.println("time is"+timeStr); 
    return timeStr; 
} 

где getConnection устанавливает соединение и getDbTable(vs_name) возвращает таблицу со всеми столбцами в нем.

Когда я запускаю вышеуказанный код, тогда timestr получает null значение. Как исправить проблему.

+0

Что такое 'rs' /' vs_name', что такое код в 'getConnection' и' getDbTable'? –

+0

Можете прояснить, что вы хотите здесь? Если в базе данных есть три строки, вы хотите, чтобы результат был трехэлементным массивом, причем каждый элемент был значением одной строки? Ваш текущий подход выглядит ... другим. –

+0

Попробуйте использовать отладчик и выполните свой код. Если timeStr равно NULL, это скорее всего из-за чего-то не так, как раньше. Используя выходные трассировки отладчика (System.out.println (yourVariable)) проверьте, соответствуют ли все другие значения вашим ожиданиям. – markus

ответ

2

OK - Ваша первая проблема заключается в том, что для каждой строки, вы сбрасываете переменную timeStr и выбрасываете все, что вы читаете из предыдущих строк. Это явно не сработает. Вместо этого нам нужно инициализировать массив один раз, а затем добавлять к нему (ровно одно значение для каждой найденной строки).

Проблема в том, что массивы должны быть инициализированы с определенным размером - и мы не знаем заранее, сколько строк будет. Один из способов борьбы с этим - сначала запустить запрос count(*), а затем инициализировать массив до этого размера. Или конкретные версии ResultSet могут сообщить вам размер набора, хотя это не гарантируется.

Но самым простым способом является использование только List вместо массива, поскольку они могут быть изменены динамически. Я считаю, что с ними намного проще работать, поэтому он будет проходить как List вплоть до того, что его нужно преобразовать, но здесь я преобразую его в массив для демонстрации.

Asides от легко - нет необходимости возиться с массивами символов:

public String[] getChartTime() throws SQLException 
{ 
    // ... 
    // Earlier lines as before, let's start from the variable 
    final List<String> timeStr = new ArrayList<>(); 
    while(rs.next()) { 
     // Just get the value of the column, and add it to the list 
     timeStr.add(rs.getString("logtime")); 
    } 

    // I would return the list here, but let's convert it to an array 
    return timeStr.toArray(new String[timeStr.size()]); 
} 
+0

Doyle, когда я запускаю свой код, тогда timestr показывается как timestr is []. показано в нем. –

+0

@Andezej Doyle Как напечатать массив timeStr, чтобы я мог проверить, имеются ли правильные значения в массиве timestr или нет. –

+0

Вы хотите вызвать 'Arrays.toString (timeStr)', вместо того, чтобы позволить 'timeStr' быть неявно преобразован в String с помощью собственного метода toString(). Однако я бы посоветовал вам узнать, как использовать отладчик, если вы хотите проверить переменные, чтобы проверить свой код. Println просто не вариант для нетривиальных случаев. –

0

Я думаю, что ваш цикл перепутались. На данный момент вещь делает следующее:

  • возьмите одну строку вашего результирующего набора.
  • взять колонку «logtime» из этой строки
  • создать массив строк, который содержит столько строк, как раз имеет символы (почему?!?)
  • наконец конвертировать каждый символ времени (полукокс массив) в отдельную строку и скопировать эту строку в конкретного элемента в строке массива, так как вы заявляете все в петлю, вся информация будет в течение следующей итерации цикла

I» Предлагаю вам подумать о вас r петлевую структуру снова. Попробуйте использовать отладчик, он покажет вам проблему