Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1

    Utilizzo JDBC e ResultSet

    Ciao a tutti!

    Utilizando JDBC avrei la necessitą di eseguire una query, e prendere l'ultima riga del database che mi interessa, ho scritto questo codice che perņ non sembra funzionare, sapreste darmi suggerimenti?
    Ho letto che il metodo last() di ResultSet sposta il cursore sull'ultimo record.

    codice:
     public String getColonna(){        
            String ris="";
        try {
            
                // registrazione driver JDBC per Derby DB        
                DriverManager.registerDriver(new org.apache.derby.jdbc.ClientDriver());
                Connection conn = DriverManager.getConnection(url, user, pwd);
                Statement st = conn.createStatement();
                ResultSet rs = st.executeQuery("SELECT * FROM TABELLA_PRENOTAZIONI");
    
    
                     while (rs.next()) {
                      rs.last();       //sposta il cursore sull'ultimo record
                      ris += rs.getInt("NUMERO");
                    }
    
    
    
    
                rs.close();
                st.close();
                conn.close();
        
        } 
         catch (SQLException e) {
           System.out.println(e.getMessage());
        }
        
        return ris;
        }

  2. #2
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Definisci comunque "pare non funzionare": ti da eccezione?
    Come da documentazione last() puņ lanciare due eccezioni:

    SQLException
    - if a database access error occurs; this method is called on a closed result set or the result set type is TYPE_FORWARD_ONLY
    SQLFeatureNotSupportedException
    - if the JDBC driver does not support this method


    E' il tuo caso?

    Fatto in questo modo comunque č abbastanza brutto e inefficiente: stai facendo una SELECT ALL senza filtri per ottenere un unica colonna di un'unica riga. Non puoi scrivere un po' meglio quella query? SELECT NUMERO FROM TABELLA_PRENOTAZIONI č gią meglio, ma la mancanza di WHERE non mi piace.

    Inoltre ottieni l'ultimo elemento del ResultSet... ma non hai specificato un ordinamento, molto fragile come soluzione. Cosa č quel numero? Il codice dell'ultima prenotazione? Non puoi recuperarlo con MAX?
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Ci sono alcune considerazioni da fare:

    1) Di default, i ResultSet di JavaDB sono di tipo TYPE_FORWARD_ONLY, che significa che l'unica operazione supportata su questo tipo di ResultSet č la "next()". Affinché si possano effettuare altre operazioni, i ResultSet devono essere Scrollable. E poi vediamo come fare

    2) L'operazione che stai cercando di fare č comunque piuttosto inefficiente: spesso, infatti, per poter effettuare una "last()" il ResultSet si spazzola TUTTI i record al suo interno; č molto pił efficiente agire direttamente sull'istruzione SQL. Perchč non effettui semplicemenet una query con un ORDER BY in modo da avere al primo posto il record che ti interessa? Ti basterebbe, cosģ, solo una next() per raggiungere l'obiettivo, senza contare che in quel modo il DB č autorizzato a darti i record in ordine arbitrario (come meglio pare a lui), quindi non saprai mai a priori quale sarą "l'ultimo record della tabella".

    Detto questo, per ottenere un ResultSet scrollabile, č necessario agire sulla Statement che andrą a generarla:

    codice:
    Statement st = con.createStatement(
       ResultSet.TYPE_SCROLL_INSENSITIVE,   // In questo modo il ResultSet sarą scrollabile
       ResultSet.CONCUR_READ_ONLY
    );

    Ripeto: č molto meglio far eseguire la query in modo che il risultato voluto sia all'inizio (e lo si puņ fare, appunto, con un semplicissimo ORDER BY), che non scrollarsi tutto il ResultSet per andare a prendere l'ultimo risultato.


    Ciao.
    Ultima modifica di LeleFT; 31-01-2014 a 13:50
    "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

  4. #4
    Io avrei fatto cosģ, modificando un pņ il metodo:

    codice:
         public int getColonna(){        
            int ris=0;
        try {
            
                // registrazione driver JDBC per Derby DB        
                DriverManager.registerDriver(new org.apache.derby.jdbc.ClientDriver());
                Connection conn = DriverManager.getConnection(url, user, pwd);
                Statement st = conn.createStatement();
                ResultSet rs = st.executeQuery("SELECT MAX(NUMERO) FROM TABELLA_PRENOTAZIONI");
    
    
                     while (rs.next()) {
                      ris = rs.getInt("NUMERO");
                    }
    
    
    
    
                rs.close();
                st.close();
                conn.close();
        
        } 
         catch (SQLException e) {
           System.out.println(e.getMessage());
        }
        
        return ris;
        }
    In realtą se c' č eccezione non riesco a vederlo, perchč comunque il tutto funziona su sito web e vengo redirezionato su una pagina a prescindere dal risultato.
    In quel modo otterrei il valore massimo di quella colonna numero? La colonna numero rappresenta il numero dell' ordinazione, mi serve perchč in un altro metodo dove inserisco nuove prenotazioni devo incrementare tale valore.

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    ok e quando fanno il redirect scrivono qualcosa sulla pagina? Puoi parsarti la risposta e vedere se qualcosa č andato storto (io lo farei).
    Strano, io avrei fissato numero ordinazione come intero, chiave primaria e auto-increment in modo da non dover pensare alla sua gestione (visto che cmq serve ad identificare univocamente un record). In questo modo non devi preoccuparti tu di gestire il numero ordinazione (e la relativa transazione e l'accesso multiplo).
    RTFM Read That F*** Manual!!!

  6. #6
    Quote Originariamente inviata da valia Visualizza il messaggio
    ok e quando fanno il redirect scrivono qualcosa sulla pagina? Puoi parsarti la risposta e vedere se qualcosa č andato storto (io lo farei).
    Strano, io avrei fissato numero ordinazione come intero, chiave primaria e auto-increment in modo da non dover pensare alla sua gestione (visto che cmq serve ad identificare univocamente un record). In questo modo non devi preoccuparti tu di gestire il numero ordinazione (e la relativa transazione e l'accesso multiplo).
    Il problema č che usando auto-increment non riesco a far funzionare i PreparedStatement....

    In sostanza io permetto ad un utente di registrarsi compilando un form, invoco una servlet che preleva i dati ed esegue quel metodo con la query e apre una JSP che dice solo "Tutto ok". Non mi viene benissimo controllare il risultato...

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    spet, ma col PreparedStatement ti basta non includere anche il campo codice prenotazione, quello č gestito dal database.
    Qui per farti capire come fare:

    http://stackoverflow.com/questions/1...crement-the-id

    perché non ti viene bene controllare il risultato? Se c'č un errore, da qualche parte viene rilanciato o lo bruci?
    Con richieste HTTP (che mi pare quella che vuoi fare tu) di solito controllo la risposta, indicherą se č andata bene o no, dando un codice di errore e/o breve messaggio. Devi trovare quello

  8. #8
    Allora, ho provato come dici tu con i PreparedStatement a non inserire quel campo ma non viene memorizzato nulla, ti linko la discussione in cui ne parlo, č l'ulitmo post. Sapresti dirmi se per come ho impostato il database e per come eseguo il metodo c' č qualcosa di errato?

    http://forum.html.it/forum/showthrea...readid=2902622

  9. #9
    Scusate l'UP, lo faccio solo per notificare che ho risolto, bastava solo guardare meglio l'esempio suggerito da Valia.
    A questo punto ho un'altra domanda, nel codice che ho scritto io qualora ci fossero eccezioni non vedo nessun errore. In sostanza ho una pagina dove inserisco i parametri per la prenotazione, invio tramite POST a una servlet che esegue la query di inserimento e poi rimanda ad una pagina dove conferma l'avvenuto successo. Solo che questa cosa viene fatta sempre...anche in caso di fallimento...mi sapreste dire come segnalare l'errore visto che su pagine web non sono abituato?

    Questo č il codice della pagina web che prende i dati da FORM:

    codice:
    <%--     Document   : inserisciprenotazione
        Created on : 4-gen-2014, 18.12.14
        Author     : Amministratore
    --%>
    
    
    <%@page contentType="text/html" pageEncoding="UTF-8" session="true"%>
    
    
    
    
    
    
    <!DOCTYPE html>
    <html>
     <head>
             <link href="stile.css" rel="stylesheet" type="text/css">
             <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
                     
             
    
    
     </head>
    
    
    
    
        
    
    
    <% HttpSession s=request.getSession();%>
    
    
    
    
        <body>
            
     <script language="Javascript">
         
    function verifica(modulo)
        {
            if (modulo.username.value == "") {
                alert("Campo -Username- mancante.\nModulo non spedito.");
                modulo.username.focus();
                return false;
            }
                    
            if (modulo.nome.value == "") {
                alert("Campo -Nome- mancante.\nModulo non spedito.");
                modulo.nome.focus();
                return false;
            }
            if (modulo.cognome.value == "") {
                alert("Campo -Cognome- mancante.\nModulo non spedito.");
                modulo.cognome.focus();
                return false;
                    }
                    
                    if (modulo.data.value == "") {
                alert("Campo -Data- mancante.\nModulo non spedito.");
                modulo.data.focus();
                return false;
                    }
                    
                     if (modulo.ora.value == "") {
                alert("Campo -ora- mancante.\nModulo non spedito.");
                modulo.ora.focus();
                return false;
                    }
                    
                    if (modulo.lista.value == "") {
                alert("Campo -lista- mancante.\nModulo non spedito.");
                modulo.lista.focus();
                return false;
                    }
                
                    
                    
                return true;
            }
                    
                 /*  else {
                            document.modulo.action = "caricaprenotazione";
                            document.modulo.submit();
                       
                        }   */
            
            
            
    </script>
    
    
            
        
     <%   if(!(s.isNew())){ %>
                <table>        <!--FORM DEVE ESSERE FIGLIA DI TABLE? -->
                    
                    
                
                    <form name="modulo" action="<%=request.getContextPath()%>/caricaprenotazione" onSubmit="return verifica(this);" method="POST">
                <b>Username:</b>
                <br>
                <input type="text" name="username">
                <br>
                <b>Nome:</b>
                <br>
                <input type="text" name="nome">
                <br>
                <b>Cognome:</b>
                <br>
                <input type="text" name="cognome">
                <br>
                <b>Lista:</b>
                <br>
                <input type="text" name="lista">
                <br>
                <b>Data:</b>
                <br>
                <input type="text" name="data">
                <br>
                <b>Ora:</b>
                <br>
                <input type="text" name="ora">
                <br>
                <input type="submit" value=" Inserisci Prenotazione ">
                <input type="reset" value="Cancella">
                </form>
                </table>
                
                   <%} else {%>
            <h1>Errore! per potere inserire una prenotazione devi essere loggato!</h1> 
            <%}%>
                
                <div id="risultato"></div>
                
                
           
        </body>
    </html>

    Poi viene caricata questa pagina:

    codice:
    /*
     * To change this license header, choose License Headers in Project Properties.
     * To change this template file, choose Tools | Templates
     * and open the template in the editor.
     */
    
    
    package viste;
    
    
    
    
    import java.io.IOException;
    import javax.servlet.RequestDispatcher;
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.PrintWriter;
    import javax.servlet.http.HttpSession;
    
    
    /**
     *
     * @author Dario
     */
    public class caricaprenotazione extends HttpServlet {
        
        
        
        /** 
         * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
         * @param request servlet request
         * @param response servlet response
         */
        protected void processRequest(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            
            
             //HttpSession s=request.getSession();  //MEMORIZZO LA SESSIONE CORRENTE
             
    
    
            
            ServletContext ctx = getServletContext();
            response.setContentType("text/html;charset=UTF-8");
           // String id=(String)s.getAttribute("userName");
            
            String id=request.getParameter("username");
            String nome = request.getParameter("nome");
            String cognome=request.getParameter("cognome");
            String lista=request.getParameter("lista");
            String data=request.getParameter("data");
            String ora=request.getParameter("ora");
            String consegnata="NO"; 
            
            ConnectionDb b=new ConnectionDb();
    
    
            b.addPrenotazione(id, nome, cognome, lista, data, ora, consegnata);
            
              RequestDispatcher rdErr = ctx.getRequestDispatcher("/prenotazionecaricata.jsp");
                rdErr.forward(request, response);
         
            
        }
    Che redirige alla pagina:

    codice:
    <%-- 
        Document   : prenotazionecaricata
        Created on : 4-gen-2014, 18.34.34
        Author     : Amministratore
    --%>
    
    
    <%@page contentType="text/html" pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
            <title>PrenotazioneCaricata</title>
        </head>
        <body>
            <h1>La prenotazione e' stata inserita!</h1>
        </body>
    </html>

    Lo so č un casino....dopo aver completato questa cosa devo studiare il PHP per lavorare con AJAX ed eseguire operazioni senza ricaricare la pagina, anche se non ho capito ancora bene come funziona.

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Quote Originariamente inviata da Darčios89 Visualizza il messaggio
    A questo punto ho un'altra domanda, nel codice che ho scritto io qualora ci fossero eccezioni non vedo nessun errore. In sostanza ho una pagina dove inserisco i parametri per la prenotazione, invio tramite POST a una servlet che esegue la query di inserimento e poi rimanda ad una pagina dove conferma l'avvenuto successo. Solo che questa cosa viene fatta sempre...anche in caso di fallimento...mi sapreste dire come segnalare l'errore visto che su pagine web non sono abituato?
    sei tu a dover gestire l'errore in modo opportuno. Ad una POST segue una response, nella response devono essere inserite le informazioni circa lo stato della request. Una volta che hai queste sei tu a dover "gestire" le due situazioni.

    In particolare
    codice:
    ConnectionDb b=newConnectionDb();
            b.addPrenotazione(id, nome, cognome, lista, data, ora, consegnata);
    
    qui tu aggiungi la prenotazione, ma non ti chiedi come č andata la stessa, se ci sono stati errori ecc. Tu in ogni caso carichi la pagina successiva.
    Controlla qui l'esito dell'operazione inserimento prenotazione, se qualcosa č andato storto devi fare il corretto redirect.
    RTFM Read That F*** Manual!!!

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.