Vous n'êtes pas identifié(e).
Bonjour,
J'ai un soucis dans la récupération d'une colonne de bytea provenant d'une base postgresql.
En effet j'insere l'element grace au code suivant :
---------------------------------------------------------------------------------------
PreparedStatement ps = connexion.getConnection().prepareStatement(requete);
ps.setBytes(1,currentLine.getBytes());
---------------------------------------------------------------------------------------
ici mon currentLine.getBytes() correspond bien au string courant.
L'élément est correctement inséré dans la base de données.
Puis au moment de la recuperation en base de cet element :
---------------------------------------------------------------------------------------
byte[] docBytes = resultat.getBytes(1);
---------------------------------------------------------------------------------------
ou 1 correspond a la colonne souhaitée, le tableau de bytes est different par rapport au currentLine.getBytes() vu plus haut. Donc le string généré est différents.
Je ne voit pas pourquoi cette difference existe, d'autant que je me suis inspiré d'un tutoriel postgresql/java.
Par exemple pour la chaine de caractere "hehohahihuhy" :
en entrée mon tableau de bytes = [104, 101, 104, 111, 104, 97, 104, 105, 104, 117, 104, 121, 47, 110]
et en sortie = [56, 54, 53, 54, 56, 54, 102, 54, 56, 54, 49, 54, 56, 54, 57, 54, 56, 55, 53, 54, 56, 55, 57, 50, 102, 54, 101]
Est-ce que quelqu'un a deja rencontré ce type de problème?
Merci d'avance
Hors ligne
Pourriez-vous mettre un peu plus de code que juste ces 2 lignes (on ne sait jamais...)? Notamment les lignes avant l'insertion, et avant la récupération en base (la requête, etc...)
Et quelle version de la base de données, quelle version du driver JDBC?
Dernière modification par flo (18/05/2011 20:26:08)
Hors ligne
Votre problème ressemble beaucoup à celui-là :
http://archives.postgresql.org/pgsql-jd … g00071.php
Vérifiez bien la version du driver...
Hors ligne
Bonjour et merci de vous intéresser à mon problème.
@flo: je n'ai pas accès au lien que tu as donné.
Sinon la version de mon driver = postgresql-9.0-801.jdbc4.jar
et la version de la base = postgre 9.0
code avant la requete :
-----------------------------------------------------------------------------------------------
1- instanciation du driver = Class.forName("org.postgresql.Driver");
2- connection à la base = DriverManager.getConnection("proxool.consultation");
-----------------------------------------------------------------------------------------------
et au niveau de la recuperation :
-----------------------------------------------------------------------------------------
String requete = "SELECT NOM_DOCUMENT, DOC FROM " + TABLE_DOCS_ATTACHES + " WHERE " +
ID + " = " + id + " AND " +
DATE_FIN + " IS NULL;";
GestionBd connexion = ConnexionPoolJDBC.getPoolConnexionJDBC().getConnexion(new Boolean(false),login);
try {
ResultSet resultat = connexion.executeRequete(requete);
resultat.next();
byte[] docBytes = resultat.getBytes("DOC");
}
---------------------------------------------------------------------------------------------------------
voila mais je suis pas sur que cela vienne du code.
Merci en tout cas de te pencher sur ça.
Julien
Hors ligne
Il n'y a pas d'autre driver Postgresql dans le Classpath?
Hors ligne
non je n'en ai qu'un, j'ai essayé différentes versions du driver mais le problème persiste.
Hors ligne
voici le code qui transforme mon tableau de byte en "fichier" :
-----------------------------------------------------
File generate = new File(dir + "/", nom);
generate.createNewFile();
DataOutputStream out = new DataOutputStream(new FileOutputStream(generate));
out.write(docBytes);
out.close();
-----------------------------------------------------
Hors ligne
Pour aider au diagnostic, pouvez-vous passer le bytea_output à 'escape' dans le postgresql.conf ? (et recharcher la configuration bien sûr).
Si votre problème disparait, il est probable que vous n'avez pas la bonne version du driver (le format de sortie des champs bytea a changé avec la 9.0, il faut un driver capable de le gérer).
Marc.
Hors ligne
Sinon, le lien fonctionne, vous avez des restrictions pour l 'accès au web?
Ici : http://java.developpez.com/faq/jdbc/?pa … nfosDriver il y a un bout de code pour récupérer les informations du Driver. Pourriez-vous l'exécuter?
Merci.
Hors ligne
Pour aider au diagnostic, pouvez-vous passer le bytea_output à 'escape' dans le postgresql.conf ? (et recharcher la configuration bien sûr).
Si votre problème disparait, il est probable que vous n'avez pas la bonne version du driver (le format de sortie des champs bytea a changé avec la 9.0, il faut un driver capable de le gérer).
Bon ça fonctionne bien avec ce changement dans la conf. Est-ce que cette solution, d'après vous, est acceptable ou bien il faut que je cherche dans la version du driver?
Hors ligne
Je pense qu'il faut que vous trouviez où traîne la vieille version du driver
C'est une des nouveautés de la version 9.0, et du driver jdbc 9.0. Vous aurez de meilleures performances avec le mode hex qu'avec le mode escape.
Marc.
Hors ligne
Sinon, le lien fonctionne, vous avez des restrictions pour l 'accès au web?
Ici : http://java.developpez.com/faq/jdbc/?pa … nfosDriver il y a un bout de code pour récupérer les informations du Driver. Pourriez-vous l'exécuter?
Merci.
voilà le résultat :
----------------------------------------------------------------------------------------------------------
Driver class = class org.postgresql.Driver v8.0
Prop name = PGDBNAME
Prop description = Database name to connect to; may be specified directly in the JDBC URL.
Prop value = null
Prop name = user
Prop description = Username to connect to the database as.
Prop value = null
Prop name = PGHOST
Prop description = Hostname of the PostgreSQL server; may be specified directly in the JDBC URL.
Prop value = null
Prop name = PGPORT
Prop description = Port number to connect to the PostgreSQL server on; may be specified directly in the JDBC URL.
Prop value = null
Prop name = password
Prop description = Password to use when authenticating.
Prop value = null
Prop name = protocolVersion
Prop description = Force use of a particular protocol version when connecting; if set, disables protocol version fallback.
Prop value = null
Prop name = ssl
Prop description = Control use of SSL; any nonnull value causes SSL to be required.
Prop value = null
Prop name = sslfactory
Prop description = Provide a SSLSocketFactory class when using SSL.
Prop value = null
Prop name = sslfactoryarg
Prop description = Argument forwarded to constructor of SSLSocketFactory class.
Prop value = null
Prop name = logLevel
Prop description = Control the driver's log verbosity: 0 is off, 1 is INFO, 2 is DEBUG.
Prop value = null
prop choice 0 = 0
prop choice 1 = 1
prop choice 2 = 2
Prop name = allowEncodingChanges
Prop description = Allow the user to change the client_encoding variable.
Prop value = null
Prop name = prepareThreshold
Prop description = Default statement prepare threshold (numeric).
Prop value = null
Prop name = charSet
Prop description = When connecting to a pre-7.3 server, the database encoding to assume is in use.
Prop value = null
Prop name = compatible
Prop description = Force compatibility of some features with an older version of the driver.
Prop value = null
prop choice 0 = 7.1
prop choice 1 = 7.2
prop choice 2 = 7.3
---------------------------------------------------------------------------------------------------------------
Hors ligne
Bon j'ai remis le driver 9.0, avec la configuration de base (bytea='hex') et ça marche!
Je comprend pas pourquoi cela ne marchais pas avant.
En fait j'avais plusieurs version du driver dans mon répertoire 'lib', j'ai tout enlevé physiquement sauf la dernière version et ca marche.
Je vous confirme ça quand même en testant cette après midi.
Hors ligne
Ca marche bien.
Merci à vous 2.
Le problème venait donc de la version du driver que j'utilisais et d'un conflit avec d'autres driver présent dans ma librairie, une fois enlevé du répertoire plus de conflit donc ca fonctionne normalement.
Hors ligne