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 :

[ResultSet] Pb à cerner SVP (code inclus)


Sujet :

JDBC Java

  1. #1
    Membre éclairé Avatar de ShinJava
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    413
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 413
    Par défaut [ResultSet] Pb à cerner SVP (code inclus)
    Salut tout le monde, vous allez bien ?
    J'ai un probleme et c'est un truc de fou !

    Pour faire des acces a ma base de donnée je passe normalement par une classe qui s'appelle DBConnection.
    Ca fait plus d'une semaine que j'avais pas touché au projet (j'ai surement du faire quelque chose, mais je vois pas) et la ca ne marche plus !
    Du coup j'ai créé quelques fonctions de tests pour cerner le problème mais je trouve pas.
    Ce n'est pas tres long, c'est du code assez simple avec 2 logs d'erreurs.

    Voici ce que j'ai fais :

    Ici c'est la page d'accueil de test qui permet de tester les acces à la base de donnée.
    Test.jsp :
    Code : 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
     
    <HTML>
    <HEAD>
    <TITLE>DataBase Test!</TITLE>
    </HEAD>
     
    DataBase Test Button
    <FORM ACTION="http://localhost:8080/Training/TEST2">
    <INPUT TYPE="SUBMIT" VALUE = "test">
    </FORM>
    DataBase Test Button2
    <FORM ACTION="http://localhost/Training/TEST3">
    <INPUT TYPE="SUBMIT" VALUE = "test">
    </FORM>
     
    </BODY>
    </HTML>
    Les 2 boutons du dessus permettent d'acceder au servlet test que j'ai fais à la vite pour essayer de comprendre le pb.

    Les voici :

    TEST2.java :
    Code : 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
     
    package Training;
     
    import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
    import java.sql.*; 
    import java.sql.DriverManager; 
     
    public class TEST2 extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException  {
     
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
     
    Statement stmt;
    ResultSet result; 
     
    String url = "jdbc:mysql://localhost:3306/HeroDB"; 
    String user = "Login"; 
    String password = "Password";
     
    try{
        Class.forName("com.mysql.jdbc.Driver"); 
        out.println("<br> DRIVERS JDBC : OK!");
        Connection connection = DriverManager.getConnection(url,user,password);
        out.println("<br> Databse Connexion : OK!");
     
        String req ="Select * FROM User_Table";
        stmt = connection.createStatement();
        result = stmt.executeQuery(req); 
     
       // Partie rajouté pour voir si le Resultat retourne bien un nombre de ligne superieur a 0 
       int numRows = 0;
       result.last();
       numRows = result.getRow();
       result.first();
       out.println(numRows);
     
     
      result.beforeFirst();
      while (result.next())
      {
      out.println(result.getString("Login"));
     
      }
    }
    catch (ClassNotFoundException e) 
          { 
             out.println("Driver non chargé !");
          } 
    catch(SQLException ex) {
     
     
            out.println("<br> MESSAGE D'ERREUR <br>");
    	while (ex != null) {
     
                    out.println("<br>Message: " + ex.getMessage ());
     
                    out.println("<br>SQLState: "  + ex.getSQLState ());
     
                    out.println("<br>ErrorCode: "  + ex.getErrorCode ());
     
                    ex = ex.getNextException();
    		out.println("");
    	}
    }
     
     
    }
    }
    Ce code marche parfaitement, il me renvoi bien les nom des utilisateur de la base de donnée avec le nombre de ligne du getRow.
    Donc pas de souci, mais c'est la suite qui est plus interessante :

    Passons à la suite, la ou je galère !

    TEST3.java :
    Code : 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
     
    package Training;
     
    import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
    import java.sql.*; 
    import java.sql.DriverManager; 
     
    public class TEST3 extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException  {
     
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
     
        // New Instance : DBConnection
        DBConnection db = new DBConnection();   
     
        String req ="Select * FROM User_Table";
     
    try{
     
        db.Connect();
        out.println("<br> DRIVERS JDBC : OK!");
        out.println("<br> Connexion à la BDD : OK!");
     
        ResultSet Result = db.QueryDataBase(req);
     
        // Partie rajouté pour voir si le Resultat retourne bien un nombre de ligne superieur a 0   
        int col = db.TotalRows(Result);
        if (col == 0)
        {
            out.println("<br>Query to DB is not ok!<br>");
        }
        else{
        out.println(col);
        }
     
    }
    catch (ClassNotFoundException e) 
          { 
             out.println("Driver non chargé !");
          } 
     
    catch (Exception x) 
            { 
              out.println(x); 
            } 
     
    }
    }

    DBConnection.java
    Code : 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
     
    package Training;
     
    import java.sql.*; 
    import java.sql.DriverManager; 
     
    public class DBConnection{
     
    Connection connection;
    Statement stmt;
    ResultSet result;
     
    public DBConnection(){
    }
     
    public void Connect() throws Exception, SQLException{ 
     
        String url = "jdbc:mysql://localhost:3306/HeroDB"; 
        String user = "Login"; 
        String password = "Password";
     
        try { 
         // Load JDBC Drivers
         Class.forName("com.mysql.jdbc.Driver"); 
         // make the connection with the database 
         Connection connection = DriverManager.getConnection(url,user,password);
           }
         catch(SQLException sqle){ 
     
           System.out.println(sqle.getMessage());
     
     
       }
       catch(Exception e){ 
     
           System.out.println("The Connection Failed !"+ e.getMessage()); 
     
                                  }
     
     }
     
    public ResultSet QueryDataBase(String SQLFunc)throws SQLException, Exception{ 
        try{
            stmt = connection.createStatement(); 
            result = stmt.executeQuery(SQLFunc); 
           } 
     catch(SQLException sqle){ 
     
           System.out.println("Problem with getting Result1!"+ sqle.getMessage());
           System.out.println("Problem with getting Result2!"+ sqle.getSQLState());
           System.out.println("Problem with getting Result3!"+ sqle.getErrorCode());
     
       }
         catch(Exception e){ 
     
           System.out.println("Problem with getting Result4!"+ e.getMessage());
     
       }
        return result; 
    }
     
     
    public int TotalRows (ResultSet rs) throws SQLException, Exception
    	{
                int numRows = 0;
                try{
     
                        rs.last();
                        numRows = rs.getRow();
                        rs.first();
                    }
     
                catch(SQLException sqle)
    		{
    			System.out.println("Problem with getting Row1"+ sqle.getMessage());
                            System.out.println("Problem with getting Row2"+ sqle.getSQLState());
                            System.out.println("Problem with getting Row3"+ sqle.getErrorCode());
    		}
    		catch(Exception e){ 
                    System.out.println("Problem with getting getting Row4!"+ e.getMessage());
                    }
     
                return numRows;
    	}
     
    }
    Alors là, je ne comprend pas pourquoi ca ne marche pas... Le resultat retourné pour le nombre de ligne est 0
    Pourquoi le premier code fonctionnerait alors que le 2eme non ? C'est pas normal, y'a quasisement aucune différence.
    Voici les logs d'erreur de Tomcat et MySQL :

    MySQL :
    Version: '4.0.20a-nt' socket: '' port: 3306
    050315 19:15:52 Aborted connection 4 to db: 'herodb' user: 'Login' host: `localhost' (Got an error reading communication packets)
    050315 19:16:42 Aborted connection 1 to db: 'herodb' user: 'Login' host: `localhost' (Got an error reading communication packets)
    TOMCAT :
    Mar 15, 2005 7:10:46 PM org.apache.catalina.core.StandardContext reload
    INFO: Reloading this Context has started
    Mar 15, 2005 7:10:46 PM org.apache.catalina.logger.LoggerBase stop
    INFO: unregistering logger Catalina:type=Logger,path=/monk2,host=localhost
    NotifyUtil::java.net.ConnectException: Connection refused: connect
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(Unknown Source)
    at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
    at java.net.PlainSocketImpl.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at sun.net.NetworkClient.doConnect(Unknown Source)
    at sun.net.www.http.HttpClient.openServer(Unknown Source)
    at sun.net.www.http.HttpClient.openServer(Unknown Source)
    at sun.net.www.http.HttpClient.<init>(Unknown Source)
    at sun.net.www.http.HttpClient.New(Unknown Source)
    at sun.net.www.http.HttpClient.New(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.connect(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(Unknown Source)
    at org.netbeans.modules.web.monitor.server.NotifyUtil$RecordSender.run(NotifyUtil.java:237)

    NotifyUtil::java.net.ConnectException: Connection refused: connect
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(Unknown Source)
    at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
    at java.net.PlainSocketImpl.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at sun.net.NetworkClient.doConnect(Unknown Source)
    at sun.net.www.http.HttpClient.openServer(Unknown Source)
    at sun.net.www.http.HttpClient.openServer(Unknown Source)
    at sun.net.www.http.HttpClient.<init>(Unknown Source)
    at sun.net.www.http.HttpClient.New(Unknown Source)
    at sun.net.www.http.HttpClient.New(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.connect(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(Unknown Source)
    at org.netbeans.modules.web.monitor.server.NotifyUtil$RecordSender.run(NotifyUtil.java:237)

    NotifyUtil::java.net.ConnectException: Connection refused: connect
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(Unknown Source)
    at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
    at java.net.PlainSocketImpl.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at sun.net.NetworkClient.doConnect(Unknown Source)
    at sun.net.www.http.HttpClient.openServer(Unknown Source)
    at sun.net.www.http.HttpClient.openServer(Unknown Source)
    at sun.net.www.http.HttpClient.<init>(Unknown Source)
    at sun.net.www.http.HttpClient.New(Unknown Source)
    at sun.net.www.http.HttpClient.New(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.connect(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(Unknown Source)
    at org.netbeans.modules.web.monitor.server.NotifyUtil$RecordSender.run(NotifyUtil.java:237)

    Problem with getting Result4!null
    Problem with getting getting Row4!null
    NotifyUtil::java.net.ConnectException: Connection refused: connect
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(Unknown Source)
    at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
    at java.net.PlainSocketImpl.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at sun.net.NetworkClient.doConnect(Unknown Source)
    at sun.net.www.http.HttpClient.openServer(Unknown Source)
    at sun.net.www.http.HttpClient.openServer(Unknown Source)
    at sun.net.www.http.HttpClient.<init>(Unknown Source)
    at sun.net.www.http.HttpClient.New(Unknown Source)
    at sun.net.www.http.HttpClient.New(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.connect(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(Unknown Source)
    at org.netbeans.modules.web.monitor.server.NotifyUtil$RecordSender.run(NotifyUtil.java:237)
    Pour info : j'utilise Tomcat 5.0.28, Mysql 4.0.20 et Java 1.5

    Voila voila, si vous pouviez m'aider à trouver le pb, au moins me donner des pistes car jsuis dessus depuis un ptit moment, et les boites d'aspirine se vident à la vitesse V.

    Merci d'avance.

    ++
    ShinJava

  2. #2
    Membre éclairé Avatar de ShinJava
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    413
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 413
    Par défaut
    Bon bon je n'arrive toujours pas comprendre le probleme.
    Pensez-vous qu'il puisse y avoir un rapport avec les try and catch ? Car quand on les changent, dans certains cas la compilation passe mais a lexecution du code , cela ne fonctionne plus.

    Je suis perdu... je vais continuer à chercher !
    Si quelqu'un a des suggestions, je suis preneur !
    ++
    ShinJava

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 54
    Par défaut
    bof bof ton pb..
    Pas de changement de driver mysql entre les deux tests ? J'ai pas l'impression que tu fermes les resultSets ni les connexions....

  4. #4
    Membre éclairé Avatar de ShinJava
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    413
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 413
    Par défaut
    Salut,
    Effectivement je ne ferme pas les connexions et les resultset, je comptais les inclure plus tard... Tu penses que le problème peut venir de là ? Pourtant dans le premier test non plus je les fermes pas et ca marche...
    Je vais quand meme essayer ce que tu me conseil.
    Merci
    Je vous tiens au courant.
    ++
    ShinJava

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mars 2004
    Messages : 104
    Par défaut
    Salut,

    il y a déjà un problème dans ta méthode connect. Tu déclares une variable locale connection alors qu'elle est déclarée en attribut de ta classe. C'est d'ailleurs étonnant que tu n'es pas un NullPointerException.
    A part ça, j'ai rien vu de bizarre

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 28
    Par défaut
    pas sûr mais...

    1. ton second bouton vas sur http://localhost/Training/TEST3 donc le port 80 et pas 8080 ??

    2. tu ne ferme pas le stmt, ni la connexion! Dans le premier cas ça ne plante pas puisque tu recrée tout à chaque requête mais dans le second, dès le 2ème appel...

    Tout ce code est quand même pas super , tu devrai essayer de suivre les conventions de nomage java (méthodes et variables commencent par des minuscules) et utiliser un pool de connexion, si je peux me permettre
    En ouvrant et fermant les Statements et les resultsets correctement tu ne devrai plus avoir de problèmes.

  7. #7
    Membre éclairé Avatar de ShinJava
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    413
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 413
    Par défaut
    Merci à vous de vous être pencher dessus !
    Les closes connection et resultset n'ont pas était d'un grand secours.

    ceddup : oui oui cetait 8080, ca a disparu pendant que j'ai edité surement. Sinon pour le reste je vais suivre tes conseils.

    Kirua12 : t'as touché dans le 1000 !
    Ma méthode de Connection est tout simplement mauvaise ! c'est pour ca que j'ai un NullPointerException.
    Si on regarde bien ma variable Connection, elle est toujours "null" , vous voyez ce que je veux dire (regarder dans DBConnection.class) ?

    C'est bizarre car je pensais qu'en modifiant la valeur de connection dans la méthode connect, je pensais que ca allait se repercuter sur les autres méthodes... pouvez-vous m'éclairer la dessus SVP.

    ++
    ShinJava

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 54
    Par défaut
    Comme tu déclare une deuxieme connection en local, c'est sur celle ci que tu travailles, donc la connexion de la classe est inchangée. Tu déclare deux objets indépendants.

    Pour y acceder, si tu continues de déclarer deux "connection", tu pourras modifier la connection de ta classe en utilisant "this.connection". Dans le cas ou tu n'as qu'une connexion, this est inutile.

  9. #9
    Membre chevronné Avatar de gronono
    Inscrit en
    Novembre 2003
    Messages
    457
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Novembre 2003
    Messages : 457
    Par défaut
    Quand tu fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      try { 
         // Load JDBC Drivers 
         Class.forName("com.mysql.jdbc.Driver"); 
         // make the connection with the database 
         Connection  try { 
         // Load JDBC Drivers 
         Class.forName("com.mysql.jdbc.Driver"); 
         // make the connection with the database 
         Connection connection = DriverManager.getConnection(url,user,password);
    La variable connection est locale au try.

    Tu devrais mettre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.connection = DriverManager.getConnection(...)

  10. #10
    Membre éclairé Avatar de ShinJava
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    413
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 413
    Par défaut
    Je vous remercie à tous pour les explications !
    C'est vrai qu'avec le "this" tout ce passe mieux !
    Mais la je vais refaire cette partie du code, car c'est trop bordélique...

    Huh pour les conventions Java (minuscules etc..), je les connais pas du tout, je vais aller regardé ca aussi !

    Merci encore.
    ++
    ShinJava

  11. #11
    Membre chevronné Avatar de gronono
    Inscrit en
    Novembre 2003
    Messages
    457
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Novembre 2003
    Messages : 457
    Par défaut
    Les conventions sont assez simples:


    les noms de classes commencent avec une majuscule
    les attributs commencent par une minuscule.
    le méthodes aussi

    les constantes sont écrites en maj.

    1 classe par fichier et le nom de la classe correspond au nom du fichier.

    je pense que j'ai fait le tour.

  12. #12
    Membre éclairé Avatar de ShinJava
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    413
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 413
    Par défaut
    Merci beaucoup pour les conventions !
    Je pense que mon problème est résolu là !
    Merci encore à vous de m'avoir aiguillé et aidé.

    ++
    ShinJava

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [RegEx] Vérifier qu'il y'a bgs.ac.be après l'arobase avec le code inclus
    Par beegees dans le forum Langage
    Réponses: 3
    Dernier message: 13/10/2008, 15h03
  2. Réponses: 3
    Dernier message: 21/05/2007, 11h00
  3. aidez moi svp,"code source" du jeux serpent
    Par joshkof dans le forum C++
    Réponses: 3
    Dernier message: 24/05/2006, 11h03
  4. bout de code à dechifrer svp
    Par bball dans le forum C
    Réponses: 32
    Dernier message: 20/01/2005, 23h23

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