【问题标题】:SQLException Error Says Existing Column Doesn't ExistSQLException 错误说现有列不存在
【发布时间】:2015-05-03 23:06:02
【问题描述】:

运行 searchQuery 时,我收到一条 SQLException 错误,提示无法找到我的列之一。这非常令人困惑,因为我在代码前面引用了该列,并且程序可以在该点找到该列。我的语法有问题吗?谢谢!

public void createDB(){    
    String createCharTableSQL = "CREATE TABLE CosplayCharacter (" +
                "CharacterID int NOT NULL primary key GENERATED ALWAYS " +
                "AS IDENTITY (START WITH 1, INCREMENT BY 1), " +
                "name varchar(60) not null," +
                "gender varchar(10)," +
                "genreID int, " +
                "universeID int, " +
                "mediaID int, " +
                "description varchar(60))";

      statement.executeUpdate(createCharTableSQL);
}

public void insertCharacter(){    
  String fetchAllDataSQL = "SELECT * from CosplayCharacter";


    //Code can find the universeID column here
        resultSet = statement.executeQuery(fetchAllDataSQL);
        while (resultSet.next()) {
            String name = resultSet.getString("name");
            int universeCharID = resultSet.getInt("universeID");

            System.out.println("Character Name : " + name +
                    " UniverseID : " + universeCharID);
        }
}

//But returns error here
public void searchCharacter(String characterName){
    String fetchAllDataSQL = "SELECT * from CosplayCharacter where name = '" + characterName +"'";

        resultSet = statement.executeQuery(fetchAllDataSQL);
        while (resultSet.next()) {
            String gender = resultSet.getString("gender");
            int genreID = resultSet.getInt("genreID");
//Method to search a column in a joined table; no error
            String genreName = getGenreName(genreID);
            int universeID = resultSet.getInt("universeID");
   }
}

堆栈跟踪:

 java.sql.SQLException: Column 'universeID' not found.
at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown  
Source)
at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown Source)
at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown Source)
at org.apache.derby.impl.jdbc.EmbedConnection.newSQLException(Unknown Source)
at org.apache.derby.impl.jdbc.ConnectionChild.newSQLException(Unknown Source)

【问题讨论】:

  • 您能提供一个最小的工作示例吗?我不认为您共享的代码可以编译,因为例如String fetchAllDataSQL 被声明了两次。也许您在复制粘贴时遗漏了相关内容?
  • 对不起,这两个是在两个不同的方法中,而且方法本身很长,所以我把它们切片了。我将编辑问题,以便更清楚。
  • 谢谢。 getGenreName 会发生什么?该方法是否偶然在结果集中移动光标?这段代码的一个问题是resultSet 是一个全局变量(你的类中的一个字段),所以很难看出代码的哪些部分可以改变它的状态。
  • 我不明白您为什么在每个单独的方法之外声明resultSet,因为一种方法使用resultSet 的值似乎不适用于其他方法。如果在使用的每个方法中将 resultSet 从类变量更改为局部变量,您的代码可能会更清晰,并且您的问题可能会得到解决。
  • 这里要学习的一课:最小化变量的范围并避免使用全局变量。此外,您应该记得关闭您的Statements,例如使用try-with-resources。最后,每当您的查询使用输入变量时(如searchCharacter 中的情况),您应该使用PreparedStatements,而不是将输入字符串连接到查询中。

标签: java derby sqlexception


【解决方案1】:

ResultSet 被全局使用。 getGenreName 方法中使用的 ResultSet 会覆盖主 searchCharacter 方法中的 resultSet。解决方案:在每个方法中单独设置 ResultSet 变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多