【问题标题】:how to solve com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: Table 'task4DB.tst' doesn't exist exceptions如何解决 com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: Table 'task4DB.tst' 不存在异常
【发布时间】:2013-06-14 18:11:49
【问题描述】:

我是一名学生,我尝试编写此代码以显示存储在“mysql”服务器上的数据库中的员工的名字,尽管该表存在,但我遇到了这些异常! :

com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: 表 'task4DB.tst' 不存在 在 com.mysql.jdbc.SQLError.createSQLException(SQLError.java:936) 在 com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2985) 在 com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1631) 在 com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1723) 在 com.mysql.jdbc.Connection.execSQL(Connection.java:3283) 在 com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1332) 在 com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1467)

如何解决这些问题 :( ??

public static void search() throws ClassNotFoundException, SQLException

{    
     Class.forName("com.mysql.jdbc.Driver");

    Connection con = DriverManager.getConnection("jdbc:mysql://localhost/task4DB?"
              + "user=root&password=123");

   PreparedStatement st = con.prepareStatement("select * from tst");

    ArrayList<String> fName = new ArrayList<String>();
    ArrayList<String> lName = new ArrayList<String>();
    ArrayList<Integer> ids = new ArrayList<Integer>();


    ResultSet RS=st.executeQuery("select * from tst ");

      loop1:
    for(String s : fName )

    {

          while (RS.next()) {
fName.add(RS.getString("fName"));


    }

      for(int i=0;i<fName.size();i++ )

      {
          System.out.println(fName.get(i));

      }

}

【问题讨论】:

    标签: java mysql jdbc


    【解决方案1】:

    应该是con.prepareStatement("THE_SQL_QUERY")

    【讨论】:

    • 类似这样的东西:PreparedStatement st = con.PreparedStatement();
    • prepareStatement 没有无参数重载 - OP 需要将 SQL 提供给 prepareStatement,然后在调用 executeQuery提供它。换句话说,我认为这个答案不够详细,无法提供帮助。
    • 即使在更改之后,在 OP 的代码运行之前还有很多工作要做。看我的回答。
    • 是的.. 下次会尝试详细说明:) 我想我不需要在你详细回答之后编辑我的答案
    【解决方案2】:

    createStatement 不会返回 PreparedStatment - 它会返回 Statement。您需要将 SQL 传递给 prepareStatement 方法:

    PreparedStatement st = con.prepareStatement("select * from tst");
    

    然后:

    ResultSet rs = st.executeQuery();
    

    虽然您可以仍然调用采用 SQL 的 executeQuery 的重载,但您通常不应该这样做。 (我认为让PreparedStatement 扩展Statement 可能是一个错误。)

    请注意,您还应该关闭 finally 块中的连接、语句和结果集。此外,我已经重命名了您的 RS 变量以在一定程度上遵循 Java 命名约定,尽管我可能只是将其称为 results 或类似名称。

    此外,您的循环已损坏 - fName 是空的,因此循环它没有意义。你可能想要:

    while (rs.next()) {
        fName.add(rs.getString("fName"));
    }
    

    【讨论】:

    • 谢谢你,我认为这个答案很有帮助,但是当我更改代码时,我遇到了这些异常“请参阅帖子”
    • @Akari:这个异常对我来说似乎是不言自明的——您尝试查询的表不存在。
    • 但它已经存在 :( 在 task4DB 中,我使用 mysql 工作台填充了这个表
    • @Akari:好吧,例外情况并非如此。非常仔细地检查表名。对此我们无能为力。
    猜你喜欢
    • 2017-03-17
    • 1970-01-01
    • 2021-11-07
    • 1970-01-01
    • 2013-09-14
    • 2013-10-13
    • 1970-01-01
    • 2018-01-09
    • 2012-07-19
    相关资源
    最近更新 更多