Derby db声明该列不存在时

时间:2013-11-27 08:51:31

标签: java database netbeans derby

好的,我有一个连接到具有customer表的数据库的应用程序。在客户表中,我捕获了一系列不同的值。 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();

2 个答案:

答案 0 :(得分:0)

由于常量中的“复制粘贴事故”,您的查询中可能有两列VH_MODEL,即另一个常量也会扩展为“VH_MODEL”,特别是get序列中VH_MODEL之后的列之一。在这种情况下,DBMS会重命名结果列以使它们成为唯一的。这可以解释excuteQuerygetString失败时工作的奇怪情况。

答案 1 :(得分:0)

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

    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);
    }