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 :

nombre max de '?' dans preparedStatement


Sujet :

JDBC Java

  1. #1
    Membre éclairé Avatar de touftouf57
    Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Moselle (Lorraine)

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

    Informations forums :
    Inscription : Décembre 2007
    Messages : 362
    Par défaut nombre max de '?' dans preparedStatement
    Salut tout le monde!

    Quelqu'un saurait-il me dire s'il y a un maximum autorisé de '?' dans un preparedStatement?
    Car actuellement je suis limité à 7, ce qui fait que lors d'un INSERT avec 11 '?' je dois découper mon preparedStatement en 2: (le premier en INSERT et le second en UPDATE).
    Ce maximum serait-il paramétrable? selon quelle méthode?

    J'ai fouillé sur le forum et je n'ai rien trouvé à ce sujet, à moins que je ne fasse pas la bonne recherche.

    Merci pour l'info.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    que je sache, jdbc n'a pas de limitation. C'est probablement ton driver qui limite le nombre de paramètre. Quelle erreur as-tu?

  3. #3
    Membre éclairé Avatar de touftouf57
    Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Moselle (Lorraine)

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

    Informations forums :
    Inscription : Décembre 2007
    Messages : 362
    Par défaut
    Bonsoir, désolé de répondre si tard, mais on m'avait mis la pression sur d'autres choses.

    Voici l'erreur obtenue:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    java.lang.ArrayIndexOutOfBoundsException: 10
    	at oracle.jdbc.driver.OracleSql.computeBasicInfo(OracleSql.java:950)
    	at oracle.jdbc.driver.OracleSql.getSqlKind(OracleSql.java:623)
    	at oracle.jdbc.driver.OraclePreparedStatement.<init>(OraclePreparedStatement.java:1212)
    	at oracle.jdbc.driver.T4CPreparedStatement.<init>(T4CPreparedStatement.java:28)
    	at oracle.jdbc.driver.T4CDriverExtension.allocatePreparedStatement(T4CDriverExtension.java:68)
    	at oracle.jdbc.driver.PhysicalConnection.prepareStatement(PhysicalConnection.java:3140)
    	at oracle.jdbc.driver.PhysicalConnection.prepareStatement(PhysicalConnection.java:3042)
    	at oracle.jdbc.driver.PhysicalConnection.prepareStatement(PhysicalConnection.java:6022)
    	at baseDeDonnees.BaseDeDonneesImpl.ajoute(BaseDeDonneesImpl.java:560)
    	at baseDeDonnees.test.testInsertion(test.java:197)
    	at baseDeDonnees.test.main(test.java:59)
    et voici le code qui l'a généré
    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
    public void ajoute(Machine machine) throws LectureBDDException {
    		DateFormat format = new SimpleDateFormat("dd-MM-yyyy");
    		PreparedStatement pst=null;
    		try {
    			pst = this
    				.getConnection()
    					.prepareStatement(
    							"Insert Into MACHINE (idMarque,modele,numSerie,numAfpa,nomMachine,adresseIP,dateAchat,finGarantie,idSalle,idParc) Values(?,?,?,?,?,?,?,?,?,?)",
    							new String[] { "idMachine" });
     
    			pst.setInt(1, machine.getMarque().getIdMarque());
    			pst.setString(2, machine.getModele());
    			pst.setString(3, machine.getNumSerie());
    			pst.setString(4, machine.getNumAfpa());
    			pst.setString(5, machine.getNomMachine());
    			pst.setString(6, machine.getAdresseIp());
    			pst.setNString(7, format.format(machine.getDateAchat().getTime()));
    			pst.setNString(8, format.format(machine.getDateFinGarantie().getTime()));
    			pst.setInt(9, machine.getSalle().getIdSalle());
    			pst.setInt(10, machine.getIdParc());
    			pst.executeUpdate();
    			machine.setIdMachine(getAutoIncrementId(pst));
    			log.log(Level.INFO, "machine ajoutée:" + machine.toString());
    			pst.close();
    Y verrais-tu une erreur potentielle?? je viens de parcourir le code pendant une heure et je ne vois pas ce qui cloche! Je me suis renseigné auprès d'autres stagiaires et aucun n'a eut cette erreur.

    Merci d'avance

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    d'après certains sites, ce serait un bug dans le driver oracle. Les solutions sont soit passer à une autre version du driver (plus récente ou plus ancienne), soit utiliser des paramètre nommés plutot que positionnel (mais ça veux dire changer le code). Si ca marche chez d'autres personnes, essaie de récupérer leur version du driver.

  5. #5
    Membre éclairé Avatar de touftouf57
    Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Moselle (Lorraine)

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

    Informations forums :
    Inscription : Décembre 2007
    Messages : 362
    Par défaut
    Merci, de l'info
    mais tous les stagiaires utilisent les mêmes drivers (odbc6). Ce n'est donc pas de ce coté que vient le problème.
    Je verrais cela avec d'autres demain matin. Merci de ces conseils "nocturne"
    bonne nuit

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    ojdbc6, ca dit juste "driver oracle pour la spécification java 6", le 6 n'a rien à voir avec la version du driver. As-tu récupéré ce jar depuis le même pc que tes collègues ou as-tu récupéré le jar sur le site de oracle? Dans le second cas, rien ne garanti que le driver est à la même version. Ton code me semble correct, par contre, je confirme, il y a une issue ouverte chez oracle intitulée "PREPARESTATEMENT GET ARRAYINDEXOUTOFBOUNDSEXCEPTION WHEN IN PARAM. AMOUNT IS > 7", malheureusement, cette issue n'est lisible que si on est utilisateur enregistré sur le metalink oracle, pour lequel il faut un numéro de support Je ne peux donc pas te dire si elle est résolue.

  7. #7
    Membre éclairé Avatar de cashmoney
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 298
    Par défaut
    Je me pose des questions la requête de ton preparestatement
    new String[] { "idMachine" } <----- à ce que je saches on utlise ce paramètre quand il y a un autoincrément géré par ta base. Du moment où, ton Id est géré par java, tu n'as pas besoin de le mettre avec ton prepareStatement.
    j'espères que cela pourra t'aider.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par cashmoney Voir le message
    à ce que je saches on utlise ce paramètre quand il y a un autoincrément géré par ta base. Du moment où, ton Id est géré par java, tu n'as pas besoin de le mettre avec ton prepareStatement.
    Etonnament, c'est exactement ce qui est fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    			pst.executeUpdate();
    			machine.setIdMachine(getAutoIncrementId(pst));
    Donc, oui ce paramètre lui est bien utile et non, il n'a rien à voir avec le problème ^^

  9. #9
    Membre éclairé Avatar de cashmoney
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 298
    Par défaut
    Oui, c'est vrai je n'avais pas vu qu'il l'avait indiquer un peu plus loin dans son code. Juste pour savoir si un test de connection à ta base a été fait pour savoir s'il y a bien connection à la base de donnée avec ton driver? et Aussi comment référencies-tu ton driver dans le CLASSPATH de ton projet??

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    bon, j'ai eu accès au report d'oracle, ce bug est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	Fixed in Product Version 	11.2
    L'erreur se déclenche effectivement quand tu a plus de 7 paramètres de la forme ? *et* que tu demande le retour de valeurs par auto incrément.

    Les workaround sont "utiliser des paramètres nommés" (ou utiliser une version fixée du driver)

  11. #11
    Membre éclairé Avatar de touftouf57
    Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Moselle (Lorraine)

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

    Informations forums :
    Inscription : Décembre 2007
    Messages : 362
    Par défaut
    Bon j'ai vu avec les autres stagiaires.

    Vu que le cahier des charges et très vague, nous sommes tous assez libres. Donc on a pas du tout les mêmes schémas relationnels. Certains ont fait plus de tables mais avec moins de champs, et les autres n'ont pas encore réussis à ce connecter à la base.

    En fait je suis le seul, pour l'instant:
    • à avoir créer une connexion avec la base
    • qui utilise des preparedStatements
    • qui passe plus de 7 paramètres.


    J'ai forcé un autre stagiaire, ayant une connexion, à faire un essai avec plus de paramètres, et effectivement cela ne passe pas.

    La solution retenue est donc de splitter la requête. Je fais un INSERT avec récupération de l'ID dans un premier temps. Puis je fais un UPDATE sur les champs manquants filtré sur l'idMachine.

    Bon c'est pas une solution tip-top, mais au lieu de perdre des jours et des jours, je préfère utiliser cela, vu que ça marche.

    Si quelqu'un a la solution pour faire sauter cette limitation, je suis preneur. (je pense pas être le seul, d'ailleurs)

    En tout cas d'avoir fait des recherches à ce sujet.

    Au plaisir

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    j'ai déjà donné les solutions.

    Soit prendre le driver ojdbc6 dans sa version 11.2
    Soit utiliser des paramètre nommé plutot que des paramètre indexé (l'erreur ne se produisant qu'avec des paramètres indexés)

  13. #13
    Membre éclairé Avatar de cashmoney
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 298
    Par défaut
    Moi, j'utilise oracle 11g et j'utilise un drivers télécharger sur le site de oracle. Il marche très bien et je fais plus de 7 insert avec mon PreparedStatement

    http://www.oracle.com/technology/sof...dbc_10201.html

    Je te donne le liens j'espères que cela pourra t'aider mais faut au préalable s'inscrire.

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

Discussions similaires

  1. Nombre max de formules dans une feuille
    Par BenjGe dans le forum Excel
    Réponses: 11
    Dernier message: 24/05/2010, 00h08
  2. Nombre max de lignes dans un fichier
    Par quentennis dans le forum C
    Réponses: 3
    Dernier message: 13/05/2008, 15h00
  3. Réponses: 7
    Dernier message: 20/07/2006, 10h29
  4. Réponses: 3
    Dernier message: 24/10/2005, 16h59

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