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 :

java.sql.SQLException: Le flux de données est déjà fermé


Sujet :

JDBC Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 19
    Points : 13
    Points
    13
    Par défaut java.sql.SQLException: Le flux de données est déjà fermé
    Bonjour,

    J'utilise une Base de donnée Oracle 9i avec les derniers pilotes odbc (téléchargés jeudi derniers sur le site oracle).
    Je crée un programme Java qui permet de generer des scripts de création de tables. Pour cela j'utilise la table systeme oracle dba_tab_columns.
    La création de colonnes de certaines tables requierent une valeur par défaut stockée dans la dba_tab_columns. Mon probleme se trouve ici.
    Lorsque j'essaye de recuperer la valeur par defaut par un recordset (rs.getObject("data_default")) j'obtiens l'erreur suivante :
    java.sql.SQLException: Le flux de données est déjà fermé

    La valeur en question est stockée en LONG dans Oracle.
    J'ai donc entrepris des recherches sur notre ami le moteur de recherche super connu et j'y ai lu que cela etait possiblement du à un bug dans les pilotes odbc. J'ai donc téléchargé la derniere version et oh surprise... le bug subsiste

    Donc la question reste simple comment un recordset recupere un LONG oracle ?

    Merci pour votre aide

  2. #2
    Membre actif
    Avatar de foucha
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 121
    Points : 251
    Points
    251
    Par défaut getLong?
    et rs.getLong(2)?

    il me semble l'avoir dejà utilisé.
    ++
    Foucha.

    =========

    "du code propre c'est du code qui fait exactement ce qu'on croit que ça fait"

    Mes Articles DVP

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 19
    Points : 13
    Points
    13
    Par défaut
    Citation Envoyé par foucha Voir le message
    et rs.getLong(2)?

    il me semble l'avoir dejà utilisé.
    rs.getLong renvoie un long c'est a dir un entier long.
    En Oracle le long est l'ancienne forme du BLOB c'est a dire une chaine de caractere de grande capacité (jusqu'à 2Go)

    donc le getLong n'est pas la solution d'où l'utilisation du getObject comme ca il n'y a pas de quiproquo sur le type reçu.

  4. #4
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    Tu pourrais nous montrer un peu de code ?
    "If email had been around before the telephone was invented, people would have said, 'Hey, forget email! With this new telephone invention I can actually talk to people!"

    Besoin d'une nouvelle méthode pour développer ? -> http://www.la-rache.com/

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 19
    Points : 13
    Points
    13
    Par défaut
    La requete utilisée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT OWNER, TABLE_NAME, COLUMN_NAME, DATA_TYPE, DATA_LENGTH, NULLABLE, DATA_DEFAULT FROM dba_tab_columns WHERE owner LIKE 'DEV_%' AND table_name LIKE 'TR%' ORDER BY owner, table_name, column_id
    Pour le code Java
    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
    74
    75
    76
    77
    78
    79
    public void makeCreate() {
    		String tableName = "";
    		String fileName = "";
    		String domaine = "";
    		FileWriter sqlFile = null;
    		try {
    			if (connection != null) {
    				Statement statement = connection.createStatement();
    				ResultSet res = statement.executeQuery(properties.getProperty("GETTABLES"));
    				
    				
    				while (res.next()) {
    					// nom du domaine
    					domaine = res.getString("OWNER").replace("DEV_", "");
    					// creation du nom de la table
    					tableName = res.getString("OWNER") + "." + res.getString("TABLE_NAME");
    					// création du nom de fichier
    					fileName = String.format("BCCRE%1sU_%2s", domaine, res.getString("TABLE_NAME"));
    					// création de l'arborescence
    					new File(String.format("ECHO_%1s", domaine)).mkdir();
    					new File(String.format("ECHO_%1s\\bin", domaine)).mkdir();
    					new File(String.format("ECHO_%1s\\oracle", domaine)).mkdir();
    					new File(String.format("ECHO_%1s\\oracle\\sql", domaine)).mkdir();
    
    					// si on est toujours sur le meme nom de table
    					if (!tables.contains(tableName)) {
    						// ajout dans la liste des tables
    						tables.add(tableName);
    						/* Creation des ksh */
    						new File(String.format("ECHO_%1s\\bin\\%2s.ksh",domaine, fileName)).delete();
    						// création sdu ksh
    						FileWriter kshFile = new FileWriter(String.format("ECHO_%1s\\bin\\%2s.ksh", domaine, fileName),true);
    						// création du début du fichier
    						kshFile.write(String.format(Constants.CARTOUCHE_KSH,domaine, fileName,"création",fileName));
    						//fermeture du fichier
    						kshFile.close();
    
    						/* création des sql */
    						// si non null on ferme le fichier
    						if (sqlFile != null) {
    							sqlFile.write(")\ntablespace &1\n/");
    							sqlFile.close();
    						}
    						// efface le fichier si il existe
    						new File(String.format("ECHO_%1s\\oracle\\sql\\%2s.sql", domaine,fileName)).delete();
    
    						// créer le fichier
    						sqlFile = new FileWriter(String.format("ECHO_%1s\\oracle\\sql\\%2s.sql", domaine,fileName), true);
    
    						// création du début du fichier
    						sqlFile.write(String.format(Constants.CARTOUCHE_SQL,domaine, fileName,"Création",fileName));
    						sqlFile.write(String.format("DROP TABLE %1s\n/\n\n",tableName));
    						sqlFile.write(String.format("CREATE TABLE %1s(",tableName));
    						sqlFile.write(String.format("\n\t%1s %2s(%3d)", res.getString("COLUMN_NAME"), res.getString("DATA_TYPE"), res.getInt("DATA_LENGTH")));
    						if (res.getString("NULLABLE").equals("Y"))
    							sqlFile.write(" not null");
    						
    						if (res.getObject("DATA_DEFAULT") != null)
    							sqlFile.write(String.format(" DEFAULT '%1s'",String.valueOf(res.getObject(("DATA_DEFAULT")))));
    						 
    
    					} else {
    						if(res.getString("DATA_TYPE").equals("DATE")){
    							sqlFile.write(String.format(",\n\t%1s %2s", res.getString("COLUMN_NAME"), res.getString("DATA_TYPE")));
    						}else{
    							sqlFile.write(String.format(",\n\t%1s %2s(%3d)", res.getString("COLUMN_NAME"), res.getString("DATA_TYPE"), res.getInt("DATA_LENGTH")));
    						}
    						if (res.getString("NULLABLE").equals("Y"))
    							sqlFile.write(" not null");
    				}// while ResultSet
    				if (sqlFile != null) sqlFile.close();
    			}// if connection
    		} catch (IOException ioe) {
    			ioe.printStackTrace();
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    
    	}

  6. #6
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    si ça ne plante pas sur le if, peut être devrais tu essayer quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Object o = res.getObject("DATA_DEFAULT"); 
    if (o != null)
    	sqlFile.write(String.format(" DEFAULT '%1s'",String.valueOf(o)));
    ?
    "If email had been around before the telephone was invented, people would have said, 'Hey, forget email! With this new telephone invention I can actually talk to people!"

    Besoin d'une nouvelle méthode pour développer ? -> http://www.la-rache.com/

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 19
    Points : 13
    Points
    13
    Par défaut
    ça marche! merci!

    c'est assez etrange de devoir passer par une variable supplémentaire.
    Si vous aviez une explication ou une doc du pourquoi ca m'interesse.

  8. #8
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    En fait, je n'ai pas vraiment d'explication. Toutefois dans la javadoc, il est dit :

    Citation Envoyé par javadoc
    For maximum portability, result set columns within each row should be read in left-to-right order, and each column should be read only once
    Ce n'est malgré tout qu'une recommandation et non une obligation. On peut lire plusieurs fois la même colonne d'un même row. Peut être est-ce simplement dû au fait que ton type de donnée est un blob et que ce type de donnée est peut être interprété comme un flux ...

    à ce sujet 2 petites remarques :
    • pourquoi ne pas utiliser un getBlob() ? (cf la FAQ)
    • utiliser une seule variable permet dans ce cas de ne faire qu'une lecture. Si ton blob fait 2 Go, ça devrait être plus performant de ne le lire qu'une fois je pense
    "If email had been around before the telephone was invented, people would have said, 'Hey, forget email! With this new telephone invention I can actually talk to people!"

    Besoin d'une nouvelle méthode pour développer ? -> http://www.la-rache.com/

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 13/06/2011, 00h05
  2. Le flux de données est déjà fermé
    Par nawara3003 dans le forum Interfaces de programmation
    Réponses: 1
    Dernier message: 14/05/2010, 11h33
  3. java.sql.SQLException: Le flux de données est déjà fermé
    Par cyberny dans le forum Interfaces de programmation
    Réponses: 2
    Dernier message: 03/03/2009, 14h19
  4. Réponses: 2
    Dernier message: 08/06/2008, 20h01
  5. Probleme JBPortal 2.6 : Le flux de données est déjà fermé
    Par tinico dans le forum Wildfly/JBoss
    Réponses: 2
    Dernier message: 05/09/2007, 09h30

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