Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    726

    [JAVA] Sbaglio nell'uso degli apici?

    Quando cerco di aggiornare un campo di una tabella "Clienti" creata con Access 2000 ricevo il seguente errore:

    "Tipi di dati non corrispondenti nell'espressione criterio"

    Questo è il codice:

    codice:
     st.executeUpdate("UPDATE Clienti SET nome = ' " + nome + "' WHERE IDCliente = ' " + id + "'");
    Io credo sia colpa del modo in cui ho messo gli apici di 'id' (che è un valore intero passato dal costruttore) in quanto facendo alcune prove si è scoperto che l'istruzione WHERE (che pensavo fosse la responsabile) se gestita senza tutte quelle virgolette e senza una variabile, ma impostando un id arbitrario scelto da me funziona egregiamente ed aggiorna il record.

    La cosa strana però come si nota dal codice postato è che ho usato lo stesso criterio di inserimento di apici anche per quanto riguarda la variabile "nome", la quale però non da nessun problema.

    Il tipo di dato di IDCliente è contatore, ma anche settandolo come numerico o testo le cose non cambiano.

    Cosa mi dite??

    tnx!

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    42
    Ciao utilizza la classe PreparedStatement e non avrai problemi di nessun tipo.
    Carmine

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    726
    Ok, finisco di mettere a punto una cosa e poi provo, tnx!

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    726
    Allora, ho fatto cosi:

    codice:
    PreparedStatement st = conn.prepareStatement("UPDATE Clienti SET nome = ' " + nome + "' WHERE IDCliente = ' " + id + "'");
          
    st.executeUpdate();
    Purtroppo però spunta fuori sempre lo stesso errore

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Purtroppo Access è molto esigente: se IDCliente è numerico non vuole assolutamente gli apici (cosa che in SQL standard si fa).

    Prova così:
    codice:
    st.executeUpdate("UPDATE Clienti SET nome = '" + nome + "' WHERE IDCliente = " + id)
    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

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    726
    Perfetto!

    Grazie 1000

  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    726
    Riuppo il thread per un problema simile.

    codice:
    public void aggiornaUsername() throws SQLException
      {
       String[] userPsw = new String[2];
       userPsw = getUserPsw();
          
       userPsw[1] = null;
         
       if (userPsw[0].equals(FormModificaUsername.campoUsername.getText()))
       {
        st.executeUpdate("UPDATE accesso SET username = '"+FormModificaUsername.campoNuovoUsername.getText()+"' WHERE id = " + 1);
        JOptionPane.showMessageDialog(null, "Username correttamente modificato", "Conferma modifica", JOptionPane.INFORMATION_MESSAGE);
       }
       else
        JOptionPane.showMessageDialog(null, "Errore", "Si è verificato un errore", JOptionPane.ERROR_MESSAGE);
        
      }
    viene riportato questo errore:
    codice:
    java.sql.SQLException: Invalid handle
        at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7129)
        at sun.jdbc.odbc.JdbcOdbc.SQLExecDirect(JdbcOdbc.java:3110)
        at sun.jdbc.odbc.JdbcOdbcStatement.execute(JdbcOdbcStatement.java:338)
        at sun.jdbc.odbc.JdbcOdbcStatement.executeUpdate(JdbcOdbcStatement.java:288)
        at QueryDB.aggiornaUsername(QueryDB.java:339)
        at QueryDB.<init>(QueryDB.java:56)
        at FormModificaUsername.actionPerformed(FormModificaUsername.java:97)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
        at java.awt.Component.processMouseEvent(Component.java:6038)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3260)
        at java.awt.Component.processEvent(Component.java:5803)
        at java.awt.Container.processEvent(Container.java:2058)
        at java.awt.Component.dispatchEventImpl(Component.java:4410)
        at java.awt.Container.dispatchEventImpl(Container.java:2116)
        at java.awt.Component.dispatchEvent(Component.java:4240)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)
        at java.awt.Container.dispatchEventImpl(Container.java:2102)
        at java.awt.Window.dispatchEventImpl(Window.java:2429)
        at java.awt.Component.dispatchEvent(Component.java:4240)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)
    Errore di tipo SQLException
    getUserPsw è un metodo che restituisce un array di due elementi, uno contenente uno username e l'altro la password.

    L'errore che ricevo si verifica quando si va ad eseguire la query.
    Tutti i parametri di connessione sono settati, anche perchè tanti altri metodi funzionano a perfezione.

    Cosa potrebbe essere?

    tnx!

  8. #8
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    st.executeUpdate("UPDATE accesso SET username = '"+FormModificaUsername.campoNuovoUsername.getText ()+"' WHERE id = " + 1);
    Ma questo Statement st, da dove viene?
    Sicuro di non averlo gia' usato da qualche parte e successivamente chiuso?
    Io ti consiglio di usare Statement diversi per pezzi di sql diversi. Anzi, io getterei alle ortiche gli Statement che danno solo problemi di sicurezza e userei i PreparedStatement. Ho visto sopra che li avevi presi in considerazione, ma non hai compreso il funzionamento. Nei PreparedStatement devi mettere dei punti interrogativi al posto delle variabili e poi sostituirli con i metodi opportuni.
    Ad esempio
    codice:
    PreparedStatement st = con.preparedStatement("UPDATE accesso SET username = ? WHERE id = 1);
    st.setString(1, "STRINGA_CHE_DEVI_METTERE_AL_POSTO_DI_?");
    st.executeUpdate();
    Inoltre ho notato che un problema simile ti si era già presentato (http://forum.html.it/forum/showthrea...readid=1109139), magari la causa è la stessa.

  9. #9
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    726
    Editato.

    Forse ho capito l'inghippo.

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.