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 :

Comparaison entre une chaine et un champs


Sujet :

JDBC Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 68
    Par défaut Comparaison entre une chaine et un champs
    Bonjour,

    Dans mon application, je récupère dans une variable une chaine de caractères. J'aimerai savoir si celle-ci peut être comparée à un nom de champs d'une table, en parcourant tous ses champs ?

    Si oui, comment ?

    Voilà ce que moi je fais :

    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
    public static void traitementSql() throws SQLException
    	{
    		try
    		{
    		    while (results.next())
    		    {
    //Récupération du champs
    		    	leChamps = parseDef.getRecupField().toLowerCase();
     
    		        resultatFinal = results.getString(leChamps);
    		        break;
    		    }
    		}
    		catch (SQLException e)
    		{
    		    System.err.println(e.getMessage());
    		}
    		finally
    		{
    		    results.close();
    		}
    	}
    Cependant il me dit pour chaque requête "Column 'xxx' not found."...
    J'ai bien vérifié les champs, les noms correspondent bien...J'effectue même un "tolower" en pensant que le problème venait de là, mais apparemment non...!

    Cordialement,
    Clément G.

  2. #2
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    457
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 457
    Par défaut
    Citation Envoyé par exqo77 Voir le message
    Bonjour,

    Dans mon application, je récupère dans une variable une chaine de caractères. J'aimerai savoir si celle-ci peut être comparée à un nom de champs d'une table, en parcourant tous ses champs ?

    Si oui, comment ?

    Cordialement,
    Clément G.
    Tu te connectes à la db, tu récupères le ResultSet..
    Tu récèpères le ResultSetMetaData de celui-ci.
    Tu parcours le RSMD, tu boucles tant qu'il y a des colonnes et tu compares au nom courant ?
    C'est bien ça que tu cherches ?

    Si tu veux un exemple de code, j'te donnerai

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 68
    Par défaut
    J'ai mis la méthode, si ça peut t'aider à comprendre et une explication dans mon premier post


    Pour ce qui est de ta solution, j'utilise bien un ResultSet (results) par contre un exemple de code ne serait pas de refus !

  4. #4
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    457
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 457
    Par défaut
    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
     
    String chaineAComparer ="CHAMPS1";
    // Execute the statement
    			cstmt.execute();
    			ResultSet rs = (ResultSet)cstmt.getObject(1);
    			ResultSetMetaData rsmd = rs.getMetaData();
     
     
    			// Columns name
    			for(int i=0;i<rsmd.getColumnCount();i++)
    			{
    				if(chaineAComparer.equalsIgnoreCase(rsmd.getColumnName(i))
    {
       // TRAITEMENT SI TU AS TROUVE
    }
    else
    {
       // TRAITEMENT SI TU N AS PAS TROUVE
    }
     
    			}
    Voilà par exemple

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 68
    Par défaut
    A quoi correspond le "cstmt" ?

  6. #6
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    457
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 457
    Par défaut
    Citation Envoyé par exqo77 Voir le message
    A quoi correspond le "cstmt" ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    OracleCallableStatement cstmt;
    			cstmt =(OracleCallableStatement) cn.prepareCall("{call SCHEMA.PROCEDURE (?,?)}");
    			//		Declare that the ? is a return value
    			cstmt.registerOutParameter (1, OracleTypes.CURSOR);
    			cstmt.registerOutParameter(2,OracleTypes.NUMBER);
    			// Execute the statement
    			cstmt.execute();
    dans le cas où tu appeles une procedure stockée.. sinon ..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    String sql="select ... from ... ";
    		PreparedStatement statement = cn.prepareStatement(sql);
    		// get the resultset
    		ResultSet resultat = statement.executeQuery();
    Pareil avec ceci où cn est ton OracleConnection ou autre...

    Voilà j'espère que c'est plus clair, je file vite !

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 68
    Par défaut
    J'utilise du MySql donc est-ce la même manipulation qu'avec Oracle ?

    Sinon pour la seconde solution, c'est bien ce que je fais à l'aide de ce code :

    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
    public void connexionSQL()
    	{
    		try
    		{	
    			Class.forName("com.mysql.jdbc.Driver").newInstance();
    			java.sql.Connection conn = java.sql.DriverManager.getConnection("jdbc:mysql://172.**.*.*/***","******","*******");
    			System.out.println("Connexion ok");			
     
    			//Certaines ligne n'ont pas de spécification au niveau de la TABLE,
    			//la TABLE est est donc celle dont le nom correspond au nom du .def
    			if (parseDef.getRecupLigne().contains("Table="))
    			{
    				try
    				{
     
    					String tableLower = laDecoupe.getRecupTable().toLowerCase();
    					String query = "SELECT * FROM "+tableLower+";";
    					java.sql.Statement stmt = conn.createStatement();
    					results = stmt.executeQuery(query);
     
    //traitementsql étant la méthode déposé ici dans mon 1er post
    					traitementSql();
    				}
    				catch(Exception e)
    				{
    					System.out.println("exception du a la requete");
    				}
    			}
    			else
    			{
    				try
    				{
    					String query = "SELECT * FROM ddl012;";
    					java.sql.Statement stmt = conn.createStatement();
    					results = stmt.executeQuery(query);				
    					traitementSql();
    				}
    				catch(Exception e)
    				{
    					System.out.println("exception du a la requete");
    				}
    			}
     
    			conn.close();
    			System.out.println("Connexion fermée");
    		}
    		catch(Exception e)
    		{
    			System.out.println("Connexion ratée: "+e);
    			System.exit(-1);
    		}
    	}
    Mais n'utilisant pas Oracle le "OracleCallableStatement" me pose problème dans l'utilisation de l'exemple proposé ci-dessus...

  8. #8
    Membre chevronné
    Inscrit en
    Juillet 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 534
    Par défaut
    J'utilise du MySql donc est-ce la même manipulation qu'avec Oracle ?
    Oui, utilise a la place de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    OracleCallableStatement

    c'est bien ce que je fais à l'aide de ce code :
    C'est correct, tu peux faire plus court comme ceci
    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
     
    public void connexionSQL() {
        try {	
     
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            java.sql.Connection conn =   java.sql.DriverManager.getConnection("jdbc:mysql://172.**.*.*/***","******","*******");
            System.out.println("Connexion ok");			
     
            String query;		
    	//Certaines ligne n'ont pas de spécification au niveau de la TABLE,
    	//la TABLE est est donc celle dont le nom correspond au nom du .def
    	if (parseDef.getRecupLigne().contains("Table=")) {
                String tableLower = laDecoupe.getRecupTable().toLowerCase();
                query = "SELECT * FROM "+tableLower+";";
            } else {
                query = "SELECT * FROM ddl012;";
     	}
            try {
     
                java.sql.Statement stmt = conn.createStatement();
    	    results = stmt.executeQuery(query);
     
                //traitementsql étant la méthode déposé ici dans mon 1er post
    	    traitementSql();
            } catch(Exception e) {
                System.out.println("exception du a la requete");
            }
     
    	conn.close();
    	System.out.println("Connexion fermée");
        } catch(Exception e) {
            System.out.println("Connexion ratée: "+e);
    	System.exit(-1);
        }
    }

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 68
    Par défaut
    Ok merci beaucoup !

    Citation Envoyé par libuma Voir le message
    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
     
    String chaineAComparer ="CHAMPS1";
    // Execute the statement
    			cstmt.execute();
    			ResultSet rs = (ResultSet)cstmt.getObject(1);
    			ResultSetMetaData rsmd = rs.getMetaData();
     
     
    			// Columns name
    			for(int i=0;i<rsmd.getColumnCount();i++)
    			{
    				if(chaineAComparer.equalsIgnoreCase(rsmd.getColumnName(i))
    {
       // TRAITEMENT SI TU AS TROUVE
    }
    else
    {
       // TRAITEMENT SI TU N AS PAS TROUVE
    }
     
    			}

    Et cet exemple là, dois-je l'éxecuter au niveau du second Try ?

  10. #10
    Membre chevronné
    Inscrit en
    Juillet 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 534
    Par défaut
    Et cet exemple là, dois-je l'éxecuter au niveau du second Try ?
    C'est a dire

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 68
    Par défaut
    Comme ça :

    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
    public void connexionSQL()
    	{
    		try
    		{	
    			Class.forName("com.mysql.jdbc.Driver").newInstance();
    			java.sql.Connection conn = java.sql.DriverManager.getConnection("jdbc:mysql://***");
    			System.out.println("Connexion ok");			
     
    			String query;
    			//Certaines ligne n'ont pas de spécification au niveau de la TABLE,
    			//la TABLE est est donc celle dont le nom correspond au nom du .def
    			if (parseDef.getRecupLigne().contains("TABLE=")) {
    	            String tableLower = laDecoupe.getRecupTable().toLowerCase();
    	            query = "SELECT * FROM "+tableLower+";";
    	        }
    			else
    	        {
    	            query = "SELECT * FROM ddl012;";
    	        }
    				try
    				{
    					cstmt.execute();
    					results = (ResultSet)cstmt.getObject(1);
     
    					for(int i=0;i<rsmd.getColumnCount();i++)
    					{
    						if(resultatFinal.equalsIgnoreCase(rsmd.getColumnName(j)))
    						{
    							java.sql.Statement stmt = conn.createStatement();
    						    results = stmt.executeQuery(query);
     
    						    traitementSql();
    						}
    						else
    						{
     
    						}
    					}
    				}
    				catch(Exception e)
    				{
    					System.out.println("exception du a la requete");
    				}
     
    			//champsSql();
    			conn.close();
    			System.out.println("Connexion fermée");
    		}
    		catch(Exception e)
    		{
    			System.out.println("Connexion ratée: "+e);
    			System.exit(-1);
    		}
    	}

  12. #12
    Membre chevronné
    Inscrit en
    Juillet 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 534
    Par défaut
    - Ou se trouve la declaration de
    cstmt
    ?

    - Ton code ne lit seulement une ligne du resultset.

    A part ca, oui c'est possible

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 68
    Par défaut
    Au début de ma classe j'ai un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CallableStatement cstmt;
    Mais je ne comprend pas cet exemple de code :
    Citation Envoyé par libuma Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    OracleCallableStatement cstmt;
    			cstmt =(OracleCallableStatement) cn.prepareCall("{call SCHEMA.PROCEDURE (?,?)}");
    			//		Declare that the ? is a return value
    			cstmt.registerOutParameter (1, OracleTypes.CURSOR);
    			cstmt.registerOutParameter(2,OracleTypes.NUMBER);
    			// Execute the statement
    			cstmt.execute();
    dans le cas où tu appeles une procedure stockée.. sinon ..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    String sql="select ... from ... ";
    		PreparedStatement statement = cn.prepareStatement(sql);
    		// get the resultset
    		ResultSet resultat = statement.executeQuery();
    Car pour l'instant effectivement mon resultset n'est pas lu entièrement...et du coup j'obtiens une erreur me disant "java.lang.NullPointerException" (valeur null)

  14. #14
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    457
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 457
    Par défaut
    try
    {
    cstmt.execute();
    results = (ResultSet)cstmt.getObject(1);
    ...
    Tu fais cstmt.execute() sur cstmt qui n'est pas instancié.. c'est normal que tu es un NullPointerException..

    Tu dois faire un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    PreparedStatement statement = conn.createStatement();
    // get the resultset
    ResultSet resultat = statement.executeQuery(query)
    Tu ne dois pas utiliser le cstmt.

    Ca fait longtemps que je n'ai plus trop utiliser mysql et je n'ai pas trop le temps de tout revoir mais je pense que ça devrait te mettre bien sur la piste.

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 68
    Par défaut
    Ok problème résolu

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 20/01/2014, 21h57
  2. comparaison entre une partie de 2 chaine de caratere
    Par fabien335 dans le forum MATLAB
    Réponses: 3
    Dernier message: 28/02/2010, 08h43
  3. comparaison entre une variable et un champ de table
    Par lebarjot dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 19/02/2010, 11h38
  4. [VB6] comparaison d'une chaine ligne par ligne
    Par kubiczek dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 11/05/2006, 22h52
  5. Recherche d'une chaine dans un champ
    Par Cyberbob002 dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 06/01/2006, 15h21

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