PreparedStatement的问题 - Java

时间:2012-02-25 13:20:18

标签: java

我正在尝试将PreparedStatement用于我的SQLite搜索。声明工作正常,但我遇到了PreparedStatement的问题。

这是我的搜索方法:

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“?”:语法错误   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

3 个答案:

答案 0 :(得分: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来关闭它。

答案 1 :(得分:3)

无法在预准备语句中传递表名。

方法setString是您希望在where子句中传递变量的时间,例如:

select * from clients where name = ?

答案 2 :(得分:1)

thx for replylies guys ,,, 现在它的工作正常。 我注意到sql查询不能保持?也是专栏。 所以,这个对PreparedStatement的SQL查询正在运行:

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();

我说错了吗?或者我该如何绕过这个? 再次