2012-02-25 91 views
2

我試圖用PreparedStatement來使用我的SQLite搜索。聲明工作正常,但我得到PreparedStatement的問題。PreparedStatement的問題 - Java

這是我的搜索方法:

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

但是我得到這個錯誤:

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)

THX

+0

我假設你不會實際'選擇*'在你的真實代碼。如果您將該結果集映射到Object,那麼您的邏輯將打破別人對源表進行更改的時刻。 – Perception 2012-02-25 13:30:39

回答

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:出了什麼問題?請小心解釋,你的智慧。 – 2012-02-25 13:25:43

+0

thx ,,我不知道表名 – Galla 2012-02-25 20:04:12

+0

@ user1232535:你的歡迎和保持微笑:-) – 2012-02-25 20:12:59

3

在準備的語句中傳遞表名是不可能的。

方法setString是當你想傳遞一個變量在where子句中,例如:

select * from clients where name = ? 
+0

thx ,,我不知道表名 – Galla 2012-02-25 20:03:57

+0

thx球員,,,我現在沒有得到那個錯誤。 但是,我不能使用的PreparedStatement現在:( INT從結果集得到的結果xRows = 0; \t而(con_cli.rs.next()){ \t \t \t INT COD = con_cli.rs.getInt(1); \t \t \t字符串名稱= con_cli.rs.getString(2); \t \t \t字符串寵物= con_cli.rs.getString(3); 的System.out.println( 「鱈魚:」 +鱈魚+「 - 名稱: 「+ name +」 - Pet:「+ pet); \t \t \t xRows ++; } System.out.println(xRows +「:found。「); thx的回覆 – Galla 2012-02-25 20:36:40

1

的答覆傢伙THX ,,, 現在它的工作的罰款。 我注意到sql查詢不能保存?也列。 所以,這個SQL查詢的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再

+0

太真,按列我的意思是列的參數,我不好,我再也沒有檢查過它,你的第一個代碼是寫入方式,要傳遞列的參數 – 2012-02-27 17:50:46

+0

thx回覆巴厘島。 ,PreparedStatment不會做我當時需要的工作:'( – Galla 2012-02-28 00:25:06