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 :

Comparer les résultats de deux requêtes SQL


Sujet :

JDBC Java

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2015
    Messages : 8
    Points : 3
    Points
    3
    Par défaut Comparer les résultats de deux requêtes SQL
    Bonjour ,

    Je suis en train de développer une application java qui prend en entrée deux bases de données (Miscrosoft Access) avec un 2 boutons "parcourir" pour faire une comparaison des résultats de deux mêmes requêtes SQL sur chacune des deux bases.

    Je parviens à connecter les deux bases et effectuer les requêtes SQL (SELECT) mais le problème que je n'ai pas d'idée comment je peux comparer.
    Comment je peux extraire le résultat des requêtes et les comparer ? :/

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Il y a trois aspects à prendre en compte :

    1. comparer la structure du résultat. A priori, on devrait comparer ce qui est comparable, donc les mêmes structures, du moins théoriques. Deux tables ayant les mêmes colonnes à priori, ou du moins dont le SELECT SQL ramène les mêmes colonnes, dans le même ordre.
      Donc, on peut commencer par comparer le nombre de colonnes, puis colonne par colonne, le nom et le type. On peut faire ça en utilisant le ResultSetMetaData, qu'on obtient par la ResultSet.
    2. Ensuite, on peut comparer génériquement un enregistrement d'un resultset avec celui de l'autre, en parcourant les colonnes de 1 à le nombre de colonnes, et en utilisant la méthode getObject(columnIndex) de ResultSet, combiné avec wasNull() pour les null, et utiliser equals() pour comparer les valeurs lorsqu'elles "ne sont pas null".
    3. Ensuite, il comparer globalement les ResultSet, en ce sens que s'il y a un enregistrement dans l'un des résultats mais pas dans l'autre, il y a différence. La solution la plus simple est de trier les 2 résultats (ORDER BY) avec le même critère, ce qui permet à ce que le 2) suffise à détecter ces différences. L'algorithme devient : on compare un à un les enregistrements, et, dès qu'un champ est différent, on a trouvé une différence.


    Ensuite, il faudra développer tout ça en fonction de la qualification des différences que tu recherches : est-ce qu'il s'agit juste de dire qu'il y a au moins une différence, si des enregistrements sont présent ou absent dans un des deux, si des enregistrements ont des propriétés différentes, voire précisément lesquelles, etc.

    Si les comparaisons de type 2) et 3) doivent être faites même si la comparaison 1) est fausse, ce sera plus complexe, mais pas impossible, dans une certaine mesure.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2015
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Salut

    en faite les deux tables ont le même shema , même colonne et même ligne ce qui diffère c'est les données , donc je dois les comparer pour savoir le changement qui est parvenu et le résultat doit être un fichier excel donc je précise le champ ou j'ai trouvé la différence avec deux valeur ( old et new )

    j’espère que j'ai bien expliqué

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par hm sami Voir le message
    en faite les deux tables ont le même shema , même colonne et même ligne ce qui diffère c'est les données , donc je dois les comparer pour savoir le changement qui est parvenu et le résultat doit être un fichier excel donc je précise le champ ou j'ai trouvé la différence avec deux valeur ( old et new )
    Donc tu peux éviter le test 1). En faisant la boucle sur les colonnes, chaque fois que tu as une différence, tu peux relever le nom de la colonne, par getMetaData().getColumnLabel(columnIndex).

    Par fichier excel, je suppose que tu parles de CSV, ou de tab-separated, de fichier texte en tout cas, et pas de fichier xls/xlsx ? Tu peux faire ton code en faisant System.out.println() pour le mettre au point, et à la fin tu remplaces System.out, par une instance de PrintStream créée à partir d'un File et le tour est joué.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2015
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Désolé pour dérangement , Mais
    après cette boucle que doit on faire
    for(int i; i<resultMeta.getcolumnCount(); i++) {}

    de plus on a pas besoin de récupérer nos donnée dans un vecteur pour pouvoir comparer ???

    Mercii

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par hm sami Voir le message
    de plus on a pas besoin de récupérer nos donnée dans un vecteur pour pouvoir comparer ???
    Non, pas besoin.

    Citation Envoyé par hm sami Voir le message
    Désolé pour dérangement , Mais
    après cette boucle que doit on faire
    for(int i; i<resultMeta.getcolumnCount(); i++) {}

    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
    	public void compare(PrintStream out, ResultSet oldRs, ResultSet newRs) throws SQLException {
     
    		ResultSetMetaData oldMd = oldRs.getMetaData();
    		//ResultSetMetaData newMd = newRs.getMetaData();
     
    		int nbCol = oldMd.getColumnCount();
    		//int newNbCol = newMd.getColumnCount();
     
    		// normalement on devrait tester ici si nbCol == newNbCol et si les colonnes sont les mêmes/de même type
    		// on passe çà parce que tu es sûr que ça ne sera jamais le cas
     
    		// attention, ne fonctionne que si les resultset sont triés dans le même ordre
    		boolean loop=true;
    		while( loop ) {
    			if ( oldRs.next() ) {
    				if ( newRs.next() ) {
     
    					for( int i=1; i<=nbCol; i++ ) {
     
    						Object oldValue = oldRs.getObject(i);
    						Object newValue = newRs.getObject(i);
     
    						if ( oldRs.wasNull() ) {
    							if ( !newRs.wasNull() ) {
    								writeDifference( out, oldMd.getColumnName(i), "NULL", newValue.toString() );
    							}
    						}
    						else if ( newRs.wasNull() ) {
    							writeDifference( out, oldMd.getColumnName(i), oldValue.toString(), "NULL" );
    						}
    						else if ( !oldValue.equals(newValue) ) {
    							writeDifference( out, oldMd.getColumnName(i), oldValue.toString(), newValue.toString() );
    						}
     
     
    					}
     
    				}
    				else {
    					// il y a moins d'enregistrement dans rs2 que dans rs1...
    					// je ne sais pas ce que tu veux faire dans ce cas...
    					loop = false; // on arrête de comparer en tout cas
    				}
    			}
    			else {
    				if ( newRs.next() ) {
    					// il y a plus d'enregistrement dans rs2 que dans rs1...
    					// je ne sais pas ce que tu veux faire dans ce cas...
    				}
    				// else (correspond à la fin des 2 results sets de même taille).
    				loop = false; // on arrête de comparer en tout cas
    			}
    		}
     
    	}
     
    	private void writeDifference(PrintStream out, String name, String oldValue, String newValue) {
     
    		out.printf("%s\t%s\t%s%n", name, oldValue, newValue);
     
    	}
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2015
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    merci pour votre effort ,

    mais je crois que vous m'avez mal compris
    peut on se contacter en privé si ça ne vous dérange pas ?

  8. #8
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par hm sami Voir le message
    peut on se contacter en privé
    Non.
    Citation Envoyé par hm sami Voir le message
    mais je crois que vous m'avez mal compris
    C'est quoi que j'aurais mal compris ?
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  9. #9
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2015
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    en faite voila le sénario de l'application :

    * on choisie deux base de données du pc (Access ) avec deux boutons parcourir
    ** on execute les meme requettes sql sur les deux bases
    ** le resultat des requettes sql on doit le comparer , sachant que notre output est un fichier excel dont on doit avoir le resultat de la comparaison.

  10. #10
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Donc, c'est bien ce que j'avais compris; Et je t'ai donné le code pour comparer les 2 resultsets. tu n'as plus qu'à faire les requêtes, ouvrir le fichier, appeler la méthode, puis fermer tout ce qui doit l'être.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  11. #11
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2015
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Comment je peux trier les resultsets pour qu'il soient identiques

  12. #12
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Pour qu'ils soient comparables tu veux dire (s'ils sont identiques pas besoin de les comparer) ?

    En ajoutant une clause ORDER BY dans ta requête SQL.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

Discussions similaires

  1. Microsoft Access et NetBeans
    Par soufianebenamr dans le forum JDBC
    Réponses: 2
    Dernier message: 28/05/2014, 11h12
  2. JAVA + NETBEANS + ACCESS
    Par Frederick_Etudiant dans le forum NetBeans
    Réponses: 0
    Dernier message: 31/10/2008, 15h36
  3. java.security.AccessControlException: access denied
    Par ludonantes dans le forum Applets
    Réponses: 10
    Dernier message: 28/03/2006, 17h44
  4. Réponses: 2
    Dernier message: 27/03/2006, 17h05
  5. [Date]Date sous Java != celle sous Access
    Par Cyborg289 dans le forum JDBC
    Réponses: 4
    Dernier message: 27/07/2005, 23h11

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