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

    errore durante l'esecuzione sql in java

    Buongiorno ho un problema a far funzionare l'sql che sotto riporterrò con java
    l'errore che mi viene mostrato è questo
    1-) java.sql.SQLException: Parameter index out of range (3 > number of parameters, which is 2).

    La stringa è
    String sql = "UPDATE timbrature SET uscita = ? " +
    "WHERE uscita IS null AND utente = ? " +
    "AND ingresso LIKE '?%'";
    .....


    stmt.setObject(1, nuovaData);
    stmt.setInt(2, idUtente);
    stmt.setObject(3, (data.get(Calendar.YEAR)-data.get(Calendar.MONTH)-data.get(Calendar.DAY_OF_MONTH)));


    2-) l'altra mia soluzione è:
    errore : om.mysql.jdbc.exceptions.MySQLSyntaxErrorException : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '-10-11%' at line 1

    mentre sintassi:
    String sql = "UPDATE timbrature SET uscita = ? " +
    "WHERE uscita IS null AND utente = ? " +
    "AND ingresso LIKE ?-?-?%";

    .....

    stmt.setObject(1, nuovaData);
    stmt.setInt(2, idUtente);
    stmt.setObject(3, data.get(Calendar.YEAR));
    stmt.setObject(4, data.get(Calendar.MONTH));
    stmt.setObject(5, data.get(Calendar.DAY_OF_MONTH));


    Non riesco sostanzialmente a gestire il like da java. Se scrivo il comandi direttamente in mysql non ci sono problemi e funziona tutto, da programma mi esccono questi errori. Qualche idea? Ciao Stefania

  2. #2
    Utente di HTML.it L'avatar di Pastore12
    Registrato dal
    Oct 2008
    Messaggi
    1,051
    Non posso fare test, ma (mi sembra assurdo..) potrebbe essere che il ?% faccia casino.

    Prova a scrivere solo

    "AND ingresso LIKE '?'";


    Non è quello che vuoi, ma la query genera errori di qualche tipo?

    Se questa prova ha successo, tenta con:

    "AND ingresso LIKE '?"+"%'";

    Sono il primo a non essere convinto, ma altri possibili errori non ne vedo, e mi pare di capire che senza il like le cose funzionano. Ciao!
    "Ethics are to me something private. Whenever you use it as an argument for why somebody_else should do something, you’re no longer being ethical, you’re just being a sanctimonious dick-head"
    Linus Torvalds

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2008
    Messaggi
    64
    Grazie, purtroppo non funziona, mi da sempre our of range.
    Ciao e grazie

  4. #4
    Utente di HTML.it L'avatar di Pastore12
    Registrato dal
    Oct 2008
    Messaggi
    1,051
    e dova vai?

    Posta anche il resto del codice

    String sql = ...

    PreparedStatement ps = ...

    ps.setInt (...);

    Ma l'out of range salta fuori anche senza il simbolo %?

    Sei sicura mandare in esecuzione la query "giusta"?

    Aspetta..

    "AND ingresso LIKE ?"; Senza gli apostrofi...

    e perchè usi setObject? Il LIKE non funziona sulle stringhe? Non puoi usare un setString(data+"%");

    Se non sapevi dove sbattere la testa un po' di muri te li ho trovati..
    "Ethics are to me something private. Whenever you use it as an argument for why somebody_else should do something, you’re no longer being ethical, you’re just being a sanctimonious dick-head"
    Linus Torvalds

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2008
    Messaggi
    64
    Da quel che leggo qui
    l'altra mia soluzione è:
    errore : om.mysql.jdbc.exceptions.MySQLSyntaxErrorException : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '-10-11%' at line 1
    non mi legge l'anno, ma non ne sono sicura.

    Codice incriminato
    String sql = "UPDATE timbrature SET uscita = ? " +
    "WHERE uscita IS null AND utente = ? " +
    "AND ingresso LIKE ?-?-?%";

    PreparedStatement stmt = conn.prepareStatement(sql);
    Date nuovaData = new Date();
    nuovaData.setTime(data.getTimeInMillis());

    anno = data.get(Calendar.YEAR);
    mese = data.get(Calendar.MONTH);
    giorno = data.get(Calendar.DAY_OF_MONTH);

    stmt.setObject(1, nuovaData);
    stmt.setInt(2, idUtente);
    stmt.setObject(3, anno);
    stmt.setObject(4, mese);
    stmt.setObject(5, giorno);

    System.out.println("anno: " + anno + "mese: " + mese + "giorno: " + giorno + "sql: " + sql);
    stmt.executeUpdate();
    conn.close();
    timeStampUscita = dataInString.dataToString(data);
    Ciao

  6. #6
    Utente di HTML.it L'avatar di Pastore12
    Registrato dal
    Oct 2008
    Messaggi
    1,051
    Secondo me va in casino perchè quando scrivi

    LIKE '?%'

    Interpreta il ? non come una posizione in cui fare il setObject, ma come un carattere di una stringa.

    Invece quando scrivi LIKE ?-?-?%

    trova tutti i ? che gli servono per fare i set, ma non trova più la stringa nel formato 'stringa', tra apici.

    Secondo me se riuscissi a scrivere la queri in questo modo:

    LIKE ?

    con

    il ? settato con un setString ("blablabla%", 3);

    dovrebbe funzionare.

    Il Like funziona per le stringhe, non credo per le date, quindi il tuo ultimo tentativo dovrebbe fallire anche per questo.
    "Ethics are to me something private. Whenever you use it as an argument for why somebody_else should do something, you’re no longer being ethical, you’re just being a sanctimonious dick-head"
    Linus Torvalds

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2008
    Messaggi
    64
    Ho provato così ma nenache
    String sql = "UPDATE timbrature SET uscita = ? " +
    "WHERE uscita IS null AND utente = ? " +
    "AND ingresso LIKE "+"'?"+"?"+"?"+"%'";

    PreparedStatement stmt = conn.prepareStatement(sql);
    Date nuovaData = new Date();
    nuovaData.setTime(data.getTimeInMillis());

    anno = data.get(Calendar.YEAR);
    mese = data.get(Calendar.MONTH);
    giorno = data.get(Calendar.DAY_OF_MONTH);

    stmt.setObject(1, nuovaData);
    stmt.setInt(2, idUtente);
    stmt.setInt(3, anno);
    stmt.setInt(4, mese);
    stmt.setInt(5, giorno);

    System.out.println("anno: " + anno + "mese: " + mese + "giorno: " + giorno + "sql: " + sql);
    stmt.executeUpdate();
    conn.close();

    java.sql.SQLException: Parameter index out of range (3 > number of parameters, which is 2).
    at com.mysql.jdbc.SQLError.createSQLException(SQLErro r.java:910)
    at com.mysql.jdbc.PreparedStatement.setInternal(Prepa redStatement.java:2796)
    at com.mysql.jdbc.PreparedStatement.setInternal(Prepa redStatement.java:2827)
    at com.mysql.jdbc.PreparedStatement.setInt(PreparedSt atement.java:2778)
    at timbraturaJDBC.TimbratureDAO.DBScriviUscita(Timbra tureDAO.java:176)
    at test.provatimbratura.main(provatimbratura.java:24)
    BUILD SUCCESSFUL (total time: 1 second)

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Perchè non provi anche a seguire l'altro consiglio, che è la seconda volta che ti viene proposto?

    LIKE funziona solo sulle stringhe, quindi perchè incaponirsi a passare un oggetto Date?

    Prova così:

    codice:
    String sql = "... LIKE ?";
    ...
    stmt.setString(3, formatData(data) + "%");
    ...
    
    private String formatData(Date d) {
       java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy-MM-dd");
       return sdf.format( d );
    }
    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.