2013-03-14 3 views
0

J'ai des problèmes pour ajouter des données à ma base de données lorsque j'ajoute "ALTER TABLE" à mes tables. Je reçois l'information d'une page Web sur laquelle je travaille et est écrite dans une méthode java qui transfère l'information à ma base de données. Tout fonctionne bien si je n'utilise pas les deux phrases ALTER TABLE, mais dès qu'elles sont ajoutées, les informations ne vont plus à ma base de données. Qu'est-ce que je fais mal? La méthode CREATE TABLE et Java est répertoriée ci-dessous. J'espère que quelqu'un peut m'aider!Comment créer des tables dans JavaDB et prepareStatement?

CREATE TABLE role(
username VARCHAR(15) NOT NULL, 
password VARCHAR(15) NOT NULL, 
role VARCHAR(6) NOT NULL, 
CONSTRAINT username_pk PRIMARY KEY (username) 
); 

CREATE TABLE customer(
orgnumber INTEGER NOT NULL, 
companyname VARCHAR(20) NOT NULL, 
contactperson VARCHAR(20), 
streetname VARCHAR(30) NOT NULL, 
zipcode INTEGER NOT NULL, 
city VARCHAR(15) NOT NULL, 
phone CHAR(12), 
email VARCHAR(30) NOT NULL, 
username VARCHAR(15), 
CONSTRAINT orgnumber_pk PRIMARY KEY (orgnumber) 
); 

CREATE TABLE place(
zipcode INTEGER NOT NULL, 
city VARCHAR(15), 
streetname VARCHAR(30), 
CONSTRAINT place_pk PRIMARY KEY (zipcode) 
); 

ALTER TABLE customer 
    ADD CONSTRAINT role_fk1 FOREIGN KEY (username) 
     REFERENCES role; 

ALTER TABLE customer 
    ADD CONSTRAINT place_fk1 FOREIGN KEY (zipcode) 
     REFERENCES place; 

méthode Java:

public boolean regNewRegister(RegBean newRegister) { 
    PreparedStatement sqlnewRegister = null; 
    PreparedStatement sqlnewRole = null; 
    PreparedStatement sqlnewPlace = null; 
    String knd = "Customer"; 

    OpenConnection(); 
    boolean ok = false; 
    try { 
     /* 
     * A transaction is started, uses lock. 
     */ 
     if (connection == null) { 
      System.out.println("Went well"); 
     } 
     connection.setAutoCommit(false); 

     sqlnewRegister = connection.prepareStatement("insert into customer (ORGNUMBER, CNAME, CONTACTP, STREETN, ZIPC, CITY, PHONE, EMAIL, USERNAME) values(?, ?, ?, ?, ?, ?, ?, ?, ?)"); 
     sqlnewRegister.setInt(1, newRegister.getOrgNumber()); 
     sqlnewRegister.setString(2, newRegister.getCompanyName()); 
     sqlnewRegister.setString(3, newRegister.getContactPerson()); 
     sqlnewRegister.setString(4, newRegister.getStreetName()); 
     sqlnewRegister.setInt(5, newRegister.getZipCode()); 
     sqlnewRegister.setString(6, newRegister.getCity()); 
     sqlnewRegister.setLong(7, newRegister.getPhone()); 
     sqlnewRegister.setString(8, newRegister.getEmail()); 
     sqlnewRegister.setString(9 newRegister.getUsername()); 

     sqlnewRole = connection.prepareStatement("insert into role (USERNAME, PASSWORD, ROLE) values (?, ?, ?)"); 
     sqlnewRole.setString(1, newRegister.getUsername()); 
     sqlnewRole.setString(2, newRegister.getPassword()); 
     sqlnewRole.setString(3, knd); 

     sqlnewPlace = connection.prepareStatement("insert into place (ZIPC, CITY, STREETN) values (?, ?, ?)"); 

     sqlnewPlace.setInt(1, newRegister.getZipCode()); 
     sqlnewPlace.setString(2, newRegister.getCity()); 
     sqlnewPlace.setString(3, newRegister.getStreetName()); 

     sqlnewRegister.executeUpdate(); 
     sqlnewRole.executeUpdate(); 
     sqlnewPlace.executeUpdate(); 

     connection.commit(); 

     /* 
     * Transaction ended 
     */ 
     ok = true; 

    } catch (SQLException e) { 
     Cleaner.rollBack(connection); 
     String sqlStatus = e.getSQLState().trim(); 
     String statusclass = sqlStatus.substring(0, 2); 
     if (statusclass.equals("23")) { // Standard code for "integrity constraint violation" 
      ok = false; // This orgnumber is already registered 
     } else { 
      Cleaner.writeMessage(e, "WriteToDB"); 
     } 
    } finally { 
     Cleaner.settAutoCommit(connection); 
     Cleaner.closeSentence(sqlnewRegister); 
     Cleaner.closeSentence(sqlnewRole); 
     Cleaner.closeSentence(sqlnewPlace); 
    } 
    closeConnection(); 
    return ok; 
} 

Répondre

0

Vous devrez insérer le role et place avant de pouvoir insérer le customer, sinon votre intégrité référentielle sera violée.

Les deux déclarations ALTER TABLE signifie que customer.username doit avoir une valeur correspondante role.username et customer.zipcode doit pointer vers un place.zipcode valide.

Comme vous insérez d'abord le customer, ces enregistrements n'existeront pas encore.

EDIT:

Modification de l'ordre de executeUpdate à

sqlnewRole.executeUpdate(); 
    sqlnewPlace.executeUpdate(); 
    sqlnewRegister.executeUpdate(); 

devrait faire l'affaire.

EDIT2:

Une chose à noter cependant, votre code va tomber sur si vous avez deux personnes avec le même code postal, que votre insert place violera la clé primaire si vous essayez d'ajouter deux fois ..

+0

Ahhh, ça fait sens. Merci! Oui, je sais que le ZipCode n'est pas bon comme clé primaire, allait faire une clé primaire combinée avec le nom de la rue et le code postal, avait juste oublié de le changer: / – CronbachAlpha