2010-11-23 43 views
0

J'essaie de créer une base de données et une table à partir de mon code Java en vain. Voici mon code de base de données et l'erreur que je reçois lorsque j'exécute mon programme. Quand je débogue mes variables PreparedStatement sont nulles.La table Derby n'est pas créée

public class RecordDao { 

/** Creates a new instance of RecordDao */ 
public RecordDao() { 
    this("Requirements"); 
} 

public RecordDao(String requirements) { 
    this.dbName = requirements; 

    setDBSystemDir(); 
    dbProperties = loadDBProperties(); 
    String driverName = dbProperties.getProperty("derby.driver"); 
    loadDatabaseDriver(driverName); 
    if(!dbExists()) { 
     createDatabase(); 
    } 

} 

private boolean dbExists() { 
    boolean bExists = false; 
    String dbLocation = getDatabaseLocation(); 
    File dbFileDir = new File(dbLocation); 
    if (dbFileDir.exists()) { 
     bExists = true; 
    } 
    return bExists; 
} 

private void setDBSystemDir() { 
    // decide on the db system directory 
    String userHomeDir = System.getProperty("user.home", "."); 
    String systemDir = userHomeDir + "/.requirementsspecs"; 
    System.setProperty("derby.system.home", systemDir); 

    // create the db system directory 
    File fileSystemDir = new File(systemDir); 
    fileSystemDir.mkdir(); 
} 

private void loadDatabaseDriver(String driverName) { 
    // load Derby driver 
    try { 
     Class.forName(driverName); 
    } catch (ClassNotFoundException ex) { 
     ex.printStackTrace(); 
    } 

} 

private Properties loadDBProperties() { 
    InputStream dbPropInputStream = null; 
    dbPropInputStream = RecordDao.class.getResourceAsStream("Configuration.properties"); 
    dbProperties = new Properties(); 
    try { 
     dbProperties.load(dbPropInputStream); 
    } catch (IOException ex) { 
     ex.printStackTrace(); 
    } 
    return dbProperties; 
} 


private boolean createTables(Connection dbConnection) { 
    boolean bCreatedTables = false; 
    Statement statement = null; 
    try { 
     statement = dbConnection.createStatement(); 
     statement.execute(strCreateRequirementsTable); 
     bCreatedTables = true; 
    } catch (SQLException ex) { 
     ex.printStackTrace(); 
    } 

    return bCreatedTables; 
} 
private boolean createDatabase() { 
    boolean bCreated = false; 
    Connection dbConnection = null; 

    String dbUrl = getDatabaseUrl(); 
    dbProperties.put("create", "true"); 

    try { 
     System.out.println("inside try statement to create database"); 
     dbConnection = DriverManager.getConnection(dbUrl, dbProperties); 
     bCreated = createTables(dbConnection); 
    } catch (SQLException ex) { 
    } 
    dbProperties.remove("create"); 
    return bCreated; 
} 


public boolean connect() { 
    String dbUrl = getDatabaseUrl(); 
    try { 
     dbConnection = DriverManager.getConnection(dbUrl, dbProperties); 
     stmtSaveNewRecord = dbConnection.prepareStatement(strSaveRecord, Statement.RETURN_GENERATED_KEYS); 
     stmtUpdateExistingRecord = dbConnection.prepareStatement(strUpdateRecord); 
     stmtGetRecord = dbConnection.prepareStatement(strGetRecord); 
     stmtDeleteRecord = dbConnection.prepareStatement(strDeleteRecord); 

     isConnected = dbConnection != null; 
    } catch (SQLException ex) { 
     isConnected = false; 
    } 
    return isConnected; 
} 

private String getHomeDir() { 
    return System.getProperty("user.home"); 
} 

public void disconnect() { 
    if(isConnected) { 
     String dbUrl = getDatabaseUrl(); 
     dbProperties.put("shutdown", "true"); 
     try { 
      DriverManager.getConnection(dbUrl, dbProperties); 
     } catch (SQLException ex) { 
     } 
     isConnected = false; 
    } 
} 

public String getDatabaseLocation() { 
    String dbLocation = System.getProperty("derby.system.home") + "/" + dbName; 
    return dbLocation; 
} 

public String getDatabaseUrl() { 
    String dbUrl = dbProperties.getProperty("derby.url") + dbName; 
    return dbUrl; 
} 


public int saveRecord(RequirementsData record) { 
    int id = -1; 
    try { 
     stmtSaveNewRecord.clearParameters(); 
     stmtSaveNewRecord.setString(1, record.getDescription()); 
     stmtSaveNewRecord.setString(2, record.getType()); 
     stmtSaveNewRecord.setString(3, record.getStatus()); 
     stmtSaveNewRecord.setString(4, record.getPriority()); 
     stmtSaveNewRecord.setString(5, record.getDifficulty()); 
     stmtSaveNewRecord.setString(6, record.getDueDate()); 
     stmtSaveNewRecord.setString(7, record.getCreatedOn()); 
     int rowCount = stmtSaveNewRecord.executeUpdate(); 
     ResultSet results = stmtSaveNewRecord.getGeneratedKeys(); 
     if (results.next()) { 
      id = results.getInt(1); 
     } 

    } catch(SQLException sqle) { 
     sqle.printStackTrace(); 
    } 
    return id; 
} 

public boolean editRecord(RequirementsData record) { 
    boolean bEdited = false; 
    try { 
     stmtUpdateExistingRecord.clearParameters(); 

     stmtUpdateExistingRecord.setString(1, record.getDescription()); 
     stmtUpdateExistingRecord.setString(2, record.getType()); 
     stmtUpdateExistingRecord.setString(3, record.getStatus()); 
     stmtUpdateExistingRecord.setString(4, record.getPriority()); 
     stmtUpdateExistingRecord.setString(5, record.getDifficulty()); 
     stmtUpdateExistingRecord.setString(6, record.getDueDate()); 
     stmtUpdateExistingRecord.setString(7, record.getCreatedOn()); 
     stmtUpdateExistingRecord.setInt(12, record.getId()); 
     stmtUpdateExistingRecord.executeUpdate(); 
     bEdited = true; 
    } catch(SQLException sqle) { 
     sqle.printStackTrace(); 
    } 
    return bEdited; 

} 

public boolean deleteRecord(int id) { 
    boolean bDeleted = false; 
    try { 
     stmtDeleteRecord.clearParameters(); 
     stmtDeleteRecord.setInt(1, id); 
     stmtDeleteRecord.executeUpdate(); 
     bDeleted = true; 
    } catch (SQLException sqle) { 
     sqle.printStackTrace(); 
    } 

    return bDeleted; 
} 

public boolean deleteRecord(RequirementsData record) { 
    int id = record.getId(); 
    return deleteRecord(id); 
} 

public List<ListEntry> getListEntries() { 
    List<ListEntry> listEntries = new ArrayList<ListEntry>(); 
    Statement queryStatement = null; 
    ResultSet results = null; 

    try { 
     queryStatement = dbConnection.createStatement(); 
     results = queryStatement.executeQuery(strGetListEntries); 
     while(results.next()) { 
      int id = results.getInt(1); 
      String description = results.getString(2); 
      String type = results.getString(3); 
      String dueDate = results.getString(4); 

      ListEntry entry = new ListEntry(description, type, dueDate, id); 
      listEntries.add(entry); 
     } 

    } catch (SQLException sqle) { 
     sqle.printStackTrace(); 

    } 

    return listEntries; 
} 

public RequirementsData getRecord(int index) { 
    RequirementsData record = null; 
    try { 
     stmtGetRecord.clearParameters(); 
     stmtGetRecord.setInt(1, index); 
     ResultSet result = stmtGetRecord.executeQuery(); 
     if (result.next()) { 
      String description = result.getString("DESCRIPTION"); 
      String type = result.getString("TYPE"); 
      String status = result.getString("STATUS"); 
      String priority = result.getString("PRIORITY"); 
      String difficulty = result.getString("DIFFICULTY"); 
      String dueDate = result.getString("DUEDATE"); 
      String createdOn = result.getString("CREATEDON"); 
      int id = result.getInt("ID"); 
      record = new RequirementsData(description, type, status, priority, 
        difficulty, dueDate, createdOn, id); 
     } 
    } catch(SQLException sqle) { 
     sqle.printStackTrace(); 
    } 

    return record; 
} 

public static void main(String[] args) { 
    RecordDao db = new RecordDao(); 
    System.out.println("######"+ db.getDatabaseLocation()); 
    System.out.println(db.getDatabaseUrl()); 
    db.connect(); 
    db.disconnect(); 
} 


private Connection dbConnection; 
private Properties dbProperties; 
private boolean isConnected; 
private String dbName; 
private PreparedStatement stmtSaveNewRecord; 
private PreparedStatement stmtUpdateExistingRecord; 
private PreparedStatement stmtGetListEntries; 
private PreparedStatement stmtGetRecord; 
private PreparedStatement stmtDeleteRecord; 

private static final String strCreateRequirementsTable = 
     "create table APP.REQUIREMENTS (" + 
     " ID    INTEGER NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1)," + 
     " DESCRIPTION VARCHAR(300), " + 
     " TYPE   VARCHAR(15), " + 
     " STATUS   VARCHAR(15), " + 
     " PRIORITY  VARCHAR(15), " + 
     " DIFFICULTY  VARCHAR(15), " + 
     " DUEDATE  VARCHAR(30), " + 
     " CREATEDON  VARCHAR(30), " + 
     ")"; 

private static final String strGetRecord = 
     "SELECT * FROM APP.REQUIREMENTS " + 
     "WHERE ID = ?"; 

private static final String strSaveRecord = 
     "INSERT INTO APP.REQUIREMENTS " + 
     " (DESCRIPTION, TYPE, STATUS, PRIORITY, DIFFICULTY, DUEDATE, CREATEDON) " + 
     "VALUES (?, ?, ?, ?, ?, ?, ?)"; 


private static final String strGetListEntries = 
     "SELECT ID, DESCRIPTION, TYPE, DUEDATE FROM APP.REQUIREMENTS " + 
     "ORDER BY DUEDATE ASC"; 

private static final String strUpdateRecord = 
     "UPDATE APP.REQUIREMENTS " + 
     "SET DESCRIPTION = ?, " + 
     " TYPE = ?, " + 
     " STATUS = ?, " + 
     " PRIORITY = ?, " + 
     " DIFFICULTY = ?, " + 
     " DUEDATE = ?, " + 
     " CREATEDON = ?, " + 
     "WHERE ID = ?"; 

private static final String strDeleteRecord = 
     "DELETE FROM APP.REQUIREMENTS " + 
     "WHERE ID = ?"; 

}

Voici l'erreur:

run: java.sql.SQLSyntaxErrorException: Table/View 'APP.REQUIREMENTS' does not exist. at org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unknown Source) at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown Source) at org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(Unknown Source) at org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(Unknown Source) at org.apache.derby.impl.jdbc.EmbedConnection.handleException(Unknown Source) at org.apache.derby.impl.jdbc.ConnectionChild.handleException(Unknown Source) at org.apache.derby.impl.jdbc.EmbedStatement.execute(Unknown Source) at org.apache.derby.impl.jdbc.EmbedStatement.executeQuery(Unknown Source) at com.example.requirements.db.RecordDao.getListEntries(RecordDao.java:240) at com.example.requirements.RequirementsFrame.(RequirementsFrame.java:42) at com.example.requirements.RequirementsFrame.main(RequirementsFrame.java:182) Caused by: java.sql.SQLException: Table/View 'APP.REQUIREMENTS' does not exist. at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source) at org.apache.derby.impl.jdbc.SQLExceptionFactory40.wrapArgsForTransportAcrossDRDA(Unknown Source) ... 11 more Caused by: ERROR 42X05: Table/View 'APP.REQUIREMENTS' does not exist. at org.apache.derby.iapi.error.StandardException.newException(Unknown Source) at org.apache.derby.impl.sql.compile.FromBaseTable.bindTableDescriptor(Unknown Source) at org.apache.derby.impl.sql.compile.FromBaseTable.bindNonVTITables(Unknown Source) at org.apache.derby.impl.sql.compile.FromList.bindTables(Unknown Source) at org.apache.derby.impl.sql.compile.SelectNode.bindNonVTITables(Unknown Source) at org.apache.derby.impl.sql.compile.DMLStatementNode.bindTables(Unknown Source) at org.apache.derby.impl.sql.compile.DMLStatementNode.bind(Unknown Source) at org.apache.derby.impl.sql.compile.CursorNode.bindStatement(Unknown Source) at org.apache.derby.impl.sql.GenericStatement.prepMinion(Unknown Source) at org.apache.derby.impl.sql.GenericStatement.prepare(Unknown Source) at org.apache.derby.impl.sql.conn.GenericLanguageConnectionContext.prepareInternalStatement(Unknown Source) ... 5 more

Toutes les idées ce qui se passe? J'ai derby.jar dans mes bibliothèques.

Répondre

0

Vous faites des choses vraiment horribles avec des blocs catch. Vous devriez éditer chacun d'entre eux pour qu'ils impriment ou enregistrent tous la trace de la pile. Un bloc catch vide signifie qu'une exception peut être lancée mais vous ne le saurez jamais. Pourquoi pensez-vous que vous devez créer les tables dans le code Java? Avec la plupart des applications, le schéma est conçu et implémenté par un administrateur de base de données, de sorte qu'il est déjà en place au démarrage de l'application Java. Pourquoi devez-vous créer les tables lors de l'exécution? Devrait être fait une fois.

+0

Je fais un projet de classe où je n'ai pas accès à un serveur, donc je dois utiliser une base de données intégrée (Derby) dans mon programme. De plus, le code que j'ai ici fait partie d'un exemple que j'ai reçu de Sun. – taraloca

0

À quoi ressemble votre URL db? Il devrait avoir un «créer = true » à la fin ...

BTW, pensez à utiliser JPA au lieu de plaine JDBC

+0

Je ne recommanderais pas JPA à quelqu'un qui n'avait pas encore maîtrisé JDBC. – duffymo

+0

Eh bien, apprenez d'abord JDBC, puis JPA, puis travaillez sur un projet réel en utilisant JPA ;-) – Puce

0

L'exemple de code ne marche pas sembler complète, l'accident se produit dans getListEntries, mais ce n'est jamais appelé dans le code ci-dessus.

1

Votre code indique "if! DbExists then createDatabase". Peut-être que dbExists renvoie TRUE lorsque vous avez une nouvelle base de données vide, et donc vous n'appelez pas createDatabase, et par conséquent n'appelant pas createTables.