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 :

[JDBC] Probleme ResultSet


Sujet :

JDBC Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 58
    Points : 55
    Points
    55
    Par défaut [JDBC] Probleme ResultSet
    Bonjour à tous,

    voilà je debute avec JDBC et me voilà confronter à un ptit problème.

    1. J'ai crée une table "MEMBRES" dans mon code JAVA qui est de la forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    		String creerTableMembres = "CREATE TABLE MEMBRES(" +
    		" No_Carte number(6) primary key, " +
    		" Nom char(20), " +
    		" Adr char(50) not null, " +
    		" Code_postal number(5), "  +
    		" Ville char(30) not null, " +
    		" constraint codeposte check(Code_postal >= 100 and Code_postal <= 96999))";
    et sur laquelle j'insère quelques lignes , ce qui jusque là ne pose pas de problème.

    Mon problème vient d'un deleteRow() que j'ai voulu tester en fait, en faisant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    // Création d'un objet Statement apres l'activation d'une connexion active :
    		Statement stmt = conx.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
    .. J'insère mes lignes dans la table membres, sa marche, puis je veux en afficher le contenu et faire un rs.deleteRow() de la façon suivante :



    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
     
    		affiche("> REQUETE DE SELECTION ...");
     
    		ResultSet rs;
    		rs=stmt.executeQuery("SELECT * FROM MEMBRES");
     
    		affiche("> test debug 1...");
     
    		while(rs.next()){
    			int num = rs.getInt(1);
    			String nom = rs.getString(2);
    			String adr = rs.getString(3);
    			int cod = rs.getInt(4);
    			String ville = rs.getString(5);
    			affiche("> test debug 2...");				
    			System.out.println(nom + " a pour numero de carte " +num+ " et habite " +adr+ " , " +ville+ " , " + cod);
    			affiche("> test debug 3...");				
    			rs.deleteRow();
    			affiche("> test debug 4...");				
     
    		}
    Le code marche correctement sans le rs.deleteRow(), toutes les lignes de la table s'affiche dans la console.

    Voilà ce que j'obtiens depuis que j'ai mis rs.deleteRow() :



    > REQUETE DE SELECTION ...
    > test debug 1...
    > test debug 2...
    Daniel a pour numero de carte 100001 et habite 9 allée de la République , Paris , 75016
    > test debug 3...
    SQLException: Opération non valide sur un ensemble de résultats de type read-only : deleteRow
    java.sql.SQLException: Opération non valide sur un ensemble de résultats de type read-only : deleteRow
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:125)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:162)
    at oracle.jdbc.driver.BaseResultSet.deleteRow(BaseResultSet.java:516)
    at myClass.main(myClass.java:171)
    Il semble donc que ce soit dû aux options du ResultSet fixées par l'objet Statement???

    Pourtant je pense avoir suivi la fac : http://java.developpez.com/faq/jdbc/?page=resultset (>> "Comment supprimer une ligne dans un ResultSet ?")


    2. De plus, je voulais savoir si, en supprimant une ligne dans le ResultatSet, on supprime en même temps la ligne correspondante dans la table "MEMBRES" ?

    Pouvez vous m'éclairer siouplé

    Merci

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 220
    Points : 266
    Points
    266
    Par défaut
    This method cannot be called when the cursor is on the insert row.
    Ce ne serait pas parce que tu es a l'interieur de la ligne que tu veux supprimer a tout hasard ?

    Essayes sans faire les rs.getString avant, il y a des chances que ca marche... Il doit falloir que tu te repositionnes sur le row en question pour pouvoir le supprimer.

    (Voir methodes getRow et absolute...)[/quote]

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 58
    Points : 55
    Points
    55
    Par défaut
    Ce ne serait pas parce que tu es a l'interieur de la ligne que tu veux supprimer a tout hasard ?
    Ma table "Membres" contient en fait 2 lignes. Si je ne me trompe pas, je pense que le insertRow est la 3e ligne et je n'y suis pas encore.



    Essayes sans faire les rs.getString avant, il y a des chances que ca marche... Il doit falloir que tu te repositionnes sur le row en question pour pouvoir le supprimer.
    Je l'ai fait, ça ne marche pas

    J'ai meme supprimé le bloc "while(rs.next()){ } et son contenu pour tester seulement ce code à la place :

    rs.absolute(1);
    rs.deleteRow();


    => ça ne marche pas, toujours à cause de l'erreur du ResultSet qui n'est qu'en mode Read-ONLY


    J'ai regardé la fac et j'ai pu récupérer le code suivant qui permet de récuperer les caractéristiques d'un ResultSet :


    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
     
     
    	public static void afficherCaracteristiques(ResultSet resultat)throws SQLException{
    		int type = resultat.getType();
    		//	  ou a partir du Statement
    		//	  int type = resultat.getStatement().getResultSetType();
    		int concurrency = resultat.getConcurrency();
    		//	  ou a partir du Statement
    		//	  int concurrency = resultat.getStatement().getResultSetConcurrency();
    		String sType = "";
    		String sConcurrency = "";
    		switch(type){
    			case ResultSet.TYPE_FORWARD_ONLY:
    				sType = "Type : FORWARD_ONLY";
    			break;
    			case ResultSet.TYPE_SCROLL_INSENSITIVE:
    				sType = "Type : SCROLL_INSENSITIVE";
    			break;
    			case ResultSet.TYPE_SCROLL_SENSITIVE:
    				sType = "Type : SCROLL_SENSITIVE";
    			break;
    			default : 
    				sType = "Type inconnu ??? Bug ???";
    			break;
    		}
    		switch(concurrency){
    			case ResultSet.CONCUR_READ_ONLY:
    				sConcurrency = "Concurrency : CONCUR_READ_ONLY";
    			break;
    			case ResultSet.CONCUR_UPDATABLE:
    				sConcurrency = "Concurrency : CONCUR_UPDATABLE";
    			break;
    			default : 
    				sConcurrency = "Concurrency inconnue ??? Bug ???";
    			break;
    		}
    		System.out.println("Les caractéristiques de ce ResultSet sont : ");
    		System.out.println(sType);
    		System.out.println(sConcurrency);
    	}
    Dans mon code, j'appelle cette fonction :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    		affiche("> REQUETE DE SELECTION ...");
     
    		ResultSet rs;
    		rs=stmt.executeQuery("SELECT * FROM MEMBRES");
     
    		affiche("> test debug 1...");
    		afficherCaracteristiques(rs);
    		affiche("> test debug caracteristique fin...");
    Voilà ce que j'obtient :


    > REQUETE DE SELECTION ...
    > test debug 1...
    Les caractéristiques de ce ResultSet sont :
    Type : SCROLL_INSENSITIVE
    Concurrency : CONCUR_READ_ONLY

    > test debug caracteristique fin...
    Ce qui ne correspond pas du tout à ce que j'ai fixé dans l'objet statement !!! (Cf premier post)

    J'ai modifié la fonction de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    	public static void afficherCaracteristiques(ResultSet resultat)throws SQLException{
    		//int type = resultat.getType();
    		//	  ou a partir du Statement
    			  int type = resultat.getStatement().getResultSetType();
    		//int concurrency = resultat.getConcurrency();
    		//	  ou a partir du Statement
    			  int concurrency = resultat.getStatement().getResultSetConcurrency();
     
    ... etc
    J'obtiens le résultat suivant :
    > REQUETE DE SELECTION ...
    > test debug 1...
    Les caractéristiques de ce ResultSet sont :
    Type : SCROLL_SENSITIVE
    Concurrency : CONCUR_UPDATABLE

    > test debug caracteristique fin...
    Ce qui correspond bien à ce que j'ai fixé pour l'objet ResultSet VIA l'objet statement !

    Ce qui voudrait dire que le code ( Cf post 1), le ResultSet prend en compte les options

    Type : SCROLL_INSENSITIVE
    Concurrency : CONCUR_READ_ONLY


    comme si le statement n'avait rien fixé ... étrange non?

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 220
    Points : 266
    Points
    266
    Par défaut
    Un truc con...

    Je me demande si ton driver autorise ce genre de chose... P'tet que c'est betement pas implémenter dedans...

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 304
    Points : 348
    Points
    348
    Par défaut
    Va faire un tour sur la FAQ :
    http://java.developpez.com/faq/jdbc/...ultset#typesRS

    Ton ResultSet est en lecture seul donc forcémenty tu ne peux pas supprimer de lignes ...
    --Miss Gaëlle--

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 220
    Points : 266
    Points
    266
    Par défaut
    Desole, ce qui l'embete c'est qu'il a créé son Statement avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Statement stmt = conx.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
    et qu'il recupere une valeur en CONCUR_READ_ONLY...

    Bref, comme si ca n'avait pas été affecté...

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 58
    Points : 55
    Points
    55
    Par défaut
    Je me demande si ton driver autorise ce genre de chose... P'tet que c'est betement pas implémenter dedans...
    Je pense avoir téléchargé les bons drivers sur le site d'Oracle :

    Ma version d'oracle : Oracle Database 10g 10.1.0.2
    Ma version JDK : 1.4

    J'ai pris le driver ojcbd14.jar corrspondant, après validation de la page :

    http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/htdocs/jdbc101040.html


    J'y ai été sur cette page et j'y suis toujours pour tester mes ResultSet lol

    Voici le code en question :

    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
    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
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
     
     
    import java.sql.*; 
     
    public class maClass { 
     
    	public static void affiche(String s) {
    		System.out.println(s);
    	}
     
    	public static void afficherCaracteristiques(ResultSet resultat)throws SQLException{
    		int type = resultat.getType();
    		//	  ou a partir du Statement
    		//	  int type = resultat.getStatement().getResultSetType();
    		int concurrency = resultat.getConcurrency();
    		//	  ou a partir du Statement
    		//	  int concurrency = resultat.getStatement().getResultSetConcurrency();
    		String sType = "";
    		String sConcurrency = "";
    		switch(type){
    			case ResultSet.TYPE_FORWARD_ONLY:
    				sType = "Type : FORWARD_ONLY";
    			break;
    			case ResultSet.TYPE_SCROLL_INSENSITIVE:
    				sType = "Type : SCROLL_INSENSITIVE";
    			break;
    			case ResultSet.TYPE_SCROLL_SENSITIVE:
    				sType = "Type : SCROLL_SENSITIVE";
    			break;
    			default : 
    				sType = "Type inconnu ??? Bug ???";
    			break;
    		}
    		switch(concurrency){
    			case ResultSet.CONCUR_READ_ONLY:
    				sConcurrency = "Concurrency : CONCUR_READ_ONLY";
    			break;
    			case ResultSet.CONCUR_UPDATABLE:
    				sConcurrency = "Concurrency : CONCUR_UPDATABLE";
    			break;
    			default : 
    				sConcurrency = "Concurrency inconnue ??? Bug ???";
    			break;
    		}
    		System.out.println("Les caractéristiques de ce ResultSet sont : ");
    		System.out.println(sType);
    		System.out.println(sConcurrency);
    	}	                  
     
     
    	public static void main(String[] args) {  
     
    		try{
     
    		// Chargement du driver :
    		DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
    		// OU FAIRE :
    		// Class.forName("oracle.jdbc.driver.OracleDriver");
     
    		affiche("-- Activation de la connexion JAVA<->BD ORACLE--"); 
    		Connection conx = DriverManager.getConnection("jdbc:oracle:thin:mon_nom_user/mon_pass@localhost:1521:orcl");
     
    		// ----------------------------------------------------------------------
    		//                              Les requetes                            //
    		// ----------------------------------------------------------------------
     
    		affiche("-- DEBUT DES REQUETES --"); 
     
    		String detruireTableMembres = "DROP TABLE MEMBRES"; 
     
     
    		String creerTableMembres = "CREATE TABLE MEMBRES(" +
    		" No_Carte number(6) primary key, " +
    		" Nom char(20), " +
    		" Adr char(50) not null, " +
    		" Code_postal number(5), "  +
    		" Ville char(30) not null, " +
    		" constraint codeposte check(Code_postal >= 100 and Code_postal <= 96999))"; 
     
    		// Création d'un objet Statement apres l'activation d'une connexion :
    		Statement stmt = conx.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
     
    		// Destruction des tables, a mettre en commentaire si c'est la premiere
    		// fois qu'on execute ce code (car la table n'existe pas )
    		stmt.executeUpdate(detruireTableMembres);		
     
    		// Creation des tables
    		stmt.executeUpdate(creerTableMembres);
     
    		// INSERTION 
    		stmt.executeUpdate("INSERT INTO MEMBRES VALUES (100001, 'Daniel', '9 allée de la République', 75016, 'Paris')");
    		stmt.executeUpdate("INSERT INTO MEMBRES VALUES (100002, 'Helen', '8 rue de la République', 75017, 'Paris')");
     
    		affiche("> REQUETE DE SELECTION ...");
     
    		ResultSet rs;
    		rs=stmt.executeQuery("SELECT * FROM MEMBRES");
     
    		affiche("> test debug 1...");
    		afficherCaracteristiques(rs);
    		affiche("> test debug caracteristique fin...");
     
    		/** 
                     // ----- ANCIEN CODE -----
                     while(rs.next()){ 
                            int num = rs.getInt(1); 
                            String nom = rs.getString(2); 
                            String adr = rs.getString(3); 
                            int cod = rs.getInt(4); 
                            String ville = rs.getString(5); 
                            affiche("> test debug 2...");             
                            System.out.println(nom + " a pour numero de carte " +num+ " et habite " +adr+ " , " +ville+ " , " + cod); 
                            affiche("> test debug 3...");             
                            rs.deleteRow(); 
                            affiche("> test debug 4...");
                     }
                     */
     
    		// ----- NOUVEAU CODE DE TEST ----- 
    		rs.absolute(1);
    		rs.deleteRow();
     
    		affiche("-- FIN DES REQUETES --");
     
    		stmt.close();
    		rs.close();
    		conx.close();
     
    		}
    		catch(SQLException sqle) {
    			System.out.println("Exception SQL : ");
    			while (sqle != null) {
    			   String message = sqle.getMessage();
    			   String sqlState = sqle.getSQLState();
    			   int errorCode = sqle.getErrorCode();
    			   System.out.println("Message = "+message);
    			   System.out.println("SQLState = "+sqlState);
    			   System.out.println("ErrorCode = "+errorCode);
    			   sqle.printStackTrace();
    			   sqle = sqle.getNextException();
    			}
     
    		}
    		catch(Exception e){
    		   System.out.println("Autre erreur : " + e.getMessage());
    		   e.printStackTrace();
    		}
     
    	}// fin main  
     
     
    }// fin maClass
    Voilà, pour simplifier le debuggage et en attendant les options du ResultSet soit bien fixée, j'ai mis de simples instructions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    		rs.absolute(1);
    		rs.deleteRow();
    J'obtiens :


    -- Activation de la connexion JAVA<->BD ORACLE--
    -- DEBUT DES REQUETES --
    > REQUETE DE SELECTION ...
    > test debug 1...
    Les caractéristiques de ce ResultSet sont :
    Type : SCROLL_INSENSITIVE
    Concurrency : CONCUR_READ_ONLY
    > test debug caracteristique fin...
    Exception SQL :
    java.sql.SQLException: Opération non valide sur un ensemble de résultats de type read-only : deleteRow
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:125)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:162)
    at oracle.jdbc.driver.BaseResultSet.deleteRow(BaseResultSet.java:516)
    at maClass.main(maClass.java:124)
    Message = Opération non valide sur un ensemble de résultats de type read-only : deleteRow
    SQLState = null
    ErrorCode = 17076
    C'est logique a priori(on est en mode Read ONly, donc pas de suppression possible), mais je rappelle que c'est comme si les arguments du Statement n'ont pas été pris en compte.

    et en faisant la recuperation des caractéristique via le statement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    	public static void afficherCaracteristiques(ResultSet resultat)throws SQLException{
    		//int type = resultat.getType();
    		//	  ou a partir du Statement
    			  int type = resultat.getStatement().getResultSetType();
    		//int concurrency = resultat.getConcurrency();
    		//	  ou a partir du Statement
    			  int concurrency = resultat.getStatement().getResultSetConcurrency();
     
    ...etc
    J'ai donc bien le READ ONLY desactivé :

    -- Activation de la connexion JAVA<->BD ORACLE--
    -- DEBUT DES REQUETES --
    > REQUETE DE SELECTION ...
    > test debug 1...
    Les caractéristiques de ce ResultSet sont :
    Type : SCROLL_SENSITIVE
    Concurrency : CONCUR_UPDATABLE
    > test debug caracteristique fin...
    java.sql.SQLException: Opération non valide sur un ensemble de résultats de type read-only : deleteRow
    Exception SQL :
    Message = Opération non valide sur un ensemble de résultats de type read-only : deleteRow
    SQLState = null
    ErrorCode = 17076
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:125)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:162)
    at oracle.jdbc.driver.BaseResultSet.deleteRow(BaseResultSet.java:516)
    at maClass.main(maClass.java:124)
    Il n'y a donc pas de cohérence entre les options effectives du ResultatSet et les options que le Statement lui fixe... :

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 58
    Points : 55
    Points
    55
    Par défaut
    Un truc con...

    Je me demande si ton driver autorise ce genre de chose... P'tet que c'est betement pas implémenter dedans...
    Effectivement, un truc con ! lol , c'est bien à cause du driver qui "n'assure pas tout correctement" !

    J'ai changé de driver, les méthodes de mes ResultSet ..etc marchent comme prévues

    Merci de m'avoir mis sur la voie

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 220
    Points : 266
    Points
    266
    Par défaut
    Je t'en prie, j'avais rencontré ce genre de probleme... Bon courage pour la suite...

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

Discussions similaires

  1. [JDBC]Probleme de récupération dans le resultSet
    Par cameleon2002 dans le forum JDBC
    Réponses: 5
    Dernier message: 28/12/2005, 17h21
  2. JDBC: Probleme de ResultSet
    Par ybenmakh dans le forum JDBC
    Réponses: 1
    Dernier message: 24/11/2005, 10h32
  3. [weblogic 8.1][JDBC] Probleme avec une requete
    Par Sniper37 dans le forum Weblogic
    Réponses: 3
    Dernier message: 08/04/2005, 11h11
  4. Réponses: 4
    Dernier message: 15/01/2005, 16h05
  5. Réponses: 13
    Dernier message: 10/05/2004, 16h49

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