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 :

Comment récupérer les valeurs dans une requête


Sujet :

JDBC Java

  1. #1
    Débutant
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 022
    Points : 332
    Points
    332
    Par défaut Comment récupérer les valeurs dans une requête
    Bonjour
    J'ai maintenant une couche driver qui marche, je travaille sur la couche de plus haut niveau et j'ai une question à ce sujet:
    Dans un premier temps je vous net le 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
     
    		   pListText = new ArrayList<Structure.ElementWork>();
    		   String cmd = "SELECT siIdDocument, vcDocument FROM T_WORK_INFORMATION WHERE siIdStateDocument = 3";
    		   iNbResultFound = 0;
    		   iNbResultFound = InterbaseManager.ExecuteSelectRequest( cmd);
    		   try
    		   {
    			   while( InterbaseManager.myReader.next());
    			   {
    				   WorkElement.Id = InterbaseManager.myReader.getInt( 0);
    				   WorkElement.wsText = InterbaseManager.myReader.getString( 1);
    				   pListText.add(WorkElement);
    			   }
    		   }
    		   catch(Exception ex)
    		   {
    			   ex.printStackTrace();
    		   }
    puis le message d'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    java.sql.SQLException: [Microsoft][Gestionnaire de pilotes ODBC] Index de descripteur non valide
    	at sun.jdbc.odbc.JdbcOdbc.createSQLException(Unknown Source)
    	at sun.jdbc.odbc.JdbcOdbc.standardError(Unknown Source)
    	at sun.jdbc.odbc.JdbcOdbc.SQLGetDataInteger(Unknown Source)
    	at sun.jdbc.odbc.JdbcOdbcResultSet.getDataInteger(Unknown Source)
    	at sun.jdbc.odbc.JdbcOdbcResultSet.getInt(Unknown Source)
    	at com.all4tec.matelo.linguistique.wizards.MissionDatabaseManager.ReadWork(MissionDatabaseManager.java:81)
    	at com.all4tec.matelo.linguistique.wizards.LinguistiqueImportWizard.RecupereNomDesFichier(LinguistiqueImportWizard.java:61)
    	at com.all4tec.matelo.linguistique.wizards.LinguistiqueImportWizard$1.run(LinguistiqueImportWizard.java:87)
    	at org.eclipse.jface.operation.ModalContext$ModalContextThread.run(ModalContext.java:121)
    Je vous demande comment adresser les champs dans la boucle while du code.
    J'ai essayé dans un premier temps de partir à 1 puis j'ai essayé de partir à 0
    Quand on compte à partir de 1 on récupère:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java.sql.SQLException: [Microsoft][Gestionnaire de pilotes ODBC] État de curseur non valide
    à Noter que dans la base siIdDocument est le premier enregistrement et vcDocument est le deuxième
    J'ai modifié le programme pour me rendre indépendant de la question "est ce que on doit dire sur l'index":
    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
     
    		   pListText = new ArrayList<Structure.ElementWork>();
    		   String cmd = "SELECT siIdDocument, vcDocument FROM T_WORK_INFORMATION WHERE siIdStateDocument = 3";
    		   iNbResultFound = 0;
    		   iNbResultFound = InterbaseManager.ExecuteSelectRequest( cmd);
    		   try
    		   {
    			   while( InterbaseManager.myReader.next()&& iNbResultFound > 0);
    			   {
    				   String nom;
    				   nom = "siIdDocument";
    				   int index = InterbaseManager.myReader.findColumn(nom);
    				   WorkElement = new Structure.ElementWork();
    				   WorkElement.Id = InterbaseManager.myReader.getInt( index);
    				   index++;
    				   WorkElement.wsText = InterbaseManager.myReader.getString( index);
    				   pListText.add( WorkElement);
    				   iNbResultFound--;
    			   }
    		   }
    		   catch( Exception ex)
    		   {
    			   ex.printStackTrace();
    			}
    mais cette méthode n'a rien changé le premier index est positionné a 1 et il part en carafe( en exception)
    Je me demande si on ne doit pas coder int index dans un type plus spécialisé?
    Celui qui m'aidera sera

  2. #2
    Débutant
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 022
    Points : 332
    Points
    332
    Par défaut les besoins sont ils complet
    J'ai fait pas mal d'ajouts dans ce thread, Que manque t il? peut être le code réactualisé
    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
                         int iNbResultFound;
    		   pListText = new ArrayList<Structure.ElementWork>();
    		   String cmd = "SELECT siIdDocument, vcDocument FROM T_WORK_INFORMATION WHERE siIdStateDocument = 3";
    		   iNbResultFound = 0;
    		   iNbResultFound = InterbaseManager.ExecuteSelectRequest( cmd);
    		   ResultSetMetaData metadata = InterbaseManager.myReader.getMetaData();
    		   int typeSQL = metadata.getColumnType( 1);
    		   String nomTypeSQL = metadata.getColumnTypeName( 1);
    		   String typeJava = metadata.getColumnClassName( 1);
    		   try
    		   {
    			   while( InterbaseManager.myReader.next()&& iNbResultFound > 0);
    			   {
    				   java.lang.Integer index = InterbaseManager.myReader.findColumn( "siIdDocument");
    				   WorkElement = new Structure.ElementWork();
    				   int id =  InterbaseManager.myReader.getInt( "siIdDocument");
    				   String str = InterbaseManager.myReader.getString( "vcDocument");
    				   WorkElement.Id = id;
    				   WorkElement.wsText = str;
    				   pListText.add( WorkElement);
    				   iNbResultFound--;
    			   }
    		   }
    		   catch( Exception ex)
    		   {
    			   ex.printStackTrace();
    			}

  3. #3
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    Il semble que tu attaque directement une librairie sun sun.jdbc.odbc... Qui correspond à l'implémentation de ResultSet
    Une rapide lecture de la documentation indique :
    int getInt(int columnIndex)
    Parameters:
    columnIndex - the first column is 1, the second is 2, ...
    Returns:
    the column value; if the value is SQL NULL, the value returned is 0
    Si tu n'es pas sûr des index à utiliser il est préférable d'utiliser les noms des colonnes :

    int getInt(String columnLabel)
    Sinon il nous faudrait la déclaration de certaines de tes variables On ne sait pas exactement ce qu'est InterbaseManager.myReaderNote : Ton code devrait ressemblé à cela pour le moment :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    pListText = new ArrayList<Structure.ElementWork>();
    String cmd = "SELECT siIdDocument, vcDocument FROM T_WORK_INFORMATION WHERE siIdStateDocument = 3";
    InterbaseManager.ExecuteSelectRequest(cmd);
    ResultSet resultset = InterbaseManager.myReader;
    try {
       while( resultset.next()){
    		WorkElement = new Structure.ElementWork();
    		WorkElement.Id = resultset.getInt( "siIdDocument");
    		WorkElement.wsText = resultset.getString( "vcDocument");
    		pListText.add( WorkElement);
    	}
    } catch( Exception ex) {
    	ex.printStackTrace();
    }
    Cordialement,
    Patrick Kolodziejczyk.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  4. #4
    Débutant
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 022
    Points : 332
    Points
    332
    Par défaut OUI
    Je suis d'accord avec vous mon code ressemble au votre tout au moins en ce qui concerne le désignation des colonnes. et il part en exception état du curseur non valide. Je recopie votre code et je constate que rien ne change
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java.sql.SQLException: [Microsoft][Gestionnaire de pilotes ODBC] État de curseur non valide

  5. #5
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    Quel est le résultat de ce code ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    String cmd = "SELECT siIdDocument, vcDocument FROM T_WORK_INFORMATION WHERE siIdStateDocument = 3";
    InterbaseManager.ExecuteSelectRequest(cmd);
    ResultSet resultset = InterbaseManager.myReader;
    ResultSetMetaData rsmd = resultset.getMetaData();
    System.out.println("Type de id Document : "+rsmd .getColumnTypeName(1));
    System.out.println("Type de document : "+rsmd .getColumnTypeName(2));
    Cordialement,
    Patrick Kolodziejczyk.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  6. #6
    Débutant
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 022
    Points : 332
    Points
    332
    Par défaut J'ai copié le code
    Il s'est déroulé correctement
    il a ressortie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Type de id Document : int identity
    Type de document : varchar
    est ce que le fait que le champ soit identité peut avoir un rapport

  7. #7
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    Non, cela veux dire qu'il y a un auto-incrément dessus d'après ce que je sais.
    Ce qui veux bien dire que tu as un int dans la colonne 1 et un string dans la colonne 2.

    Regarde avec 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
    pListText = new ArrayList<Structure.ElementWork>();
    String cmd = "SELECT siIdDocument, vcDocument FROM T_WORK_INFORMATION WHERE siIdStateDocument = 3";
    InterbaseManager.ExecuteSelectRequest(cmd);
    ResultSet resultset = InterbaseManager.myReader;
    ResultSetMetaData rsmd = resultset.getMetaData();
    try {
       while( resultset.next()){
    		WorkElement = new Structure.ElementWork();
    if(java.sql.Types.INTEGER ==rsmd .getColumnType(1)){
     
    		WorkElement.Id = resultset.getInt(1);
    }else{
    System.out.println("On est pas sur de l'integer");
    }
    if(java.sql.Types.VARCHAR ==rsmd .getColumnType(2)){
    		WorkElement.wsText = resultset.getString(2);
    }else{
    System.out.println("On est pas sur du varchar");
    }
    		pListText.add( WorkElement);
    	}
    } catch( Exception ex) {
    	ex.printStackTrace();
    }
    Normalement, il devrait soit faire ce qu'on veux, soit nous dire que c'est pas un integer...

    http://docs.oracle.com/javase/6/docs...sql/Types.html

    Cordialement,
    Patrick Kolodziejczyk.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  8. #8
    Débutant
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 022
    Points : 332
    Points
    332
    Par défaut J'ai une difficulté
    il ne rentre plus dans la boucle while.J'ai vérifié que dans la procédure le while est bien exécuté; Je cherche. Je reviendrai quand j'aurais résolu ce pb.
    J'ai fait bestial, j'ai supprimé le while; j'ai gardé le next; Je suis passé dans le code de l'int il a détecté un int et je suis sorti en exception
    puis j'ai passé le varchar en premier et j'ai eu le même résultat : Ce n'est donc pas un problème de typage

  9. #9
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par JeanNoel53 Voir le message
    il ne rentre plus dans la boucle while
    Citation Envoyé par JeanNoel53 Voir le message
    J'ai fait bestial, j'ai supprimé le while; j'ai gardé le next; Je suis passé dans le code de l'int il a détecté un int et je suis sorti en exception
    Ce qui est normal. Si tu rentre pas dans le while, c'est parce qu'il n'y a pas de next, donc qu'il n'y a rien à lire, donc l'accès à une colonne entrainera une exception.

    Tu peux nous donner ton code complet, y compris les méthode ExecuteSelectRequest etc de ton InterbaseManager que personne ne peut deviner.

  10. #10
    Débutant
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 022
    Points : 332
    Points
    332
    Par défaut Je donne le code d'interbase et le code de MissionDatabase
    D'abord MissionDatabase

    simplement la methode
    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
    	static Structure.ElementWork WorkElement;
    	static ArrayList<Structure.ElementWork> ReadWork() throws SQLException
    	{
    		   ArrayList<Structure.ElementWork> pListText;
    		   int iNbResultFound;
    		   pListText = new ArrayList<Structure.ElementWork>();
    		   String cmd = "SELECT siIdDocument, vcDocument FROM T_WORK_INFORMATION WHERE siIdStateDocument = 3";
    		   iNbResultFound = 0;
    		   iNbResultFound = InterbaseManager.ExecuteSelectRequest( cmd);
    		   ResultSet resultset = InterbaseManager.myReader;
    		   ResultSetMetaData rsmd = resultset.getMetaData();
    		   try 
    		   {
    			   iNbResultFound++;
    			   while( resultset.next())
    			   {
    					WorkElement = new Structure.ElementWork();
    					if(java.sql.Types.VARCHAR ==rsmd.getColumnType(2))
    					{
    						WorkElement.wsText = resultset.getString(2);
    					}
    					else
    					{
    						System.out.println("On est pas sur du varchar");
    					}
    					if(java.sql.Types.INTEGER ==rsmd.getColumnType(1))
    					{
    						WorkElement.Id = resultset.getInt(1);
    					}
    					else
    					{
    						System.out.println("On est pas sur de l'integer");
    					}
    					pListText.add( WorkElement);
    				}
    		   }
    		   catch( Exception ex)
    		   {
    			   ex.printStackTrace();
    		   }
    		   return( pListText);
    	   }
    puis interbase:la Methode
    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
    		static int ExecuteSelectRequest( String wsRequest) throws SQLException
    		{
    			int iNbResultFound = 0;
    			String Result;
    			String stream;
    			boolean Status;
    			// IF myConnection" is not NULL) THEN
    			if( stmt == null)
    			{
    				connection = ConnectServer( "", "", "");
    			}
    			// 
    			try
    			{
    				stmt.execute( wsRequest);
    				myReader = stmt.getResultSet();
    			}
    			catch( Exception ex)
    			{
    				ex.printStackTrace();
    				Status = false;
    			}
    			return( iNbResultFound);
    		}
    	}
    J'ai modifié le code pour résoudre le problème du while.Compte tenu des différentes modification le getString se passe bien il reste l'int qui part en exeption,je repose la question le fait qu'il soit identity ne pose pas de problème?
    le message d'erreur de l'exception est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java.sql.SQLException: [Microsoft][ODBC SQL Server Driver]Index de descripteur non valide

  11. #11
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Ton code de ExecuteSelectRequest est très confus et sujet à erreur. Dans l'ordre:

    une méthode commence par une minuscule, ce sont les classes et constructeurs qui commencent par majuscule (détail qui aide à lire)
    si stmt est null, tu crée une connexion. Mais stmt ne reçois pas de valeur. => un beau NullPointerException en perspective
    le paramètre de de retour ne sert à rien. Il vaut toujours 0. Vire le ou donne lui une valeur utile
    Si le execute lance une exception et la traite en interne, l'appelant n'est pas mis au courant, il va essayer de lire un vieux ResultSet. Met l'appelant au courant que ça a échoué.


    Voilà déjà quelques modifications de 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
    		static ResultSet executeSelectRequest( String wsRequest) throws SQLException
    		{
    			// IF myConnection" is not NULL) THEN
    			if( stmt == null)
    			{
    				connection = connectServer( "", "", "");
    				stmt = connection.createStatement();
     
    			}
    			if (!stmt.execute( wsRequest)){
    			    throw new SQLException("La requête n'était pas un select");
    			}
    			return stmt.getResultSet();
    		}
    	}
    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
    	static ArrayList<Structure.ElementWork> ReadWork()
    	{
    		   ArrayList<Structure.ElementWork> pListText;
    		   int iNbResultFound;
    		   pListText = new ArrayList<Structure.ElementWork>();
    		   String cmd = "SELECT siIdDocument, vcDocument FROM T_WORK_INFORMATION WHERE siIdStateDocument = 3";
    		   ResultSet resultset = InterbaseManager.executeSelectRequest( cmd);
    		   ResultSetMetaData rsmd = resultset.getMetaData();
    		   try 
    		   {
    			   while( resultset.next())
    			   {
    					WorkElement = new Structure.ElementWork();
    					if(java.sql.Types.VARCHAR ==rsmd.getColumnType(2))
    					{
    						WorkElement.wsText = resultset.getString(2);
    					}
    					else
    					{
    						System.out.println("On est pas sur du varchar");
    					}
    					if(java.sql.Types.INTEGER ==rsmd.getColumnType(1))
    					{
    						WorkElement.Id = resultset.getInt(1);
    					}
    					else
    					{
    						System.out.println("On est pas sur de l'integer");
    					}
    					pListText.add( WorkElement);
    				}
    		   }
    		   catch( SQLException ex)
    		   {
    			   ex.printStackTrace();
    		   }
    		   return( pListText);
    	   }
    Je trouve aussi qu'il y a bien trop de "static" dans ton code. En objet, static devrait être utilisé pour les cas exceptionnel, pas partout. Rien dans ton code ne justifie du statique. Enfin, les catch (Exception e), tu oublie tout de suite. Ce n'est pas propre. Catche les exceptions que tu peux traiter, pas "toutes". Regarde ton executeSelectRequest, t'as choppé la NullPointerException là dedans et continué comme si de rien n'était.
    Enfin, quand tu poste une exception sur le forum, met la stacktrace complète, voir le contenu complet de ta console. J'ai perdu un temps bête à imaginer quel bout de code pouvait déclencher l'exception, j'aurais été fixé plus vite si j'avais vu les éventuelles autres exceptions qui précédaient.

  12. #12
    Débutant
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 022
    Points : 332
    Points
    332
    Par défaut J'ai retiré des static et le compilatuer me les a fait remettre
    je te met le bloc des exceptions
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    java.sql.SQLException: [Microsoft][ODBC SQL Server Driver]Index de descripteur non valide
    	at sun.jdbc.odbc.JdbcOdbc.createSQLException(Unknown Source)
    	at sun.jdbc.odbc.JdbcOdbc.standardError(Unknown Source)
    	at sun.jdbc.odbc.JdbcOdbc.SQLGetDataInteger(Unknown Source)
    	at sun.jdbc.odbc.JdbcOdbcResultSet.getDataInteger(Unknown Source)
    	at sun.jdbc.odbc.JdbcOdbcResultSet.getInt(Unknown Source)
    	at sun.jdbc.odbc.JdbcOdbcResultSet.getInt(Unknown Source)
    	at com.all4tec.matelo.linguistique.wizards.MissionDatabaseManager.ReadWork(MissionDatabaseManager.java:89)
    	at com.all4tec.matelo.linguistique.wizards.LinguistiqueImportWizard.RecupereNomDesFichier(LinguistiqueImportWizard.java:61)
    	at com.all4tec.matelo.linguistique.wizards.LinguistiqueImportWizard$1.run(LinguistiqueImportWizard.java:87)
    	at org.eclipse.jface.operation.ModalContext$ModalContextThread.run(ModalContext.java:121)
    Compte tenu des différentes modification le getString se passe bien il reste l'int qui part en exception,je repose la question le fait qu'il soit identity ne pose pas de problème? Le type de la donnée porté par getInt est int identity (voir plus haut comment on l'a récupéré)

  13. #13
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Si tu remplace resultset.getInt(1), par resultset.getObject(1), tu obtiens un objet de quel type.

    Aussi, le pont jdbc / odbc, ce n'est pas un bon plan au delà du prototype ou de la compatibilité avec un vieux truc, une raison particulière pour ça?

  14. #14
    Débutant
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 022
    Points : 332
    Points
    332
    Par défaut getObject même punition
    exactement le même comportement que getInt
    le pont ODBC SQLServer vient de la connexion qui ne marchait pas avec le driver initiale
    voir a ce sujet le précédent thread

  15. #15
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    ouais, j'essaie juste d'attirer ton attention sur le fait que ce pont n'est plus supporté par oracle et a plein de soucis, donc ne devrait pas être utilisé. D'ailleurs il n'existe meme plus avec java 8 donc toute nouvelle application se basant dessus est condamnée à terme.

  16. #16
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    pour revenir à l'erreur, quelques recherches semblent indiquer qu'il y a parfois des bugs dans la partie ODBC qui peuvent amener ce genre de problème. Peux-tu essayer en utilisant les noms de colonne plutot que les indexs?

    Remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    					if(java.sql.Types.INTEGER ==rsmd.getColumnType(1))
    					{
    						WorkElement.Id = resultset.getInt(1);
    					}
    					else
    					{
    						System.out.println("On est pas sur de l'integer");
    					}
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    					if(java.sql.Types.INTEGER ==rsmd.getColumnType("siIdDocument"))
    					{
    						WorkElement.Id = resultset.getInt("siIdDocument");
    					}
    					else
    					{
    						System.out.println("On est pas sur de l'integer");
    					}

  17. #17
    Débutant
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 022
    Points : 332
    Points
    332
    Par défaut Je te met le code à jour mais il a toujours le même résultat
    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
    	static ArrayList<Structure.ElementWork> ReadWork() throws SQLException
    	{
    		   ArrayList<Structure.ElementWork> pListText;
    		   int iNbResultFound;
    		   pListText = new ArrayList<Structure.ElementWork>();
    		   String cmd = "SELECT siIdDocument, vcDocument FROM T_WORK_INFORMATION WHERE siIdStateDocument = 3";
    		   iNbResultFound = 0;
    		   iNbResultFound = InterbaseManager.ExecuteSelectRequest( cmd);
    		   ResultSet resultset = InterbaseManager.myReader;
    		   ResultSetMetaData rsmd = resultset.getMetaData();
    		   iNbResultFound = 0;
    		   try 
    		   {
    			   while( resultset.next())
    			   {
    				    iNbResultFound++;
    				    WorkElement = new Structure.ElementWork();
    					WorkElement.wsText = resultset.getString( "vcDocument");
    					if(java.sql.Types.INTEGER ==rsmd.getColumnType(1))
    					{
    						int id;
    						id = resultset.getInt( "siIdDocument");
    						WorkElement.Id = id;
    					}
    					pListText.add( WorkElement);
    				}
    		   }
    		   catch( Exception ex)
    		   {
    			   ex.printStackTrace();
    		   }
    		   return( pListText);
    	   }
    Je voudrai savoir comment je dois déclarer id pour que ça marche J'ai essaye int identify id; mais c'est refusé par le compilateur

  18. #18
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    mouais, ça pue un peu soit un embroglio quelque part au niveau du driver soit un truc que j'ai pas capté dans tes classes. Tu peux nous donner le code à jour de tes classes (code complet, y compris connection et tout le toutim) ainsi que l'output complet de la console. La déclaration de l'id n'a rien à voir dans l'histoire, l'appel de getInt n'a rien à voir avec la manière dont tu stocke le retour de cet appel.

  19. #19
    Débutant
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 022
    Points : 332
    Points
    332
    Par défaut si ce n'est pas l'int, je voudrais savoir si on peut déclarerla base avec un int et...
    mettre la copie de l'int identity. éventuelement je peux le faire dans le programme écrit en C++ qui charge la base
    Je vous met le code à jour
    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
    	static ArrayList<Structure.ElementWork> ReadWork() throws SQLException
    	{
    		   ArrayList<Structure.ElementWork> pListText;
    		   int iNbResultFound;
    		   pListText = new ArrayList<Structure.ElementWork>();
    		   String cmd = "SELECT iIdDoc, vcDocument FROM T_WORK_INFORMATION WHERE siIdStateDocument = 3";
    		   iNbResultFound = 0;
    		   iNbResultFound = InterbaseManager.ExecuteSelectRequest( cmd);
    		   ResultSet resultset = InterbaseManager.myReader;
    		   ResultSetMetaData rsmd = resultset.getMetaData();
    		   iNbResultFound = 0;
    		   try 
    		   {
    			   while( resultset.next())
    			   {
    				    iNbResultFound++;
    				    WorkElement = new Structure.ElementWork();
    					WorkElement.wsText = resultset.getString( "vcDocument");
    					if(java.sql.Types.INTEGER == rsmd.getColumnType(1))
    					{
    						WorkElement.Id = resultset.getInt( "iIdDoc");
    					}
    					pListText.add( WorkElement);
    				}
    		   }
    		   catch( Exception ex)
    		   {
    			   ex.printStackTrace();
    		   }
    		   return( pListText);
    	   }
    J'ai modifié la base et j'ai la même erreur
    Je vous met aussi le code de interbasemanger
    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
    static Connection ConnectServer( String wsLogin, String wsPassword, String wsDatabaseFullPathName) throws SQLException
    		{
    			long ErrorCode = 0;
    			if( ErrorCode == 0)
    			{
    				// Provider=SQLNCLI11;User Instance=true;MARS Connection=true;AttachDbFilename=C:\\Programmes\\Microsoft SQLServer\\MSSQL10_50.SQLEXPRESS\\MSSQL\\DATA\\Coherence.mdf;Driver={SQL Server Native Client 11.0};Initial Catalog=Northwind
    				try
    				{
    					// Chargement du pilote JDBC
    					Class.forName("sun.jdbc.odbc.JdbcOdbcDriver" ).newInstance();
    					//"Integrated Security=true;Pooling=true;Max Pool Size=100;Timeout=15;MultipleActiveResultSets=true;Type System Version=SQL Server 2014;database=COHERENCE;server=xantia\\SQLEXPRESS"
    					Properties props = new Properties();
    					props.setProperty( "Initial Catalog", "Northwind");
    					props.setProperty( "Auto Reconnect", "true");
    					props.setProperty( "AttachDbFilename", "C:\\Programmes\\Microsoft SQL Server\\MSSQL12.SQLEXPRESS\\MSSQL\\DATA\\Coherence.mdf");
    					props.setProperty( "Type System Version", "SQL Server 2014");
    					props.setProperty( "Pooling", "true");
    					props.setProperty( "MaxPoolSize", "100");
     					props.setProperty( "MultipleActiveResultSets", "true");
     					props.setProperty( "Timeout", "15");
    					//props.setProperty( "Driver", "Microsoft SQL Server Express Edition (64-bit)");
    					//props.setProperty( "Driver Version", "12.0.2000 RTM");
    					props.setProperty( "databaseName", "Coherence");
    					props.setProperty( "integratedSecurity", "true");
    					props.setProperty( "instance","Xantia\\SQLEXPRESS");
    					props.setProperty( "user","XANTIA\\JeanNoël");
    					// URL de connexion
    					String url = "jdbc:odbc:login_DSN";
    					connection = DriverManager.getConnection( url, props);
    			        stmt = connection.createStatement();
    			        Data.m_bServerConnected = true;
    				}
    				catch( Exception ex)
    				{
    					ex.printStackTrace();
    					Data.m_bServerConnected = false;
    				}
    				finally
    				{
    				}
    			}
    			return( connection);
    		//OD
    		}
     
     
     
    		static int ExecuteSelectRequest( String wsRequest) throws SQLException
    		{
    			int iNbResultFound = 0;
    			String Result;
    			String stream;
    			boolean Status;
    			// IF myConnection" is not NULL) THEN
    			if( stmt == null)
    			{
    				connection = ConnectServer( "", "", "");
    				stmt = connection.createStatement();
    			}
    			// 
    			try
    			{
    				stmt.execute( wsRequest);
    				myReader = stmt.getResultSet();
    			}
    			catch( Exception ex)
    			{
    				ex.printStackTrace();
    				Status = false;
    			}
    			return( iNbResultFound);
    		}
    	}

  20. #20
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Tu pourrais commencer par faire ce que je t'ai demandé plus haut, a savoir
    revoir ton code pour supprimer ces catch Exception qui vont empecher de voir à temps les erreurs éventuelles de la DB?
    revoir le code de ton select pour sa valeur de retour aie un sens?

    un fois ça fait, j'aimerais bien la classe complete histoire de voir aussi comment les champs sont déclarés et initialiseé, pas des bouts de code. Et avoir la sortie complète de la console, pas juste la dernière exception. Merci.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 3
    Dernier message: 13/03/2009, 16h20
  2. Réponses: 21
    Dernier message: 18/11/2008, 15h36
  3. Récupérer les valeurs d'une requête SQL dans un champs html SELECT
    Par tamiii dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 10/11/2007, 14h27
  4. Réponses: 4
    Dernier message: 13/11/2006, 18h49
  5. Comment eviter les doubons dans une requête?
    Par jyms2006 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 08/03/2006, 15h08

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