Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2004
    Messaggi
    99

    [Java] Errore sul Resulset

    Ciao a tutti!


    eccomi alle prese con un resultset ottenuto da Query Sql.


    Avevo l'intenzione di convertire riga x riga di questo resultset in un XML.

    Ci sono praticamente riuscito, solo che avendo aggiunto un loop sulle colonne, il setProperty mi da errore sul valore da attribuire alla riga (ossia il contenuto del resultset in corrispondenza della riga e della colonna).

    il loop è così:

    codice:
    Properties prop = new Properties();
      for (int i = 1; i <= numerodellecolonne; i++) { 
     prop.setProperty(rsMetaData.getColumnName(i) ,rs.getString(i));
    }
    se al posto di rs.getString(i) metto "pippo" tutto fila liscio e mi crea un xml con tutti i nomi campi corretto tranne che i valori saranno sempre "pippo".

    Stranamente l'ordine delle colonne nel resultset (ossia della query) è diverso da come le riporta poi l'xml....temo sia lì l'errore ma non saprei come rimediare...


    potete aiutarmi?


    grazie!
    se mi chiedeste chi è per me un vero amico vi risponderei che è una persona che io considero alla pari di me.

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326
    Uhm... no, ci deve essere qualcos'altro da qualche altra parte.
    Tieni presente che una struttura di tipo Properties (che è una Hashtable) non mantiene l'ordinamento dei valori... i valori sono ordinati all'interno della tabella secondo le regole di Hashtable.

    Posta un po' più di codice, ovvero il ciclo nel quale quel codice deve essere racchiuso.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2004
    Messaggi
    99
    Non capisco....eppure solo qualche riga sopra sfrutto il metodo attraverso il nome della colonna e tutto torna!

    codice:
    	ResultSetMetaData rsMetaData = rs.getMetaData();
    	int numberOfColumns = rsMetaData.getColumnCount();
    				
    while (rs.next()) {  
    
      //variabile stringa usata da un'altra parte...qui il metodo funziona!
    String FromFileName = rs.getString("nomecolonnaresultsetacaso") ;
     
    nomefile = new File (FromFileName).getName();
    
    		Properties prop = new Properties();
    		
    		for (int i = 1; i <= numberOfColumns; i++) { 
    			
    			prop.setProperty(rsMetaData.getColumnName(i) , "pippo" ) ;
    	 
    		}
       
    		FileOutputStream fos;
    		try {
    			fos = new FileOutputStream( toFileName + nomefile.trim()  + ".metadata.properties.xml");
    		
    			prop.storeToXML(fos, null, "UTF-8");
    		fos.close();
    		} catch (Throwable e1) { 
    			e1.printStackTrace();
    		}
     }
    se mi chiedeste chi è per me un vero amico vi risponderei che è una persona che io considero alla pari di me.

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326
    Attenzione: generalmente i resultset sono di tipo TYPE_FORWORD_ONLY. Ciò ha implicazione anche con i campi (l'ho sperimentato con DBMS quali SQL Server): ciò significa che ciascun campo del ResultSet può essere letto una ed una sola volta.

    Io proverei a togliere quella lettura fuori dal ciclo for perchè quando poi andrai a leggere nuovamente il campo all'interno del ciclo il programma ti potrebbe (dovrebbe?) andare in errore.

    Se vuoi poter "riutilizzare" i valori dei campi, allora leggili una sola volta dal ResultSet, memorizzali in variabili e poi usa le variabili.

    Cerco di spiegarmi con un esempio banale:

    codice:
    ResultSet rs = ...;
    while( rs.next() ) {
       String campo = rs.getString( 1 );   // Ottengo il valore del primo campo
       ...
       if ( "".equals( rs.getString(1) ) {   // ERRORE: il campo "1" l'ho già letto prima!
          ...
       }
    }
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2004
    Messaggi
    99
    capisco...ma allora come è possibile che mi legga tutte le volte le intestazioni delle colonne per tutti i file senza problemi generando gli xml??

    s'arrabbia solo quando nel setproperty gli chiedo il valore della resultset corrispondente alla riga del primo ciclo ma alla colonna di riferimento del secondo....

    io lo odio
    se mi chiedeste chi è per me un vero amico vi risponderei che è una persona che io considero alla pari di me.

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326
    Originariamente inviato da Gatsu78
    capisco...ma allora come è possibile che mi legga tutte le volte le intestazioni delle colonne per tutti i file senza problemi generando gli xml??
    Le intestazioni sono nel ResultsetMetaData... è un altro paio di maniche.

    s'arrabbia solo quando nel setproperty gli chiedo il valore della resultset corrispondente alla riga del primo ciclo ma alla colonna di riferimento del secondo....

    io lo odio
    Non ho capito nulla... però sarebbe più facile se ci riportassi almeno l'eccezione (possibilmente con tutto il suo stackTrace).


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2004
    Messaggi
    99
    adesso ho identificato il perchè e mi scuso se son stato poco chiaro.

    durante la fase "rs.next" identifica riga per riga tutto il resultset e posso raccogliere in una string il risultato di un metodo rs.getstring(nome colonna oppure numero colonna).

    il problema è che come dici giustamente tu, il metadata guarda unicamente la prima riga (quelle delle colonne) e quando cerco di piazzare nello stesso ciclo la variabile di corrispondenza nella colonna mi da risultato nullo.



    Adesso quindi il problema è:

    come riempio le properties x l'xml nel giusto ordine dopo che il secondo ciclo ha finito riempiendo i dati di colonna?
    se mi chiedeste chi è per me un vero amico vi risponderei che è una persona che io considero alla pari di me.

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326
    Perdonami, ma non riesco a capire il dubbio.

    A me questo codice (che credo sia ciò che serve a te), funziona senza alcun problema (testato):

    codice:
    // Memorizzo tutti i record come lista di oggetti Properties
    ArrayList<Properties> lista = new ArrayList<Properties>();
    ResultSet rs = ...;   // Ottengo il ResultSet
    ResultSetMetaData rsmd = rs.getMetaData();
    numColonne = rsmd.getColumnCount();
    while( rs.next() ) {
       Properties p = new Properties();
       for(int i=1; i<=colonne; i++) {
          p.setProperty( rsmd.getColumnName(i), rs.getString(i));
       }
       lista.add( p );
    }
    Per quanto riguarda l'ordine con cui vengono memorizzati i campi all'interno dell'oggetto Properties, come già detto, non c'è alcuna garanzia di ordinamento... anzi, è più che plausibile che non vi sia alcun ordine sulle chiavi. Ma non vedo quale sia il problema, visto che alla fine questi dati devono finire all'interno di un file XML e allo standard XML non gli frega nulla dell'ordine dei tag...
    Se poi, per tue esigenze, necessiti di avere un particolare ordinamento dei campi, il mio consiglio è di scegliere una struttura dati diversa per la memorizzazione degli stessi, che non sia una Properties, ma magari un TreeSet di oggetti coppia, che sia Comparable secondo uno dei due valori (la chiave) o, meglio ancora forse, una TreeMap.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  9. #9
    Utente di HTML.it
    Registrato dal
    Jul 2004
    Messaggi
    99
    mmm io non salvo la lista dei properties in un'array...

    praticamente il property viene subito scritto in un xml.


    appena metto rs.getString(i) va in errore e dice java.sql.SQLException: No data found.

    Probabilmente per il fatto che non torna 2 volte nella stessa tabella.

    Il problema è che in un riferimento del resultset c'è un dato che deve essere usato contemporaneamente (nello stesso ciclo) della realizzazione del corredo x il file xml.

    mmm....
    se mi chiedeste chi è per me un vero amico vi risponderei che è una persona che io considero alla pari di me.

  10. #10
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326
    Originariamente inviato da Gatsu78
    mmm io non salvo la lista dei properties in un'array...
    Il mio era solo un esempio...

    praticamente il property viene subito scritto in un xml.
    Non fa differenza.

    appena metto rs.getString(i) va in errore e dice java.sql.SQLException: No data found.

    Probabilmente per il fatto che non torna 2 volte nella stessa tabella.
    Che vuol dire? Cerca di spiegarti meglio...

    Il problema è che in un riferimento del resultset c'è un dato che deve essere usato contemporaneamente (nello stesso ciclo) della realizzazione del corredo x il file xml.

    mmm....
    Ok: leggilo una sola volta, salvalo in una variabile e, ovunque ti serva, sfrutta la variabile.

    Cosa c'è che non ti torna del codice che ti ho postato? Se al posto della chiamata in cui salvo sull'ArrayList chiami il metodo che scrive nell'XML, non ottieni ciò che vuoi?

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.