【问题标题】:Derby db stating that column does not exist when it doesDerby db 声明该列不存在
【发布时间】:2013-11-27 08:51:31
【问题描述】:

好的,所以我有一个应用程序连接到具有客户表的数据库。在客户表中,我捕获了一系列不同的值。 VH_ID 是车辆表的外键,insurance_ID 也是保险表的外键。

任何想法都将不胜感激。

编辑

public CustomerInformation getCustomerInfo(String customerName) {
    CustomerInformation info = new CustomerInformation();
    ResultSet result;
    try {
        String sqlStatement = "SELECT "
                + DBStrings.C_NAME + ","
                + DBStrings.C_ADDRESS + ","
                + DBStrings.C_PHONENO + ","
                + DBStrings.C_EMAIL + ","
                + DBStrings.C_VH_ID + ","
                + DBStrings.C_VH_MODEL + ","
                + DBStrings.C_VH_YEAR + ","
                + DBStrings.C_VH_REGO + ","
                + DBStrings.C_VH_CHASSIS + ","
                + DBStrings.C_VH_VIN + ","
                + DBStrings.C_INSURANCE
                + " FROM " + DBStrings.CUSTOMER + " WHERE " + DBStrings.C_ID + " = " + this.getCustomerId(customerName);
        result = statement.executeQuery(sqlStatement);
        while (result != null && result.next()) {
            info.setName(result.getString(DBStrings.C_NAME));
            info.setAddress(result.getString(DBStrings.C_ADDRESS));
            info.setPhoneNumber(result.getString(DBStrings.C_PHONENO));
            info.setEmail(result.getString(DBStrings.C_EMAIL));
            info.setRego(result.getString(DBStrings.C_VH_REGO) + "");
            info.setChassis(result.getString(DBStrings.C_VH_CHASSIS) + "");
            info.setVin(result.getString(DBStrings.C_VH_VIN) + "");
            info.setVehicleModel(result.getString(DBStrings.C_VH_MODEL) + "");
            info.setYear(result.getInt(DBStrings.C_VH_YEAR) + "");
            info.setInsurance(this.getInsuranceFromId(result.getInt(DBStrings.C_INSURANCE)));
            info.setVehicleMake(this.getVehicleFromId(result.getInt(DBStrings.C_VH_ID)));
        }
    } catch (SQLException ex) {
        Logger.getLogger(Database.class
                .getName()).log(Level.SEVERE, null, ex);
    }
    return info;
}

这是嵌套在方法中的 ResultSet 的新代码。现在我收到错误:

SEVERE: null
java.sql.SQLException: ResultSet not open. Operation 'getInt' not permitted. Verify that autocommit is OFF.
at org.apache.derby.client.am.SQLExceptionFactory40.getSQLException(Unknown Source)
at org.apache.derby.client.am.SqlException.getSQLException(Unknown Source)
at org.apache.derby.client.am.ResultSet.getInt(Unknown Source)
at Database.Database.getCustomerInfo(Database.java:599)

声明

connection = DriverManager.getConnection(connectionURL, "user", "pass");
statement = connection.createStatement();

【问题讨论】:

  • 您确定存在名为 VH_MODEL 的列吗?
  • 我非常肯定。我正在使用与 DBStrings.C_VH_MODEL 完全相同的字符串将客户信息添加到该表中。当查看 netbeans 服务部分的数据库时,数据就在那里。我不确定它为什么不抓取数据。
  • 您是否尝试对数据库而不是从代码运行 String sqlStatement 的内容?问题是否仍然存在?
  • 直接针对数据库工作没问题。它没有抓取数据似乎很奇怪。
  • rs = statement.executeQuery(sqlStatement); rs 不是此方法的局部变量。它可能被其他进程覆盖。我建议您将其设为局部变量 ResultSet rs = ... 声明相同。

标签: java database netbeans derby


【解决方案1】:

也许由于常量中的“复制粘贴事故”,您的查询中有两次列 VH_MODEL,即另一个常量也扩展为“VH_MODEL”,特别是获取序列中 VH_MODEL 之后的列之一。 DBMS 将重命名结果列以使它们在这种情况下是唯一的,我猜。这可以解释excuteQuery 工作而getString 失败的奇怪情况。

【讨论】:

  • 我认为情况并非如此。将 setVehicleMake 向下移动到底部,它将错误从 VH_MODEL 列切换到 VH_ID 列。
  • 这意味着 C_VH_ID 扩展为“VH_MODEL”,您可能已验证并非如此。这只是一个理论...您可以记录 sqlStatement 并将其添加到问题中吗?
【解决方案2】:

基本上,我为解决此问题所做的工作是创建另一种专门用于检索车辆制造商的方法。似乎有点毫无意义,但对于我的生活,我不知道为什么它不接受它。该方法检索数据的内容与第一种方法完全相同。看起来很奇怪。

    String sqlStatement = "SELECT "
            + DBStrings.C_VH_ID
            + " FROM " + DBStrings.CUSTOMER + " WHERE " + DBStrings.C_ID + " = " + customerId;
    rs = statement.executeQuery(sqlStatement);
    if (rs != null && rs.next()) {
        int vh_id = rs.getInt(DBStrings.C_VH_ID);
        vehicle = this.getVehicleFromId(vh_id);
    }

【讨论】:

    猜你喜欢
    • 2018-05-02
    • 2013-08-20
    • 1970-01-01
    • 2014-06-27
    • 1970-01-01
    • 1970-01-01
    • 2017-10-09
    • 2013-12-01
    • 2011-08-17
    相关资源
    最近更新 更多