Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    Java: dubbio su Statement

    Ho un dubbio molto banale.
    Ho questo codice che aggiorna la classifica di un campionato (esempio serie A) quando
    una partita è stata rinviata e viene giocata dopo mesi.
    Il mio cruccio è il seguente.

    nella prima riga creo e inizializzo la variabile stat1_1 e successivamente vado a fare un for che mi cicla su una linkedList per l'estrazione di Item che mi serviranno per fare select (e di conseguenza anche update) per tutte le varibili in lista.

    é giusto che tenga fuori dal for le istruzioni
    Statement stat1_1 = c.createStatement();
    Statement stat1_3 = c.createStatement();
    oppure devo includerle nel for quindi ricreare e rinstanziare ad ogni ciclo le statement?

    Grazie per l'interesse


    codice:
    Statement stat1_1 = c.createStatement();
    Statement stat1_3 = c.createStatement();
    
    //update con i valori sopra riportati a partire dalla giornata 
    //primo valore in lista
    
    for(int i=0; i<lst.size(); i++){
    	Item it=(Item) lst.get(i);
    	SelectDatiPrecedenti+=" SELECT punti, giocate, vinte,pareggiate, perse, GolFatti, GolSubiti,diffReti FROM Classifica";
    	SelectDatiPrecedenti+=" WHERE idsquadra="+IDSquadraCasa+" and giornata ="+it.getGiornata();
    		    
    	ResultSet  rs = stat1_1.executeQuery(SelectDatiPrecedenti);
    		    	
    	while(rs.next())
    	{
    		ptisquadracasaP=rs.getInt("punti");
    		giocateAP=rs.getInt("giocate");
    		vinteAP=rs.getInt("vinte");
    		pareggioAP=rs.getInt("pareggiate");
    		perseAP=rs.getInt("perse");
    		golFattiAP=rs.getInt("GolFatti");
    		golSubitiAP=rs.getInt("GolSubiti");
    		diffRetiAP=rs.getInt("diffReti");
    	}
    				  	
    	rs.close();
    
    
    	UpdateDatiAggiornati+=" UPDATE Classifica SET giocate="+(giocateAP+1)+",punti="+(ptisquadracasaP+ptisquadracasa)+",";
    	UpdateDatiAggiornati+=" vinte="+(vinteAP+vinteA)+",pareggiate="+(pareggioAP+pareggioA)+", perse="+(perseAP+perseA)+",";
    	UpdateDatiAggiornati+=" golfatti="+(golFattiAP+risA)+",	golSubiti="+(golSubitiAP+risB)+",diffreti="+(diffRetiAP+(risA-risB));
    	UpdateDatiAggiornati+=" where idsquadra="+IDSquadraCasa+" and giornata="+gg;
    	stat1_3.executeUpdate(UpdateDatiAggiornati);
    }
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326
    Direi più che altro che, se le query da eseguire sono sempre le stesse (e cambiano solo alcuni parametri, comenel tuo caso, quelle della WHERE), allora conviene utilizzare i PreparedStatement, settare i parametri di volta in volta ed eseguire quelle. In fin dei conti, le PreparedStatement sono state inventate apposta per poter essere riutilizzate più volte.

    Inoltre, se gli update sono molti, conviene forse usare addBatch().


    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
    Non conoscevo i prepared statement, dopo aver googlato un pò ho imparato a conoscerli e sono molto utili nel mio caso sopratutti nel primo caso (SELECT) dove il dato da cambiare è solo nella where.
    nel secondo caso (UPDATE) aggiorno la classifica con i risultati della partita di recupero sommando i dati precedenti (resultset precedente ) come è possibile vedere dallo snippet postato prima, in quel caso preparare la prepared statement viene un casino.

    inoltre non capisco una cosa verrebbe così?
    codice:
    	 
    UpdateDatiAggiornati+=" UPDATE Classifica SET giocate=?+1,";
    UpdateDatiAggiornati+=" punti=?"+(+ptisquadracasa)+", vinte=?"+(+vinteA)+",";
    UpdateDatiAggiornati+=" pareggiate=?"+(+pareggioA)+", perse=?"+(+perseA)+",";
    UpdateDatiAggiornati+=" golfatti=?"+(+risA)+",golSubiti=?"+(+risB)+",";
    UpdateDatiAggiornati+=" diffreti=?"+(+(risA-risB));
    UpdateDatiAggiornati+=" where idsquadra="+IDSquadraCasa+" and giornata=?";
    oppure così
    codice:
    	 
    UpdateDatiAggiornati+=" UPDATE Classifica SET giocate=?+1,";
    UpdateDatiAggiornati+=" punti="+("?"+ptisquadracasa)+", vinte="+("?"+vinteA)+",";
    UpdateDatiAggiornati+=" pareggiate="+("?"+pareggioA)+", perse="+("?"+perseA)+",";
    UpdateDatiAggiornati+=" golfatti=+("?"+risA)+",golSubiti="+("?"+risB)+",";
    UpdateDatiAggiornati+=" diffreti="+("?"+(risA-risB));
    UpdateDatiAggiornati+=" where idsquadra="+IDSquadraCasa+" and giornata=?";
    Grazie dell'aiuto.

    Per quanto riguarda gli update potrebbero essere una decina massimo quindicina.
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  4. #4
    Perchè ti devi incasinare la vita ?
    Usa un prepared statement anche per l'update
    codice:
    PreparedStatement updateStatement = con.prepareStatement("UPDATE Classifica SET giocate= ?, punti=?,pareggiate=?,golfatti=?,diffreti=?, where idsquadra= ? and giornata=?");
    Poi ti basta ciclare sul primo result set e settare i vari parametri esempio:
    codice:
    while(rs.next())
    	{
    		ptisquadracasaP=rs.getInt("punti");
    		giocateAP=rs.getInt("giocate");
    		vinteAP=rs.getInt("vinte");
    		pareggioAP=rs.getInt("pareggiate");
    		perseAP=rs.getInt("perse");
    		golFattiAP=rs.getInt("GolFatti");
    		golSubitiAP=rs.getInt("GolSubiti");
    		diffRetiAP=rs.getInt("diffReti");
                    updateStatement.setInt(1,ptisquadracasaP+1);
                    updateStatement.setInt(....);
                    etcc...
                    updateStatement.executeUpdate();
    	}

  5. #5
    ho capito....proverò...
    Grazie
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  6. #6
    nel mio programma parte questa eccezione:

    codice:
    java.sql.SQLException: Driver does not support this function
    	at sun.jdbc.odbc.JdbcOdbcPreparedStatement.executeQuery(Unknown Source)
    	at LinkDB.UpdateClassifyMatchToRecuperate(LinkDB.java:1247)
    il driver è questo e normalmente mi ha sempre funzionato

    codice:
    String driver = "sun.jdbc.odbc.JdbcOdbcDriver";
    		    String url = "jdbc:odbc:Campionato2";
    e la parte di codice dove mi parte l'eccezione è la seguente:
    codice:
    PreparedStatement ps_1 = null;
    PreparedStatement ps_2 = null;
    SelectDatiPrecedenti+=" SELECT punti, giocate, vinte,pareggiate, perse, GolFatti, GolSubiti,diffReti FROM Classifica";
    SelectDatiPrecedenti+=" WHERE idsquadra="+IDSquadraCasa+" and giornata =?";
    	    	 
    ps_1 = c.prepareStatement(SelectDatiPrecedenti);
    ps_2 = c.prepareStatement(UpdateDatiAggiornati);
     //update con i valori sopra riportati a partire dalla giornata 
     //primo valore in lista
     for(int i=0; i<lst.size(); i++){
            Item it=(Item) lst.get(i);
    	ps_1.setInt(1, it.getGiornata());
    	
    
    //   	su questa istruzione parte l'eccezione  ECCEZIONE 
    	 ResultSet  rs = ps_1.executeQuery(SelectDatiPrecedenti);
    			    	
    	 while(rs.next())
    	 {
    	      ptisquadracasaP=rs.getInt("punti");
    	      giocateAP=rs.getInt("giocate");
                  vinteAP=rs.getInt("vinte");
    	      pareggioAP=rs.getInt("pareggiate");
    	      perseAP=rs.getInt("perse");
    	      golFattiAP=rs.getInt("GolFatti");
    	      golSubitiAP=rs.getInt("GolSubiti");
    	      diffRetiAP=rs.getInt("diffReti");
    	 }
    	 rs.close();

    Cosa posso fare?
    Grazie dell'aiuto
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326
    Non capisco perchè questa cosa qua.

    codice:
    SelectDatiPrecedenti+=" WHERE idsquadra="+IDSquadraCasa+" and giornata =?";
    Se stai usando delle PreparedStatement, usane i parametri

    codice:
    SelectDatiPrecedenti+=" WHERE idsquadra=? and giornata =?";
    e poi passerai il valore di IDSquadraCasa come primo parametro.

    PS: stai usando il bridge JDBC-ODBC... a quale DB ti stai collegando?


    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

  8. #8
    allora googlando di qua e di là inserendo il nome dell'eccezione ho capito dove sbagliavo (infatti ora funziona perfettamente ):

    codice:
    1 PreparedStatement ps_1 = null;
    2 PreparedStatement ps_2 = null;
    3 SelectDatiPrecedenti+=" SELECT punti, giocate, vinte,pareggiate, perse, ";  
    4 SelectDatiPrecedenti+=" GolFatti, GolSubiti,diffReti FROM Classifica";
    5 SelectDatiPrecedenti+=" WHERE idsquadra="+IDSquadraCasa+" and giornata =?";
    	    	 
    6 ps_1 = c.prepareStatement(SelectDatiPrecedenti);
    7 ps_2 = c.prepareStatement(UpdateDatiAggiornati);
     //update con i valori sopra riportati a partire dalla giornata 
     //primo valore in lista
     8 for(int i=0; i<lst.size(); i++){
     9       Item it=(Item) lst.get(i);
    10	ps_1.setInt(1, it.getGiornata());
    	
    
    //   	su questa istruzione parte l'eccezione  ECCEZIONE 
    11	 ResultSet  rs = ps_1.executeQuery(SelectDatiPrecedenti);
    Ho messo i numeri per far capire meglio.
    Visto che avevo già caricato l'interrogazione SQL nell'istruzione 6 era inutile ricaricarla nell'istruzione 11

    quindi bastava togliere il nome della variabile della query nell'struzione 11 nel seguente modo:
    codice:
    11	 ResultSet  rs = ps_1.executeQuery();
    Poi sono andato incontro ad altri errori per mie stupide disattenzioni sul codice che alla fine ho corretto

    Grazie lo stesso a tutti.
    CIAU.
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  9. #9
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326
    ps_1.executeQuery(SelectDatiPrecedenti);
    Questa non l'avevo proprio vista.


    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.