IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JDBC Java Discussion :

[Derby] Impossible de créer une table (java)


Sujet :

JDBC Java

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2012
    Messages : 3
    Points : 3
    Points
    3
    Par défaut [Derby] Impossible de créer une table (java)
    Bonsoir à tous,

    J'ai fais une classe pour "manager" ma base de données Derby. Mais voilà, quand vient même le temps de tester le code, les résultats ne sont pas vraiment ceux attendus. En gros, dans le main(), pour tester, je tente de créer une nouvelle table puis de voir si celle-ci a bien été créée (fonction tableExists) et donc apparemment la table n'a pas été créée. Pourriez-vous me dire ce qui ne va pas dans ma classe DatabaseManager svp?

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    package org.debatz.schoolManager;
     
    import java.sql.Connection;
    import java.sql.DatabaseMetaData;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.List;
    import java.util.Properties;
    import com.sun.tools.javac.util.Pair;
     
     
    public class DatabaseManager {
     
    	private final static String dbUser = "user1";
    	private final static String dbName = "derbyDB";
    	private final static String dbPassword = "user1";
     
    	private final static String driver = "org.apache.derby.jdbc.EmbeddedDriver";
    	private final static String protocol = "jdbc:derby:";
     
    	public final static String COURSES_TABLE = "COURSES";
     
    	private static Connection connect;
     
     
     
    	    public DatabaseManager () throws SQLException {
    	    	Properties properties = new Properties();
    	    	properties.put("user", dbUser); // schema
    	    	properties.put("password", dbPassword);
                    connect = DriverManager.getConnection(protocol + dbName + ";created=true", properties);
                    connect.setAutoCommit(false);
                    System.out.println("Nous voilà connecté à la base " + dbName);
                    System.out.println("connect = " + connect); // on affiche ce que contient la variable de connexion
                    loadDriver(); // on charge les drivers
    	    }
     
     
    	    public boolean tableExists (String tableName) throws Exception {
    	         ResultSet rs;
    	         boolean exists;
     
    	         try {
    	             DatabaseMetaData md = connect.getMetaData();
    	             rs = md.getTables(null, dbName, tableName, null);
    	             exists = rs.next();
    	         } finally {
    	        	 closeConnection();
    	         }
    	         return exists;
    	    } 
     
    	    public boolean createTable (String tableName, List<Pair<String, String>> fields) throws Exception {
    	    	Statement s = null;
    	    	if (!tableExists(tableName)) {
    	    		String query = "CREATE TABLE " + tableName + "(";
    	    		s = connect.createStatement();
    	    		for (int i = 0; i < fields.size(); i++)
    	    			query += (i == 0) ? fields.get(i).fst + " " + fields.get(i).snd : ", " + fields.get(i).fst + " " + fields.get(i).snd;
    	    		query += ")";
    	    		System.out.println(query);
    	    		return s.execute(query); // renvoi false ici.. pourquoi?
    	    	}
    	    	return false;
    	    }
     
    private static void closeConnection () {
    	    	if (connect == null) {
    	    		try {
    	    			connect.close();
    	    			DriverManager.getConnection("jdbc:derby:" + dbName + ";shutdown=true");
    	    		}
                    catch (SQLException se)
                    {
                        if (se.getErrorCode() == 50000 && ("XJ015").equals(se.getSQLState())) {
                            System.out.println("Derby shut down normally");
                        } else {
                            System.err.println("Derby did not shut down normally");
                            printSQLException(se);
                        }
                    }
    	    	}
    	    }
     
     
    	    private static void loadDriver() {
     
    	        try {
    	            Class.forName(driver).newInstance();
    	            System.out.println("Loaded the appropriate driver");
    	        } catch (ClassNotFoundException cnfe) {
    	            System.err.println("\nUnable to load the JDBC driver " + driver);
    	            System.err.println("Please check your CLASSPATH.");
    	            cnfe.printStackTrace(System.err);
    	        } catch (InstantiationException ie) {
    	            System.err.println("\nUnable to instantiate the JDBC driver " + driver);
    	            ie.printStackTrace(System.err);
    	        } catch (IllegalAccessException iae) {
    	            System.err.println("\nNot allowed to access the JDBC driver " + driver);
    	            iae.printStackTrace(System.err);
    	        }
    	    }
     
     
    	    public static void printSQLException(SQLException e)
    	    {
    	        while (e != null)
    	        {
    	            System.err.println("\n----- SQLException -----");
    	            System.err.println("  SQL State:  " + e.getSQLState());
    	            System.err.println("  Error Code: " + e.getErrorCode());
     
    	            e = e.getNextException();
    	        }
    	    }
     
    	}


    et voici le main de test :

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    package org.debatz.schoolManager;
     
     
    import java.util.ArrayList;
    import java.util.List;
    import com.sun.tools.javac.util.Pair;
     
     
    public class SchoolManager {
     
     
    	public static void main(String[] args) {
    		try {
    			DatabaseManager dbm = new DatabaseManager();
     
    			List<Pair<String, String>> fields = new ArrayList<Pair<String, String>>();
    			fields.add(new Pair<String, String>("course_id", "INT PRIMARY KEY generated always AS identity (start WITH 0, increment BY 1)"));
    			fields.add(new Pair<String, String>("course_name", "CHAR(50)"));
    			fields.add(new Pair<String, String>("course_option", "SMALLINT"));
     
    			System.out.println(
    					dbm.createTable(DatabaseManager.COURSES_TABLE, fields)
    				);
     
    			System.out.println(
    					dbm.tableExists(DatabaseManager.COURSES_TABLE)
    				);
     
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    }


    Voici ce que cela m'affiche lors de l'exécution :

    Nous voilà connecté à la base derbyDB
    connect = org.apache.derby.impl.jdbc.EmbedConnection40@1826959904 (XID = 588), (SESSIONID = 1), (DATABASE = derbyDB), (DRDAID = null)
    Loaded the appropriate driver
    CREATE TABLE COURSES(course_id INT PRIMARY KEY generated always AS identity (start WITH 0, increment BY 1), course_name CHAR(50), course_option SMALLINT)
    false
    false
    On voit clairement (je pense) que c'est la fonction s.execute(query) dans la méthode "createTable" qui ne fonctionne pas puisqu'elle renvoit false alors que la requête SQL elle, a l'air plutôt bonne non? Qu'en pensez-vous?

    Merci de votre aide.
    Le truc c'est que la base doit fonctionner normalement vu que j'avais chopé la source de base sur un site et les tests fonctionnaient. Cela dit, l'auteur avait tout mis dans le main. C'est donc le fait que j'ai mis le code dans une classe qui a un peu mis le bazare.

  2. #2
    Membre éprouvé Avatar de fraco
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2006
    Messages : 750
    Points : 934
    Points
    934
    Par défaut
    Salut !


    dbm.createTable(DatabaseManager.COURSES_TABLE, fields)
    A tout hasard, essayer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dbm.createTable(dbm.COURSES_TABLE, fields)
    pas testé...

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2012
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Bonjour,
    Merci de ta tentative Malheureusement ça ne fonctionne pas. J'ai même éssayé ça :

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    dbm.createTable("COURSES", fields)

    Mais en fait, dans la console, comme dit sur mon premier post, on voit bien que la requete est bien construite; donc le problème vient clairement de l'execute(query). Savez-vous comment afficher l'erreur produite ? Histoire de débugguer un peu...

    Merci à vous.

  4. #4
    Membre éprouvé Avatar de fraco
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2006
    Messages : 750
    Points : 934
    Points
    934
    Par défaut
    comment afficher l'erreur produite ?
    par un try / catch, comme ça :

    http://java.developpez.com/faq/java/?page=exception

Discussions similaires

  1. [MySQL] impossible de créer une table
    Par gerald57 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 22/05/2008, 14h53
  2. Impossible de créer une table Access
    Par pierrot67 dans le forum Débuter
    Réponses: 1
    Dernier message: 05/12/2007, 08h26
  3. Impossible de créer une table temporaire dans une fonction
    Par bossun dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 05/10/2007, 10h03
  4. Réponses: 53
    Dernier message: 03/08/2007, 14h50
  5. Réponses: 17
    Dernier message: 03/12/2004, 14h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo