2012-02-25 3 views
2

Я пытаюсь использовать PreparedStatement для поиска в SQLite. Заявление работает нормально, но Im получает проблему с PreparedStatement.Проблемы с PreparedStatement - Java

это мой метод поиска:

public void searchSQL(){ 
     try { 
      ps = conn.prepareStatement("select * from ?"); 
      ps.setString(1, "clients"); 
      rs = ps.executeQuery(); 
     } catch (SQLException ex) { 
      ex.printStackTrace(); 
     } 
    } 

но Im получаю эту ошибку:

java.sql.SQLException: near "?": syntax error at org.sqlite.DB.throwex(DB.java:288) at org.sqlite.NestedDB.prepare(NestedDB.java:115) at org.sqlite.DB.prepare(DB.java:114) at org.sqlite.PrepStmt.(PrepStmt.java:37) at org.sqlite.Conn.prepareStatement(Conn.java:231) at org.sqlite.Conn.prepareStatement(Conn.java:224) at org.sqlite.Conn.prepareStatement(Conn.java:213)

ТНХ

+0

Я предполагаю, что вы не собираетесь на самом деле «выбирать» 'в своем реальном коде. Если вы сопоставляете этот результат с объектом, ваша логика нарушит момент, когда кто-то другой внесет изменения в вашу исходную таблицу. – Perception

ответ

4

Столбцы Параметры могут быть? не имя таблицы; Ваш метод должен выглядеть следующим образом:

public void searchSQL() 
{ 
    try 
    { 
     ps = conn.prepareStatement("select * from clients"); 
     rs = ps.executeQuery(); 
    } 
    catch (SQLException ex) 
    { 
     ex.printStackTrace(); 
    } 
} 

Вот если я делаю это так, что он работает нормально, обратитесь к этой функции:

public void displayContentOfTable() 
{ 
    java.sql.ResultSet rs = null; 
    try 
    { 
     con = this.getConnection(); 
     java.sql.PreparedStatement pstatement = con.prepareStatement("Select * from LoginInfo"); 
     rs = pstatement.executeQuery(); 

     while (rs.next()) 
     { 
      String email = rs.getString(1); 
      String nickName = rs.getString(2); 
      String password = rs.getString(3); 
      String loginDate = rs.getString(4); 
      System.out.println("-----------------------------------"); 
      System.out.println("Email : " + email); 
      System.out.println("NickName : " + nickName); 
      System.out.println("Password : " + password); 
      System.out.println("Login Date : " + loginDate); 
      System.out.println("-----------------------------------"); 
     } 
     rs.close(); // Do remember to always close this, once you done 
        // using it's values. 
    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
    }  
} 

Сделать Resultset локальную переменную, вместо переменной экземпляра (как сделано на вашей стороне). И закройте его, как только вы закончите с ним, написав rs.close() и rs = null.

+0

@ Downvoter: Что пошло не так? Пожалуйста, учтите, ваша мудрость. –

+0

thx ,, i did not знаю о именах таблиц – Galla

+0

@ user1232535: Ваше приветствие и продолжайте улыбаться :-) –

3

Имена пропущенных таблиц в подготовленном заявлении невозможны.

Метод setString, когда вы хотите передать переменную в выражении WHERE, например:

select * from clients where name = ? 
+0

thx ,, i did not знаю о именах таблиц – Galla

+0

thx guys ,,, Im не получаю эту ошибку сейчас. Но я не могу получить результаты от ResultSet с помощью PreparedStatement Теперь :( Int xRows = 0; \t в то время как (con_cli.rs.next()) { \t \t \t INT треска = con_cli.rs.getInt (1); \t \t \t имя String = con_cli.rs.getString (2); \t \t \t Строка домашнее животное = con_cli.rs.getString (3); System.out.println ("Код:" + треска + "- имя: «+ имя +» - Домашнее животное: «+ домашнее животное); \t \t \t xRows ++; } System.out.println (xRows + ": найдено.") thx для ответов – Galla

1

ТНХ для ответов ребята ,,, теперь оборотный штраф. Я заметил, что запрос sql can not can? к столбцам тоже. Таким образом, этот запрос будет в PreparedStatement работает:

String sql = "select * from clients where name like ?"; 
ps = conn.prepareStatement(sql); 
ps.setString(1, "a%"); 
rs = ps.executeQuery(); 

, но, если я пытаюсь использовать столбец как SetString, он не работает:

String sql = "select * from clientes where ? like ?"; 
ps = conn.prepareStatement(sql); 
ps.setString(1, "name"); 
ps.setString(2, "a%"): 
rs = ps.executeQuery(); 

я правильно? или как я могу обойти это? thx again

+0

Слишком верно, по столбцам я имею в виду параметры для столбцов, мой плохой я никогда не проверял его снова, ваш первый код - путь записи, чтобы передавать параметры для столбцов. –

+0

thx для ответов Bali. , PreparedStatment не будет делать то, что мне нужно: «( – Galla

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