Newsgroup: it.comp.java
Titolo: URGENTE: ResultSet e problemi con stampa di dati a valore NULL

Ciao a tutti,
devo consegnare il mio progetto per l'esame di Sistemi Informativi giovedì e 
sto cercando di sistemare tutte le ultime cose...
Ho creato un metodo (PrintFile) che mi permettere di stampare su file il 
contenuto di un ResultSet indipendentemente dalla grandezza della tabella e 
dal tipo di dati contenuti... il metodo da me scritto e perfettamente 
funzionante è il seguente (vedi fine mail)...
Però vorrei perfezionarlo e ho alcune difficoltà nel farlo...
1. il metodo ha dei problemi se nella tabella sono inseriti dei dati con 
valore NULL (io ho aggirato il problema facendo in modo che nel mio progetto 
non ci siano tabelle contenenti valori nulli, ma non è proprio il massimo 
come soluzione!!!!)
2. vorrei fare in modo che se come parametri al metodo passo solo il 
ResultSet e NON il nome del file, la tabella viene automaticamente stampata 
sullo standard output (a video), mentre se invece do il nome del file tutto 
come adesso.
3. ho dei problemi di allineamento dei risultati che ottengo, nel senso che 
se i nomi dei dati superano gli otto caratteri (\t) si sfasa tutto 
l'allineamento delle colonne, qualche idea a proposito? E' possibile fare in 
modo che a \t corrispondano più di otto spazi, a me andrebbero bene 24!!!
Spero di essere riuscita a spiegare i miei problemi e sarei davvero grata a 
chiunque riuscisse a darmi dei suggerimenti o anche a passarmi direttamente 
il codice (non mi offendo!!!!!). Il mio prof. è un pignolino e vorrei 
riuscire a prendere un bel voto!!!
Grazie di cuore a tutti,
ELISA.
private static void PrintFile(ResultSet rs, String nomeFile) {
    try {
        PrintWriter pw = new PrintWriter(new FileWriter(nomeFile));
        ResultSetMetaData rsmd = rs.getMetaData();
        int columnCount = rsmd.getColumnCount();
        String intestazione = "";
        String campo = "";
        String riga;
        for(int i=1;i<=columnCount;i++) {
            intestazione = rsmd.getColumnName(i);
            pw.print(intestazione + "\t\t\t");
        }
        pw.println();
        pw.println("-------------------------------------------------------");
        while (rs.next()) {
            riga = "";
            for(int i=1;i<=columnCount;i++) {
                campo = rs.getObject(i).toString();
                riga += campo + "\t\t\t";
            }
            pw.println(riga);
            pw.flush();
        }
        rs.close();
        pw.close();
}
catch (IOException e) {
    e.printStackTrace();
}
catch (SQLException e) {
    e.printStackTrace();
}
} 

rs.getObject(i).toString();
Ti lancia una NullPointerException, vero? Se il professore vede questo
codice ti caccia a pedate, altro che bel voto :-) :-)
MAI chiamare un metodo su un qualcosa di cui non sei sicura che sia avvenuta
corretta inizializzazione. Mai. :)
-- 
---
Francesco Galli / Cinghiale Mannaro
Personal: 
http://cinghialemannaro.splinder.com
TMS project: 
http://tms.inera.it

 ha scritto nel 
messaggio news:42c91...@x-privat.org...


Prima dim chiamare la toString() sull'oggetto preso dal result set ti
devi accertare che sia diverso da null. Se è null in 'campo' metti il
valore che ti pare.
Invece di
campo = rs.getObject(i).toString();
Scrivi
Object obj = rs.getObject(i);
if (obj != null)
  campo = obj.toString();
else
  campo = ""; // oppure campo="-";
(l'ho scritto di getto... non l'ho compilato... quindi prendilo col
beneficio di inventario)

Ti hanno gia' risposto approfittando della mia pausa pranzo ;-) ma la
sintassi object != null  e' perfettamente accettabile, anzi, auspicabile.


Come ti ha gia' risposto Bingo, controlla se l'oggetto che estrai dal
resultset e' null prima di chiamarne il toString()   (if obj != null
....)
Per quanto riguarda la formattazione del testo mi sa che la dimensione
di tabulazione dipende dalla console che la visualizza, ovvero su linux
potrebbe essere x caratteri, su windows y invece, e forse la puoi
controllare dalle impostazioni della console, non certo da java.
Ma ti e' proprio necessario salvarlo in formato testo semplice
allineato cosi' ?
E se invece salvi il result set in formato xml e con un foglio di stile
te lo formatti in html ? (o lo salvi direttamente in html)
Oppure, altra soluzione lo salvi in formato .csv cosi' lo puoi vedere
da excel (o da qualsiasi foglio di calcolo che supporta i .csv)
Altrimenti se lo devi stampare in solo testo con la formattazione
visiva invece di usare i tab usa gli spazi (così ne metti quanti ne
vuoi)
Ovvero, invece di
riga += campo + "\t\t\t";
fai
int larghezza campo = campo.length();
riga += campo;
for(int i=0;i<larghezzacampo-MAX_SPAZI;i++){
 riga += " ";
}
cosi' ti mette tanti spazi quanti ne servono per riempire la larghezza
massima che tu decidi (ovviamente la larghezza massima deve essere
superiore alla lunghezza del campo + lungo)
Spero di esserti stato d'aiuto, se non ti e' chiaro qualcosa posta
pure....

 ha scritto nel messaggio 
news:1120481695....@g43g2000cwa.googlegroups.com...
Come ti ha gia' risposto Bingo, controlla se l'oggetto che estrai dal
resultset e' null prima di chiamarne il toString()   (if obj != null
....)
Per quanto riguarda la formattazione del testo mi sa che la dimensione
di tabulazione dipende dalla console che la visualizza, ovvero su linux
potrebbe essere x caratteri, su windows y invece, e forse la puoi
controllare dalle impostazioni della console, non certo da java.
Ma ti e' proprio necessario salvarlo in formato testo semplice
allineato cosi' ?
E se invece salvi il result set in formato xml e con un foglio di stile
te lo formatti in html ? (o lo salvi direttamente in html)
Oppure, altra soluzione lo salvi in formato .csv cosi' lo puoi vedere
da excel (o da qualsiasi foglio di calcolo che supporta i .csv)
Altrimenti se lo devi stampare in solo testo con la formattazione
visiva invece di usare i tab usa gli spazi (cosě ne metti quanti ne


Pensa che io una roba del genere l'avevo fatta per formattare l'output
degli scontrini sulle stampanti fiscali..... :-)

   campo = obj.toString();
C'e' anche un altro sistema per sapere se una colonna contiene null:
rs.wasNull()
chiamato dopo rs.getXXX ritorna true se il precedente getXXX ha 
'beccato' un null. In effetti con getObject serve il giusto, ma con 
getInt (che ritorna un int, non un Integer) e simili serve molto di più 
(perché, ovviamente, un int non può esser nullo per cui se trova nella 
colonna del db un null il risultato di getInt è 0)
bye
DKano