user3932611
user3932611

Reputation:

JDBC update using prepared statement

I am trying to update a table using Java JDBC. The method I am using does not throw any errors but the table is not updating. The create table method is below:

public static void Table()
      {
        Connection c = null;
        Statement stmt = null;
        try {
          Class.forName("org.sqlite.JDBC");
          c = DriverManager.getConnection("jdbc:sqlite:WalkerTechCars.db");
          System.out.println("Opened database successfully");

          stmt = c.createStatement();
          String sql = "CREATE TABLE IF NOT EXISTS CUSTOMERS2 " +
                       "(PHONE TEXT PRIMARY KEY     NOT NULL," +
                       " SURNAME            TEXT    NOT NULL, " + 
                       " FIRSTNAME          TEXT     NOT NULL, " + 
                       " HOME               TEXT, " + 
                       " ADDRESS            TEXT, " + 
                       " POSTCODE           Text)"; 
          stmt.executeUpdate(sql);
          stmt.close();
          c.close();
        } catch ( Exception e ) {
          System.err.println( e.getClass().getName() + ": " + e.getMessage() );
          System.exit(0);
        }
        System.out.println("Customers2 created successfully");
      }

The update method is below:

public static void updateCustomers()
      {
        Connection c = null;
        PreparedStatement pstmt = null;
        try {
          Class.forName("org.sqlite.JDBC");
          c = DriverManager.getConnection("jdbc:sqlite:WalkerTechCars.db");
          c.setAutoCommit(false);
          System.out.println("Opened database successfully");

          String query = "UPDATE CUSTOMERS2 set ADDRESS = ? where PHONE = ? ";
          pstmt = c.prepareStatement(query); // create a statement
          pstmt.setString(1, "1"); // set input parameter 1
          pstmt.setString(2, "DOES THIS WORK"); // set input parameter 2
          pstmt.executeUpdate(); // execute update statement

          pstmt.close();
          c.close();
        } catch ( Exception e ) {
          System.err.println( e.getClass().getName() + ": " + e.getMessage() );
          System.exit(0);
        }
        System.out.println("Update Completed successfully HELLO");
      }

I have tried to find some clear instructions on this but cant find any. I do not really understand JDBC and prepared statement very well

Upvotes: 1

Views: 10092

Answers (3)

Vik_Technologist
Vik_Technologist

Reputation: 61

When a connection is created, it is in auto-commit mode. We need to use [setAutoCommit] method only when we need to make Auto Commit false and make it manual commit after executing the query.

More details at Oracle site on JDBC Transaction.

Upvotes: 0

Nishant Modi
Nishant Modi

Reputation: 679

Your update method will set ADDRESS to 1 if there is any row in table with PHONE = does this work.

Try to put Address in 1st Input parameter and Phone 2nd Input parameter

Upvotes: 1

MadProgrammer
MadProgrammer

Reputation: 347204

When autoCommit is false (c.setAutoCommit(false);), you must manually commit the transaction...

Add...

c.commit()

After pstmt.executeUpdate();

You code also has a flaw, in that if some kind of error occurs during the preparation or execution of the statement, both the Connection and PreparedStatement could be left open, causing a resource leak

If you're using Java 7+ you can use the try-with-resources feature, for example...

try {
    Class.forName("org.sqlite.JDBC");
    try (Connection c = DriverManager.getConnection("jdbc:sqlite:WalkerTechCars.db")) {
        c.setAutoCommit(false);
        System.out.println("Opened database successfully");

        String query = "UPDATE CUSTOMERS2 set ADDRESS = ? where PHONE = ? ";
        try (PreparedStatement pstmt = c.prepareStatement(query)) {
            pstmt.setString(1, "1"); // set input parameter 1
            pstmt.setString(2, "DOES THIS WORK"); // set input parameter 2
            pstmt.executeUpdate(); // execute update statement
            c.commit();
        }

    } catch (SQLException exp) {
        exp.printStackTrace();
    }
} catch (ClassNotFoundException exp) {
    exp.printStackTrace();
    System.out.println("Failed to load driver");
}

This will ensure that regardless of how you leave the try block the resource will be closed.

You might also consider taking a look at the JDBC(TM) Database Access

Upvotes: 3

Related Questions