2015-10-04 2 views
0

Я пытаюсь получить данные из таблицы mysql. Мой запрос возвращает одно значение, когда я запускаю его вручную на phpmyadmin, но когда я запускаю код Java, он дает пустой набор. Это запрос:Ошибка при извлечении из набора результатов

SELECT real_name 
from doctorlogin 
where password='1234' and id='X11111X'; 

Код:

public ArrayList<ArrayList<String>> query(String statement) throws SQLException { 
    ResultSet rs = stmt.executeQuery(statement); 
    int numcols = rs.getMetaData().getColumnCount(); 
    ArrayList<ArrayList<String>> result = new ArrayList<ArrayList<String>>(); 
    if (rs.isBeforeFirst()) { 
     do { 
      ArrayList<String> row = new ArrayList<String>(); // new list per row 
      int i = 0; 
      while (i <= numcols) { // don't skip the last column, use <= 
       row.add(rs.getString(i++)); 
      } 
      result.add(row); // add it to the result 
     } while (rs.next()); 
    } 

    return result; 
} 

public String login(String username, String password, String domain) throws SQLException { 
    String query = "SELECT real_name from " + domain + "login where password='" + password + "' and id='" + username + "';"; 
    System.out.println(query); 
    ArrayList<ArrayList<String>> r = query(query); 

    if (r.size() > 1 || r.size() == 0) 
     return "Login Failed"; 
    else 
     return r.get(0).get(0); 
} 

После внесения редактировать код еще не принести никакого результата, даже если я получаю одну строку в PHPMyAdmin.

public ArrayList<ArrayList<String>> query(String statement) throws SQLException { 
    ResultSet rs = stmt.executeQuery(statement); 
    int numcols = rs.getMetaData().getColumnCount(); 
    ArrayList<ArrayList<String>> result = new ArrayList<ArrayList<String>>(); 
    while (rs.next()) { 
     ArrayList<String> row = new ArrayList<String>(); // new list per row 
     for (int i = 1; i <= numcols; i++) { 
      row.add(rs.getString(i)); 
     } 
     result.add(row); // add it to the result 
    } 
    return result; 
} 

Скриншоты запроса на PHPMyAdmin ->https://drive.google.com/drive/folders/0B_yqoCAAV2rFdDZqUzlmeXljNWs

+0

Что такое stracktrace? Вы пытались использовать rs.next() вместо if (rs.isBeforeFirst())? –

+0

Код не входит в цикл while. –

+0

Вы уверены, что не получаете SQLException? – RealSkeptic

ответ

0
row.add(rs.getString(i++)); 

должен быть изменен на

row.add(rs.getString(++i)); 

Поскольку строка 0 не доступна. Счетчик строк начинается с 1.

Во втором коде увеличивается инкремент до получения объекта из БД, поэтому первое значение равно 1.

2

Вы не можете получить информацию из строки перед вызовом rs.next(). Таким образом, обычный формат ResultSet петли просто

while (rs.next()) { 
    // Retrieve the column values 
} 

Там нет необходимости для if заявления там. Если нет возвращенных строк, то if является ложным, и вы вернете пустой список. Но то же самое верно для простых while выше. Нет необходимости в do...while() - вам сначала нужно переместить курсор, а затем прочитать значения.

И, наконец, столбцы индексируются от 1, а не от 0. Таким образом, ваш i должен начинаться с 1. Но почему бы не заменить его на цикл for вместо while?

while (rs.next()) { 
    ArrayList<String> row = new ArrayList<String>(); // new list per row 
    for (int i = 1; i <= numcols; i++) { 
     row.add(rs.getString(i)); 
    } 
    result.add(row); // add it to the result 
} 

Вы должны прочитать ResultSet documentation как информация все там.

Смежные вопросы