2011-06-13 68 views
0

我试图用PreparedStatemnent执行脚本:问题的SQL和问号

import java.sql.*; 

public class DeclaredStatement { 

    public static void main(String[] args) throws SQLException { 

    try {  
     Class.forName("com.mysql.jdbc.Driver"); 
     Connection conn = 
     DriverManager.getConnection("jdbc:mysql://localhost/test"); 
     PreparedStatement stmt = conn.prepareStatement("" 
     + "SELECT TITLE FROM MOVIES" 
     + "WHERE year_made >= ? " 
     + "and year_made < ?"); 

     for (int decadeStart=1920;decadeStart<2000;decadeStart+=10) { 
     System.out.println("==== Movies of the " + decadeStart + "s ===="); 
     stmt.setInt(1, decadeStart); 
     stmt.setInt(2, decadeStart+10); 
     ResultSet rs = stmt.executeQuery(); 
     while (rs.next()) { 
      System.out.println(rs.getString(1)+" - "+rs.getInt(2)); 
     } 
     } 

    } catch (SQLException e) { 
     e.printStackTrace(); 
    } catch (ClassNotFoundException ex) { 
     ex.printStackTrace(); 
    } 

    } 

} 

的错误是:

run: 
==== Movies of the 1920s ==== 
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '>= 1920 and year_made < 1930' at line 1 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:409) 
    at com.mysql.jdbc.Util.getInstance(Util.java:384) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1054) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3566) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3498) 
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1959) 
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2113) 
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2568) 
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2113) 
    at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2275) 
    at client.DeclaredStatement.main(DeclaredStatement.java:26) 
BUILD SUCCESSFUL (total time: 0 seconds) 
+0

年份列的类型是什么? – pap 2011-06-13 06:52:54

+0

此外,System.out.println(rs.getString(1)+“ - ”+ rs.getInt(2))应该失败,因为您只从表中选择一列。 – pap 2011-06-13 06:53:27

回答

7

当您建立查询时,看起来不像您在MOVIESWHERE之间有一个空格,这将导致SELECT TITLE FROM MOVIESWHERE year_made...

+0

这总是我在调试过程中遇到SQL错误以获取实际语句字符串并尝试在查询工具中执行它的第一步... – 2011-06-13 06:57:47

+0

是的,它总是我的第一步。在这种情况下,我可能不会将语句字符串拆分成3行,然后在发生问题之前可能会发现问题! – 2011-06-13 07:00:29

+0

谢谢大家 – 2011-06-13 07:02:15

2

你缺少空间后

SELECT TITLE FROM MOVIES 

之前WHERE