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

    [java+sql] Inserimento stringhe contenenti " e '

    Salve ragazzi,ho necessità di inserire in un database access ed uno myslq dei campi string che contengono al loro intermo "" e '.
    Infatti se esegio x esempio:

    codice:
    v  = db.eseguiQuery(INSERT INTO tabella VALUES ("testo1","testo'2",testo"3");
    la funzione m restituisce un'errore di sintassi. Esiste un metodo x poter inserire questi tipi particolari di stringhe?

    P.S. la funzione eseguiQuery è quella illustrata nella PILLOLA

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [java+sql] Inserimento stringhe contenenti " e '

    Originariamente inviato da Idioteque
    codice:
    v  = db.eseguiQuery(INSERT INTO tabella VALUES ("testo1","testo'2",testo"3");
    Se la query ha tutto fisso, predeterminato, puoi scriverla tu con gli escape dei caratteri nel modo corretto:

    codice:
    db.eseguiQuery("INSERT INTO tabella VALUES (\"testo1\", \"testo'2\", \"testo\\\"3\"");
    Tutta la stringa è racchiusa tra " " e degli eventuali " interni è stato fatto l'escape. E per \"testo\\\"3\", nella stringa diventa "testo\"3" perché è corretto che in una stringa nella query, sia fatto a sua volta l'escape di " (perché altrimenti la quotazione sarebbe sbilanciata).

    Se dovessi inserire nella query, dentro i VALUES, oggetti String con contenuto arbitrario, allora è meglio usare un PreparedStatement.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3

    Re: Re: [java+sql] Inserimento stringhe contenenti " e '

    Originariamente inviato da andbin
    Se dovessi inserire oggetti String con contenuto arbitrario, allora è meglio usare un PreparedStatement.
    Sono esattamente in questo caso.Grazie,adesso vado a cercarmi qualcosa sul PreparedStatement.
    Da quanto ho capito da una prima analisi,devo modificare la funzione:
    codice:
    public boolean eseguiAggiornamento(String query) {
          int numero = 0;
          boolean risultato = false;
          try {
             Statement stmt = db.createStatement();
             numero = stmt.executeUpdate(query);
             risultato = true;
             stmt.close();
          } catch (Exception e) {
             e.printStackTrace();
             errore = e.getMessage();
             risultato = false;
          }
          return risultato;
       }
    ed invece di usare lo Statement,usare il PreparedStatement.Giusto?

    Per nn aprire un'altro post, come si fa a ricavare l'ultimo record di una tabella ed i suoi relativi campi?

  4. #4
    ho cercato un pò su internet,ma onestamente nn ho capito molto come usarlo. Se qualcuno può aiutarmi con questo problema. Devo fare l'insert di stringhe che possono contenere random o " o ' .

    Ho pensato al limite che quando costruisco la stringa,potrei fare

    codice:
    x l'insert dell'access
    
    int apostrofo = title.indexOf("'");
    if (apostrofo != -1)
    {
    title = title.replaceAll("'", "\\'");
    }
    
    x l'insert di mysql
    
    int virgolette = title.indexOf(""");
    if (virgolette != -1)
    {
    title = title.replaceAll(""", "\\"");
    }
    è giusto? il codice così viene rallentato molto?

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Idioteque
    è giusto? il codice così viene rallentato molto?
    No, non è giusto. E comunque sarebbe dipendente dal database, quindi scomodo.

    Ripeto che c'è PreparedStatement, di cui si è già parlato sul forum diverse volte. Cioè è il driver JDBC che si occuperebbe di quotare i dati e fare gli escape dove e come è appropriato per il database!

    Vedi:
    http://java.html.it/articoli/leggi/2...ement-in-jdbc/

    e c'è anche un piccolo esempio nella documentazione di java.sql.PreparedStatement

    http://java.sun.com/javase/6/docs/ap...Statement.html
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    ho modificato la funzione in questo modo:

    codice:
    public boolean eseguiAggiornamento(String query,String [] record) {
          int numero = 0;
          boolean risultato = false;
          try {
             PreparedStatement prepStat = db.prepareStatement(query);
             for (int i=0; i<numRecord;i++) prepStat.setString(i+1, ""+record[i]+");
             prepStat.executeUpdate(); 
             prepStat.close();
             risultato = true;
          } catch (Exception e) {
             e.printStackTrace();
             errore = e.getMessage();
             risultato = false;
          }
          return risultato;
       }
    Questa è la query:
    codice:
    INSERT INTO Esami_Temp (Codice,Esame,Esenzione,Es-Totale,DM96,Branca,Daprint,Medico,GlobalID,DataAggiornamento,Numero,CodiceSIS,FL_Importato,idEbase,code,Reddito,Invalido) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
    e questo è l'errore:
    codice:
    com.mysql.jdbc.exceptions.jdbc4.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 '-Totale,DM96,Branca,Daprint,Medico,GlobalID,DataAggiornamento,Numero,CodiceSIS,F' at line 1
            at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
            at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
            at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
            at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
            at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
            at com.mysql.jdbc.Util.getInstance(Util.java:381)
            at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1030)
            at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
            at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3491)
            at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3423)
            at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1936)
            at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060)
            at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2542)
            at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1734)
            at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2019)
            at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1937)
            at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1922)
            at sync.Database.eseguiAggiornamento(Database.java:133)
            at sync.codice.iniz(codice.java:260)
            at sync.codice.actionPerformed(codice.java:182)
            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.AbstractButton.doClick(AbstractButton.java:357)
            at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:1220)
            at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:1261)
            at java.awt.Component.processMouseEvent(Component.java:6041)
            at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
            at java.awt.Component.processEvent(Component.java:5806)
            at java.awt.Container.processEvent(Container.java:2058)
            at java.awt.Component.dispatchEventImpl(Component.java:4413)
            at java.awt.Container.dispatchEventImpl(Container.java:2116)
            at java.awt.Component.dispatchEvent(Component.java:4243)
            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:2440)
            at java.awt.Component.dispatchEvent(Component.java:4243)
            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)
    Cosa c'è d sbagliato? Con alcune tabelle va,con altre no. I nomi dei campi della tabella li recupero dalla tabella, e sono giusti. A questo punto il problema è il prepStat.setString? Nel database sql ho inpostato apposta tutti campi text,quindi adesso nn so.

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Idioteque
    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 '-Totale,DM96,Branca,Daprint,Medico,GlobalID,DataAgg iornamento,Numero,CodiceSIS,F' at line 1
    Il problema è Es-Totale. In MySQL un identificatore va quotato con i "backtick" (gli apici singoli al contrario ` `) se contiene caratteri particolari o se è una parola riservata.

    Morale della favola: cerca di non usare il più possibile nomi con caratteri inusuali.

    Ma non centra nulla con Java o con JDBC. Centra con le restrizioni imposte dal database per gli indentificatori.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    ok,grazie tante,sai proprio tutto ^^. son proprio le piccolezze che m fanno sempre uscire pazzo

    Ho risolto adesso il problema inserendo i "backtick", poichè i nomi delle tabelle del database iniziale nn posso modificarlo, purtroppo. Grazie ancora x la tua gentilezza ^^

  9. #9
    umm,ok,adesso ad inserire i dati al database mysql funziona perfettamente,adesso ho problemi però ad inserire i dati nel database access. La funzione eseguiAggiornamenti che ho postato prima,l'ho inserita pure nella classe x la connessione ad database access, però ho sempre questo problema con tutte le tabelle:

    questa è la query che produco:
    codice:
    INSERT INTO Cancellazioni (`Tabella`,`Medico`,`GlobalID`,`DataCancellazione`,`Codice`,`DataAggiornamento`,`FL_Importato`,`idEbase`) VALUES (?,?,?,?,?,?,?,?)
    e questo è l'errore che ho:
    codice:
    java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver] Data type mismatch in criteria expression.
    ho pure controllato i record che passo,e sono giusti,ogni record è associato a quello giusto,pure il capo DataAggiornamento che è di tipo date/time.
    Per caso il problema è prepStat.setString(i+1, ""+record[i]+"). Invece di setString devo mettere setDate? se è così allora ogni volta devo recuperare il tipo del dato e secondo il tipo mettere il comando giusto?

  10. #10
    Originariamente inviato da Idioteque
    Per caso il problema è prepStat.setString(i+1, ""+record[i]+"). Invece di setString devo mettere setDate? se è così allora ogni volta devo recuperare il tipo del dato e secondo il tipo mettere il comando giusto?
    Si, esatto. Devi passare un oggetto che è del tipo corrispondente alla colonna nel DB. Inoltre, non vorrei sbagliare, ma penso che con access i ` danno fastidio. Non sono necessari.
    Al mio segnale... scatenate l'inferno!

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.