Newsgroup: it.comp.java
Titolo: [LUNGO] PreparedStatement Non mi restituisce nulla.

Salve a tutti,
ho un problema che mi tiene sveglio alle 3 di domenica mattina e che non 
riesco proprio a risolvere.
Da tempo eseguo query con Oracle, ma solo ora mi occorre usare il 
preparedStatement, per gestire meglio le date.
Ho creato una classe che mi gestisce una connessione ad un db, tramite 
servizio JNDI.
La classe ha il seguente metodo, che mi restituisce un oggetto 
contenente righe e colonne:
   public DataContainer execQuery(String query, Object[] parameters)
       throws  SQLException {
     ResultSet resultSet = null;
     PreparedStatement preparedStatement = null;
     DataContainer dtCont =null;
     String queryPulita = Utility.eliminaSpazi(query);
     try  {
       preparedStatement = setPreparedStatementParams(
           con.prepareStatement(query), parameters);
       resultSet = preparedStatement.executeQuery();
       dtCont = getDataContainer(resultSet);
       preparedStatement.close();
     } catch (SQLException e) {
       e.printStackTrace();
       try {
         if(resultSet != null)
           resultSet.close(); // CHIUDO RESULTSET
         if(preparedStatement != null)
           preparedStatement.close(); // CHIUDO STATEMENT
       } catch (SQLException ee) {
         ee.printStackTrace();
       }
     }
     return dtCont;
   }
Nel metodo si fa uso di un altro metodo, che ricevuti il 
preparedStatement e un array di oggetti, scorre i parametri e li assegna 
al DB, verificando il tipo di istanza dell'oggetto i-esimo.
Ecco il metodo, tagliato, per esigenze di sintesi, nel caso lo posto tutto.
   private PreparedStatement setPreparedStatementParams(
       PreparedStatement preparedStatement, Object[] parameters)
   throws SQLException {
     for (int i = 0; i < parameters.length; i++) {
       Object paramIn = parameters[i];
       if (paramIn == null) {
         sysLog.debug(PARAMETER_NULL);
         continue;
       } else {
         sysLog.debug(paramIn.getClass().getName());
         sysLog.debug(paramIn);
       }
       if (paramIn instanceof Integer) {
         sysLog.debug("Integer");
         Integer integer = (Integer) paramIn;
         preparedStatement.setInt(i+1, integer.intValue());
       } else if (paramIn instanceof String){
         sysLog.debug("String");
         String string = (String) paramIn;
         preparedStatement.setString(i+1, string);
       } else if (paramIn instanceof java.util.Date) {
         java.util.Date date = (java.util.Date) paramIn;
         java.sql.Timestamp stamp = new
	    java.sql.Timestamp(date.getTime());
         preparedStatement.setTimestamp(i+1, stamp);
       }
         //[CUT]
     }// fine for
     return preparedStatement;
   }
Purtroppo non riesco a farlo funzionare, nonostante non mi dia alcun 
errore, non riesco a ricevere alcun risultato, l'oggetto restituito (Un 
semplice arraylist di hashmap) e' vuoto.
Non so piu' come fare, inoltre su questo ng non ho trovato post 
precedenti che parlano di come usare un prepared statement per oggetti 
eterogenei, quindi proprio non so come fare!!
Vi sarei grato per qualsiasi risposta,
Buonanotte.
-- 
            Davide Gurgone
      web: 
http://www.gurgone.it/
mail: davidechiocciolinagurgonepuntoit

       preparedStatement.close();
non ti rimane niente in quel dtCont? il codice non darà errori, ma se 
dopo averlo chiamato fai qualcosa con quel dtCont cosa succede?
fede


Innanzitutto ti ringrazio per la risposta.
Dunque... dtCont e' un oggetto di tipo DataContainer che non e' altro 
che un'ArrayList che contiene solo HashMap. Questo mi serve come elenco 
di righe, se serve poi ti posto un po' di codice.
   dtCont = getDataContainer(resultSet);
il metodo sopra non fa altro che popolare il un DataContainer, riga per 
riga, usando i tipi di dati restituiti dal database.
Ma questo non mi da errori, inquanto lo testo da parecchio nelle query 
costruite a runtime tramite concatenazione di stringhe.
... Il lavoro che fa questa classe, in effetti, e' parecchio, ma mi 
serve per spostare le righe in modo pulito tra i vari strati 
dell'applicazione!
Avete dunque qualche altra idea???
Ciao,
