2014-02-06 4 views
0

У меня есть этот метод для загрузки объектов, однако, когда я запускаю код sql, он дает мне синтаксическую ошибку.Ошибка Java JDBC Ошибка синхронизации

public void loadObjects() { 
    Statement s = setConnection(); 

    // Add Administrators 
    try { 
     ResultSet r = s.executeQuery("SELECT * FROM Administrator;"); 
     while (r.next()) { 
      Administrator getUser = new Administrator(); 
      getUser.ID = r.getString(2); 

      ResultSet r2 = s.executeQuery("SELECT * FROM Userx WHERE ID= {" + getUser.ID + "};"); 
      getUser.name = r2.getString(2); 
      getUser.surname = r2.getString(3); 
      getUser.PIN = r2.getLong(4); 

      JBDeveloping.users.administrators.add(getUser); 
     } 
    } catch (Exception e) { 
     System.out.println(e); 
    } 

} 

Я попытался вставить фигурные скобки, как указано в других вопросах, но я либо делаю это неправильно или не работает. Этот метод должен иметь возможность загружать всех администраторов, но я считаю, что он вставляет только половину идентификатора. Идентификатор, который он получает, состоит из чисел и символов; пример «26315G»

Ошибка - com.microsoft.sqlserver.jdbc.SQLServerException: неправильный синтаксис около «26315».

Edit -

private java.sql.Connection setConnection(){ 
    java.sql.Connection con = null; 
    try { 
     Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 
     String url = "jdbc:sqlserver://" + host + ";DatabaseName=" + database + ";integratedSecurity=true;"; 
     con = DriverManager.getConnection(url, username, password); 
    } catch(Exception e) { 
     System.out.println(e); 
    } 
    return con; 
} 

public void loadObjects() { 
    java.sql.Connection con = setConnection(); 

    // Add Administrators 
    try { 
     PreparedStatement sql = con.prepareStatement("SELECT * FROM Administrator"); 
     ResultSet rs = sql.executeQuery(); 
     while (rs.next()) { 
      Administrator getUser = new Administrator(); 
      getUser.ID = rs.getString(2); 

      PreparedStatement sql2 = con.prepareStatement("SELECT * FROM Userx WHERE ID=?"); 
      sql2.setString(1, getUser.ID); 
      ResultSet r2 = sql2.executeQuery(); 

      getUser.name = r2.getString(2); 
      getUser.surname = r2.getString(3); 
      getUser.PIN = r2.getLong(4); 

      JBDeveloping.users.administrators.add(getUser); 
     } 
    } catch (Exception e) { 
     System.out.println(e); 
    } 

} 
+0

Какие еще вопросы? Это не синтаксис JDBC, это синтаксис SQL. –

+0

Почему вы используете фигурные скобки '{}'. Попробуйте выполнить запрос таким образом: '' SELECT * FROM Userx WHERE ID = "+ getUser.ID +"; "' без брекетов. – Omoro

+0

Замените '{}' 'на одиночные кавычки '' ', и все будет хорошо, или вместо этого используйте метод' PreparedStatement' и 'setString()'. –

ответ

1

Прежде всего: если вы используете одновременно приводят наборы, вы должен использовать отдельные заявления для каждого из них (вы не можете делиться заявлением s между двумя r и r2). И еще, вам не хватает r2.next(), прежде чем читать из него.

С другой стороны: было бы гораздо эффективнее использовать PreparedStatement в цикле, чтобы переписывать запрос все время.

Так что я бы пойти на что-то вроде этого:

public void loadObjects() { 
    try (
     Statement st = getConnection().createStatement(); 
     //- As you read (later) only id, then why to use '*' in this query? It only takes up resources. 
     ResultSet rs = st.executeQuery("SELECT id FROM Administrator"); 
     PreparedStatement ps = getConnection().prepareStatement("SELECT * FROM Userx WHERE ID = ?"); 
     ResultSet r2 = null; 
    ) { 
     while (rs.next()) { 
      Administrator user = new Administrator(); 
      user.ID = rs.getString("id"); 
      ps.setInt(1, user.ID); 
      r2 = ps.executeQuery(); 
      if (r2.next()) { 
       user.name = r2.getString(2); 
       user.surname = r2.getString(3); 
       user.PIN = r2.getLong(4); 
       JBDeveloping.users.administrators.add(user); 
      } 
      else { 
       System.out.println("User with ID=" + user.ID + " was not found."); 
      } 
     } 
    } 
    catch (Exception x) { 
     x.printStacktrace(); 
    } 
} 

Пожалуйста, обратите внимание, использование Java7 автоматическим закрытием функции (вы не закрывал ресурсы в вас код). И последнее примечание: пока вы не отделяете утверждения в своих запросах, как в документации JDBC, вы не должны размещать ';' в конце инструкций (во всех случаях вам не следует указывать «;» в качестве последнего символа в строке запроса).

+0

неудивительно, что он не работал! я забыл прочитать заявление lol. но другой, то, что, по крайней мере, я изучил подготовленное заявление – Joseph118

+0

. Я использую разные языки каждый день, иногда меня путают, когда и когда не использовать «;». и что вы подразумеваете, не закрывая ресурсы? – Joseph118

+1

Ну, вы не закрыли инструкцию и результирующие наборы. Обычно вы должны использовать конструкцию try-catch-finally и поместить весь код очистки в предложение finally, например. Заявления; ...; try {...;} catch() {...} finally {if (s! = null) {try {s.close()} catch() {}}} --- и то же самое на PreparedStatement, ResultSet и, возможно, объект Connection. – Cromax

0

Вы не должны использовать {}, и вы не должны добавить параметры в запрос SQL, как это.

Удалите фигурные скобки и вместо этого используйте PreparedStatement.

см http://www.unixwiz.net/techtips/sql-injection.html

5

На самом деле это не так, чтобы сделать это в JDBC. Таким образом, даже если вы отсортируете свою синтаксическую ошибку, ваш код подвержен атакам SQL-инъекций.

Правильный путь будет:

// Let's say your user id is an integer 

PreparedStatement stmt = connection.prepareStatement("select * from userx where id=?"); 
stmt.setInt(1, getUser.ID); 
ResultSet rs = stmt.executeQuery(); 

Таким образом, вы охраняются от любых попыток придать SQL в запросе вашего приложения параметры

+0

+1 для PreparedStatement –

+0

Как правило, это правда, обратите внимание, что идентификатор пользователя берется из администратора таблицы, а не из параметров запроса. Но я бы использовал PS так или иначе по другим причинам. – Cromax

+0

поэтому, когда я использую подготовленные заявления?означает открытую переменную, где я должен установить ее позже по порядку? – Joseph118

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