1

誰かが私がこのResultSetを見逃している方法を見ることができますか?以下のエラーが発生しcustomerID = rs.getInt(1)ます:

public boolean addCustomer(Customer customer) {
    String customerSQL = "INSERT INTO Customer (first_name, last_name)"
            + "VALUES (?, ?)";
    String emailSQL = "INSERT INTO Email (customer_ID, email_address, primary_email)"
            + "VALUES (?,?,?)";
    int customerID = 0;

    try (Connection connection = getConnection();
            PreparedStatement customerPs = connection.prepareStatement(
                    customerSQL, new String[] {"CUSTOMER_ID"});
            //PreparedStatement idPs = connection.prepareStatement(idSQL);
            //PreparedStatement emailPs = connection.prepareStatement(emailSQL)
            )  {

        customerPs.setString(1, customer.getFirstName());
        customerPs.setString(2, customer.getLastName());
        customerPs.executeUpdate();
        ResultSet rs = customerPs.getGeneratedKeys();

        System.out.println("Result Set: " + rs.toString());
        customerID = rs.getInt(1);
        System.out.print("Customer ID: " + customerID);



    }
    catch(SQLException e)
    {
        System.err.println("Error: " + e);
        e.printStackTrace(System.out);
        return false;
    }

    return false;
}

出力

run:
Bill Joel
this@that.com
those@these.com
wank@that.com

Result Set: org.apache.derby.impl.jdbc.EmbedResultSet40@61c70928
Error: java.sql.SQLException: Invalid cursor state - no current row.
java.sql.SQLException: Invalid cursor state - no current row.
        at org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unknown Source)
        at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source)
        at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(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)
        at org.apache.derby.impl.jdbc.EmbedResultSet.checkOnRow(Unknown Source)
        at org.apache.derby.impl.jdbc.EmbedResultSet.getColumn(Unknown Source)
        at org.apache.derby.impl.jdbc.EmbedResultSet.getInt(Unknown Source)
        at customeremailmanager.CustomerDB.addCustomer(CustomerDB.java:78)
        at customeremailmanager.CustomerEmailManager.main(CustomerEmailManager.java:24)
Caused by: java.sql.SQLException: Invalid cursor state - no current row.
        at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
        at org.apache.derby.impl.jdbc.SQLExceptionFactory40.wrapArgsForTransportAcrossDRDA(Unknown Source)
        ... 11 more
BUILD SUCCESSFUL (total time: 1 second)
4

2 に答える 2

5

ResultSetオブジェクトから行を取得する前に、ResultSet.next()を呼び出す必要があります。

ResultSet rs = customerPs.getGeneratedKeys();
           while(rs.next()){
            System.out.println("Result Set: " + rs.toString());
            customerID = rs.getInt(1);
}
于 2012-12-02T22:54:02.080 に答える
0

まず、行が使用可能であることを確認する必要があります。ResultsSet を使用してデータを取得する方法については、このチュートリアルを参照してください。

ドキュメントに従って:

カーソルを介して ResultSet オブジェクトのデータにアクセスします。このカーソルはデータベース カーソルではないことに注意してください。このカーソルは、ResultSet 内の 1 行のデータを指すポインターです。最初、カーソルは最初の行の前に配置されます。メソッド ResultSet.next は、カーソルを次の行に移動します。カーソルが最後の行の後に配置されている場合、このメソッドは false を返します。このメソッドは、while ループを使用して ResultSet.next メソッドを繰り返し呼び出し、ResultSet 内のすべてのデータを反復処理します。

例:

while (rs.next()) {
       customerID = rs.getInt(1);
     }
于 2012-12-02T22:54:58.263 に答える