Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    177

    [Java]Problemi con stampa contenuto resultset/vector

    Considerando il seguente metodo che esegue una query di SELECT e restituisce i dati selezionati dentro un vector
    codice:
    @SuppressWarnings({ "rawtypes", "unchecked" })
    	public Vector queryRicerca(String query){
        	Vector v = null;
            String [] record;
            int colonne = 0;
            try {
               Statement stmt = con.createStatement();// Creo lo Statement per l'esecuzione della query
               rs = stmt.executeQuery(query);// Ottengo il ResultSet dell'esecuzione della query
               v = new Vector();
               ResultSetMetaData rsmd = rs.getMetaData();
               colonne = rsmd.getColumnCount();
               while(rs.next()) {// Creo il vettore risultato scorrendo tutto il ResultSet
                  record = new String[colonne];
                  for (int i=0; i<colonne; i++) 
                	  record[i] = rs.getString(i+1);
                  v.add( (String[]) record.clone() );
               }
               rs.close();// Chiudo il ResultSet
               stmt.close();// Chiudo lo Statement
               }catch(SQLException esql){ 
                System.out.println("Errore durante l'esecuzione della query");
            }  
            return v;
        }
    quando testo il metodo in un main per verificare il contenuto che ho selezionato mi stampa dei dati strani al posto di quelli da me richiesti
    codice:
    @SuppressWarnings("rawtypes")
    	public static void main(String[] args) {
    		
    		System.out.println("Mi connettto");
    		Connessione c=new Connessione();
    		String nome="TestConnessione";
    		System.out.println("Eseguo query con ritorno");
    		Vector v =c.queryRicerca("SELECT ID FROM files WHERE files.NomeFile='"+nome+"'");
    		System.out.println(v.toString());
    		Iterator it=v.iterator();
    		while(it.hasNext()){
    			Object i=it.next();
    			System.out.println(it.toString());
    			System.out.println(i.toString());
    		}
    		System.out.println("mi disconnetto");
    		c.chiudi();
    		System.out.println("Sono diconnesso");
    	}
    uso prima un toString() del vector e poi stampo elemento per elemento, ma il contenuto è sempre lo stesso
    codice:
    Mi connettto
    Eseguo query con ritorno
    [[Ljava.lang.String;@1389e4, [Ljava.lang.String;@c20e24, [Ljava.lang.String;@2e7263, [Ljava.lang.String;@157f0dc, [Ljava.lang.String;@863399]
    java.util.AbstractList$Itr@a59698
    [Ljava.lang.String;@1389e4
    java.util.AbstractList$Itr@a59698
    [Ljava.lang.String;@c20e24
    java.util.AbstractList$Itr@a59698
    [Ljava.lang.String;@2e7263
    java.util.AbstractList$Itr@a59698
    [Ljava.lang.String;@157f0dc
    java.util.AbstractList$Itr@a59698
    [Ljava.lang.String;@863399
    mi disconnetto
    Sono diconnesso
    invece dei 5 ID stampa questo, come mai? ho sbagliato ad inserire i dati nel vector o la stampa?

    Grazie
    Teo

  2. #2
    Ti stampa "[Ljava.lang.String;@1389e4" in quanto nel vettore stai inserendo array di stringhe non oggetti String. Se vuoi vedere esattamente il contenuto dell'array puoi modificare il tuo metodo in questo modo:
    codice:
    public static void main(String[] args) {
    		
    		System.out.println("Mi connettto");
    		Connessione c=new Connessione();
    		String nome="TestConnessione";
    		System.out.println("Eseguo query con ritorno");
    		Vector v =c.queryRicerca("SELECT ID FROM files WHERE files.NomeFile='"+nome+"'");
    		System.out.println(v.toString());
    		Iterator it=v.iterator();
    		while(it.hasNext()){
    			Object i=it.next();
    			System.out.println(it.toString());
    			//System.out.println(i.toString());
    System.out.println(java.util.Arrays.toString((String[])i));
    		}
    		System.out.println("mi disconnetto");
    		c.chiudi();
    		System.out.println("Sono diconnesso");
    	}
    Un cosiglio che ti vorrei dare è di usare i Generics, per tipizzare meglio quel Vector, per esempio i tu metod queryRicerca lo puoi modificare in questo modo:
    codice:
    public Vector queryRicerca(String query)
    	{
    		Vector<String[]> v = null;
    		String[] record;
    		int colonne = 0;
    		try
    		{
    			Statement stmt = con.createStatement();// Creo lo Statement per l'esecuzione della query
    			ResultSet rs = stmt.executeQuery(query);// Ottengo il ResultSet dell'esecuzione della query
    			v = new Vector<String[]>();
    			ResultSetMetaData rsmd = rs.getMetaData();
    			colonne = rsmd.getColumnCount();
    			while (rs.next())
    			{// Creo il vettore risultato scorrendo tutto il ResultSet
    				record = new String[colonne];
    				for (int i = 0; i < colonne; i++)
    					record[i] = rs.getString(i + 1);
    				v.add(record.clone());
    			}
    			rs.close();// Chiudo il ResultSet
    			stmt.close();// Chiudo lo Statement
    		}
    		catch (SQLException esql)
    		{
    			System.out.println("Errore durante l'esecuzione della query");
    		}
    		return v;
    	}

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    177
    Grazie per i consigli. Ti volevo chiede un altra cosa, dato che dal vector devo estrarre valori diversi (int, boolean, string) come mi consigli di procedere, mi sembra eccessivo creare 3 classi tipicizzate in modo diverso
    Teo

  4. #4
    La miglior cosa è non lavorare con gli array di oggetti, ma crearti singoli POJO in modo da gestire al meglio la lettura dal db.

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    177
    Originariamente inviato da francesco.muia
    La miglior cosa è non lavorare con gli array di oggetti, ma crearti singoli POJO in modo da gestire al meglio la lettura dal db.
    Ho capito, conosco il concetto di POJO ma non l'ho mai usato, mi potresti dare qualche dritta? un esempio da cui partire magari sui miei metodi. Sarebbe il massimo ancora grazie
    Teo

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    177
    Se posso osare, voglio spiegarvi quello che devo fare, così mi potete consigliare.
    Devo inserire dei file pdf nel database, in una prima tabella salvo: ID(generato automaticamente come chiave) nome pdf e data caricamento. Poi in un altra tabella salvo: ID, ID pdf(che sarebbe l'id della tabella precedente), numero pagina e testo pagina. Il mio problema è crearmi un metodo che mi estragga senza problemi l'intero ID della prima tupla per passarlo alla seconda tabelle per generare le sue tuple pagina correlate.
    Il mio problema è nel metodo QueryRicerca che trovate sopra, però relativo ad un unico oggetto e non ad una intera lista. Per ogni tentativo che faccio trovo sempre un nuovo errore, come posso fare?
    Teo

  7. #7
    Se ho ben compreso il tuo problema, una soluzione potrebbe essere questa (non è la più elegante).
    Per prima cosa creiamo due POJO che rispecchiano le due tabelle.
    POJO per la tabella PDF
    codice:
    public class Pdf
    {
    	private int id;
    
    	private String nome;
    
    	private Date date;
    
    	private List<PdfContent> contents;
    
    	public Pdf(int id, String nome, Date date)
    	{
    		this.id = id;
    		this.nome = nome;
    		this.date = date;
    		this.contents = new ArrayList<PdfContent>();
    	}
    
    	/**
            GETTER AND SETTER OMESSI
           **/
    	@Override
    	public int hashCode()
    	{
    		final int prime = 31;
    		int result = 1;
    		result = prime * result + ((date == null) ? 0 : date.hashCode());
    		result = prime * result + id;
    		result = prime * result + ((nome == null) ? 0 : nome.hashCode());
    		return result;
    	}
    
    	@Override
    	public boolean equals(Object obj)
    	{
    		if (this == obj)
    			return true;
    		if (obj == null)
    			return false;
    		if (getClass() != obj.getClass())
    			return false;
    		Pdf other = (Pdf) obj;
    		if (date == null)
    		{
    			if (other.date != null)
    				return false;
    		}
    		else if (!date.equals(other.date))
    			return false;
    		if (id != other.id)
    			return false;
    		if (nome == null)
    		{
    			if (other.nome != null)
    				return false;
    		}
    		else if (!nome.equals(other.nome))
    			return false;
    		return true;
    	}
    
    	@Override
    	public String toString()
    	{
    		return "Pdf [id=" + id + ", nome=" + nome + ", date=" + date + ", contents=" + contents + "]";
    	}
    
    }
    Pojo per la tabella del contenuto del Pdf
    codice:
    public class PdfContent
    {
    	private int id;
    
    	private int idPdf;
    
    	private int numeroPagina;
    
    	private String testo;
    
    	public PdfContent(int id, int idPdf, int numeroPagina, String testo)
    	{
    		this.id = id;
    		this.idPdf = idPdf;
    		this.numeroPagina = numeroPagina;
    		this.testo = testo;
    	}
           /**
            GETTER AND SETTER OMESSI
           **/
    
    	@Override
    	public int hashCode()
    	{
    		final int prime = 31;
    		int result = 1;
    		result = prime * result + id;
    		result = prime * result + idPdf;
    		result = prime * result + numeroPagina;
    		result = prime * result + ((testo == null) ? 0 : testo.hashCode());
    		return result;
    	}
    
    	@Override
    	public boolean equals(Object obj)
    	{
    		if (this == obj)
    			return true;
    		if (obj == null)
    			return false;
    		if (getClass() != obj.getClass())
    			return false;
    		PdfContent other = (PdfContent) obj;
    		if (id != other.id)
    			return false;
    		if (idPdf != other.idPdf)
    			return false;
    		if (numeroPagina != other.numeroPagina)
    			return false;
    		if (testo == null)
    		{
    			if (other.testo != null)
    				return false;
    		}
    		else if (!testo.equals(other.testo))
    			return false;
    		return true;
    	}
    
    	@Override
    	public String toString()
    	{
    		return "PdfContent [id=" + id + ", idPdf=" + idPdf + ", numeroPagina=" + numeroPagina + ", testo=" + testo + "]";
    	}
    }
    Come puoi notare all'interno dell'oggetto PDF ho dichiarato una lista di PdfContent che sarà popolata con le righe della tabella PDF_CONTENT.
    Il metodo per l'esecuzione della query diventa questo:
    codice:
    public Vector<Pdf> queryRicerca(String query)
    	{
    		Statement statement;
    		try
    		{
    			statement = con.createStatement();
    			ResultSet result = statement.executeQuery(query);
    			Vector<Pdf> vector = new Vector<Pdf>();
    			int tmpIdPdf = -1;
    			Pdf pdf = null;
    			while (result.next())
    			{
    				int pdfId = result.getInt(1);// id del pdf
    				if (tmpIdPdf != pdfId)
    				{
    					if (pdf != null)
    					{
    						vector.add(pdf);
    					}
    					pdf = new Pdf(result.getInt(1), result.getString(2), result.getDate(3));
    					tmpIdPdf = pdfId;
    				}
    
    				PdfContent content = new PdfContent(result.getInt(4), result.getInt(5), result.getInt(6), result.getString(7));
    				pdf.getContents().add(content);
    
    			}
    			if (tmpIdPdf == pdf.getId())
    			{
    				vector.add(pdf);
    			}
    			return vector;
    		}
    		catch (SQLException e)
    		{
    			throw new RuntimeException("Errore durante l'esecuzione della query", e);
    		}
    	}
    Nota bene l'uso dei generics (Vector<Pdf>)
    e di conseguenza il metodo per il test
    codice:
    public static void main(String[] args) throws ClassNotFoundException, SQLException
    	{
    
    		System.out.println("Mi connettto");
    		Connessione c = new Connessione();
    		String nome = "TestConnessione";
    		System.out.println("Eseguo query con ritorno");
    		// CHIAMO LA PRIMA TABELLA PDF(ID,NOME,DATA)
    		// CHIAMO LA SECONDA TABELLA PDF_CONTENT(ID,ID_PDF,N_PAGINA,TESTO);
    		Vector<Pdf> vector = c
    				.queryRicerca("SELECT P.ID,P.NOME,P.DATA,C.ID,C.ID_PDF,C.N_PAGINA,C.TESTO FROM PDF P, PDF_CONTENT C where P.ID = C.ID_PDF AND P.NOME = '"
    						+ nome + "'");
    		for (Pdf pdf : vector)
    		{
    			System.out.println(pdf);
    		}
    		System.out.println("mi disconnetto");
    		c.chiudi();
    		System.out.println("Sono diconnesso");
    	}
    Ciao

  8. #8
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    177
    Ciao, le tue classi sono utili, ti voglio far vedere cosa avevo creato io fino ad ora.
    Per prima cosa una classe che estrae il testo, e altre informazioni, da un file .pdf:
    codice:
    import java.io.FileInputStream;
    import java.io.IOException;
    import com.itextpdf.text.pdf.PdfReader;
    import com.itextpdf.text.pdf.parser.PdfReaderContentParser;
    import com.itextpdf.text.pdf.parser.PdfTextExtractor;
    import com.itextpdf.text.pdf.parser.SimpleTextExtractionStrategy;
    import com.itextpdf.text.pdf.parser.TextExtractionStrategy;
    // classe per operare estrarre il testo dal file .pdf
    public class GestioneTesto{
    	private static PdfReader lettore;
    	private FileInputStream pdf;
    	private String fileName;
    	private PdfReaderContentParser parserLettore;
    	TextExtractionStrategy strategia;
    	public GestioneTesto(FileInputStream filePdf, String nome) throws IOException{
    		pdf=filePdf;
    		lettore=new PdfReader(pdf);
    		parserLettore = new PdfReaderContentParser(lettore);
    		fileName=nome;
    	}
    	//ritorna il testo della pagina data
    	public String getTestoPagina(int pagina) throws IOException{
    		strategia = parserLettore.processContent(pagina,new SimpleTextExtractionStrategy());
    		return PdfTextExtractor.getTextFromPage(lettore, pagina);
    	}
    	//ritorna il numero di pagine del pdf
    	public int getNumeroPg(){
    		return lettore.getNumberOfPages();
    	}
    	//ritorna il nome del pdf
    	public String getNome(){
    		return fileName;
    	}
    }
    Avendo un database access così composto: files(ID(int),NomeFile(String),Protetto(bit),Proce ssato(bit),DataUltimoProcesso(Data)) testo(ID(int),IDFile(int),Pagina(Int),Testo(String )).
    Ho creato una classe che mi permette di connettermi ad esso:
    codice:
    import java.sql.*;
    import java.util.*;
    public class Connessione {
        private static Connection con; 
        private static Statement st;
        private static String filename;
        private static String database;
        /** Creates a new instance of Connessione */
        public Connessione() {
            try{ 
                // aggancio il driver  
                Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
            }catch(ClassNotFoundException e){ 
                System.out.println("Driver non trovato"); 
            } 
            try{ 
                // mi connetto al DB tramite il ponte dei driver jdbc:odbc
                filename = "EstrattorePDF.mdb";
                database = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=" + filename;
                con = DriverManager.getConnection(database); 
            }catch(SQLException sql){ 
                System.out.println("Errore connessione");
            } 
            try {
            	// avviso che sto creando una query, uno statement
                st = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
            }catch(SQLException s){ 
                System.out.println("Errore creazione statement"); 
            }    
        }
    //    Esegue l'istruzione SQL specificata in query
    //    può essere INSERT, UPDATE o DELETE o un'istruzione SQL che non restituisce nulla
        public void queryAggiornamento(String query){
        	try {
      		   Statement stmt = con.createStatement();
      		   stmt.executeUpdate(query);
      		   stmt.close();
        	}catch(SQLException s){ 
        		System.out.println("Errore durante l'esecuzione della query"); 
            } 
        }
        @SuppressWarnings("rawtypes")
    	public Vector queryRicerca(String query){
    		Vector<String[]> v = null;
    		String[] record;
    		int colonne = 0;
    		try{
    			Statement stmt = con.createStatement();// Creo lo Statement per l'esecuzione della query
    			ResultSet rs = stmt.executeQuery(query);// Ottengo il ResultSet dell'esecuzione della query
    			v = new Vector<String[]>();
    			ResultSetMetaData rsmd = rs.getMetaData();
    			colonne = rsmd.getColumnCount();
    			while (rs.next()){// Creo il vettore risultato scorrendo tutto il ResultSet
    				record = new String[colonne];
    				for (int i = 0; i < colonne; i++)
    					record[i] = rs.getString(i + 1);
    				v.add(record.clone());
    			}
    			rs.close();// Chiudo il ResultSet
    			stmt.close();// Chiudo lo Statement
    		}catch (SQLException esql){
    			System.out.println("Errore durante l'esecuzione della query");
    		}
    		return v;
    	}
        public void chiudi (){
            try{
                st.close();
                con.close();
            }catch(SQLException esql){ 
                System.out.println("Errore chiusura connessione");
            }   
        }
    Una classe che, usando le 2 precedenti, fornisce i metodi per caricare i dati (o estrarli) dal database:
    codice:
    import java.io.IOException;
    import java.util.StringTokenizer;
    import java.util.Vector;
    public class CaricaDB {
    	private Connessione database;
    	public CaricaDB(){
    		database=new Connessione();
    	}
    	//carica il pdf contenuto in testo dentro il database files
    	public void caricaFiles(GestioneTesto testo) throws IOException{
    		String nome=testo.getNome();
    //		bisgona inserire una DataUltimoProcesso corretta (data attuale)
    		database.queryAggiornamento("INSERT INTO files (NomeFile,Protetto,Processato,DataUltimoProcesso) VALUES ('"+nome+"',0,1,1)");
    //		caricaTesto(testo,id(nome));
    		caricaTesto(testo,8);//uso 8 perchè il metodo id non è definito bene
    	}
    	//gestisce il caricamento delle pagine del pdf nel database testo
    	public void caricaTesto(GestioneTesto testo,int id) throws IOException{
    		for(int i=1;i<=testo.getNumeroPg();i++)
    			caricaPagina(testo,i,id);
    	}
    	//carica una singola pagina del pdf nel database testo
    	public void caricaPagina(GestioneTesto testo, int pagina,int id) throws IOException{
    		String parole=testo.getTestoPagina(pagina);
    		//se la pagina non è vuota la inserisco
    		if(paginaConCaratteri(parole))
    			database.queryAggiornamento("INSERT INTO testo (IDFile,Pagina,Testo) VALUES ("+id+","+pagina+",'"+parole+"')");
    	}
    	//restituisce false se la pagina è tutta vuota
    	public boolean paginaConCaratteri(String parole) {
    		StringTokenizer st=new StringTokenizer(parole);
    		//finche ci sono elementi
    		while(st.hasMoreTokens())
    			return st.nextToken()!=" ";
    		return false;
    	}
    	//elimina tutte le pagina di un dato pdf
    	public void eliminaLibro(int Id){
    		database.queryAggiornamento("DELETE FROM testo WHERE IDFile="+Id+";");
    	}
    	@SuppressWarnings("rawtypes")
    	public Vector id(String nome){//non funziona come dovrebbe
    		return database.queryRicerca("SELECT ID FROM files WHERE files.NomeFile='"+nome+"'");
    	}	
    	//restituisce true se il pdf è già stato caricato
    	public boolean presente(String nomePDF){//non funziona come dovrebbe
    		//database.queryRicerca("SELECT FROM files WHERE NomeFile="+nomePDF+" AND Processato="+1+";");
    		return true;
    	}	
    	//verifica se il pdf è obsoleto
    	public boolean obsoleto(int id){
    		//eseguo la query per ottenere la data di caricamento del pdf
    		//se è obsoleto return true false altrimenti
    		return false;
    	}
    }
    Il mio problema, come dicevo in precedenza, è il metodo public Vector queryRicerca(String query) della classe Connessione, devo riuscire ad estrarre un singolo dato(Stringa (nome file),int (id in files)bit (processato) o data) per sistemare i metodi che non funzionano in CaricaDB, sto provando varie vie ma per ora senza risultati (si suppone che nel database ci siano file .pdf non duplicati, cioè un unico file con quel nome).
    Cosa mi consigli di variare? Avevo pensato di usare qualcos'altro al posto del vector per interagire meglio con il resulset contenente i dati restituiti dalla query.
    Teo

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 © 2026 vBulletin Solutions, Inc. All rights reserved.