准备好的声明错误

时间:2012-04-01 14:41:18

标签: java sql jdbc prepared-statement incompatibletypeerror

最近刚刚出于安全原因将我在SQL中的语句改为准备语句,这就是我想出的内容。

不幸的是,它会在

上出现找不到错误
"SELECT * FROM owner WHERE username = ? AND" + "password = ?;"; 

整个错误:

找不到符号: symbol:方法prepareStatement(java.lang.String) location:类型为HolidayExchange.DBAccess的变量dbAccess

我意识到它应该是一个准备好的陈述时找到一个字符串,但这就是我总是在例子等中看到它。

我可能正在做一些愚蠢的事情,但解决这个问题的任何帮助都会非常有用!

整个方法:

DBAccess dbAccess = new DBAccess();

        String sql = "SELECT * FROM owner WHERE username = '?' AND"+
                " password = '?'";

        PreparedStatement ps = dbAccess.prepareStatement(sql);

        ps.setString(1,u);
        ps.setString(2,p);

        ResultSet rs = dbAccess.executeQuery2(ps);
        User user = new User();
        while (rs.next()){
            user.setFirstname(rs.getString("firstname"));
            user.setSurname(rs.getString("surname"));
            user.setUsername(rs.getString("username"));
            user.setPassword(rs.getString("password"));
        }

        rs.close();
        dbAccess.close();

        if(user.getUsername().length()==0){
            return null;
        }else{
            return user;
        }
    } catch (Exception e) {
        return null;
    }
}`

5 个答案:

答案 0 :(得分:2)

缺少空间

      // becomes ANDpassword in the resulting string:
     "SELECT * FROM owner WHERE username = ? AND" + "password = ?;"; 

应该是

     // space added before passsword:
     "SELECT * FROM owner WHERE username = ? AND" + " password = ?;"; 

答案 1 :(得分:0)

在执行查询之前始终记录ps.toString()。这将让程序员知道实际执行了什么查询。

此外,PreparedStatement不是字符串

连接con = null; 的Class.forName( “com.mysql.jdbc.Driver”); con = DriverManager.getConnection(“jdbc:mysql:localhost:3306 / jdbctutorial”,“root”,“root”); PrepareStatement ps = con.prepareStatement(sqlQuery);

答案 2 :(得分:0)

  

找不到符号:symbol:方法prepareStatement(java.lang.String)   location:类型为HolidayExchange.DBAccess的变量dbAccess

此错误消息没有任何内容与格式不正确的SQL相关。这是一个编译时错误。 HolidayExchange.DBAccess类没有名为prepareStatement的方法,该方法将java.lang.String作为参数。

您的SQL在编译时未经过验证(或评估),因此不能成为编译时错误的原因。一旦你进行编译,你可能会发现在删除问号周围的单引号后,你的查询就可以了。

答案 3 :(得分:0)

如果您将导入com.mysq.jdbc.*;删除并将其更改为 导入java.sql.PreparedStatement;,反之亦然,因为我认为你正在使用的PreparedStatement方法不适合你要连接的数据库。

答案 4 :(得分:-1)

对于每个问号,请尝试在它们周围加上单引号。

 '?'