Newsgroup: it.comp.java
Titolo: SQL in java

ciao gente, essendo nuovo mi presento: sono Iosephus! :-)
Ho un problema che spero voi mi sappiate risolvere... devo inserire dei
dati in un database;
uso l'istruzione SQL "INSERT INTO" ma mi dice che c'è un errore nella
sintassi...
ora vi mostro il codice semi-completo:
------------------------------------------------------------------------
     strSQL="INSERT INTO fatture (";
     strSQL=strSQL+"numero_fattura, ";
     strSQL=strSQL+"data_fattura, ";
     strSQL=strSQL+"partita_iva, ";
     strSQL=strSQL+"ragione_sociale, ";
     strSQL=strSQL+"importo, ";
     strSQL=strSQL+"data_scadenza, ";
     strSQL=strSQL+"tipo_fornitore, ";
     strSQL=strSQL+"acconti, ";
     strSQL=strSQL+"importo_pagato, ";
     strSQL=strSQL+"data_pagamento, ";
     strSQL=strSQL+"tipo_pagamento, ";
     strSQL=strSQL+"note";
     strSQL=strSQL+") VALUES (";
     strSQL=strSQL+"'"+numero_fattura.getText()+"', ";
     strSQL=strSQL+"'"+data_fat+"', ";
     strSQL=strSQL+"'"+partita_iva.getText()+"', ";
     strSQL=strSQL+"'"+ragione_sociale.getText()+"', ";
     strSQL=strSQL+imp+", ";
     strSQL=strSQL+"'"+data_scad+"', ";
     strSQL=strSQL+"'"+tipo_forn+"', ";
     strSQL=strSQL+account+", ";
     strSQL=strSQL+importo_pag+", ";
     strSQL=strSQL+"'"+data_pagamento.getText()+"', ";
     strSQL=strSQL+"'"+tipo_pag+"', ";
     strSQL=strSQL+"'"+note.getText()+"'";
     strSQL=strSQL+")";
    try{
          int result=st.executeUpdate(strSQL);
          if(result==1)
            JOptionPane.showMessageDialog(null, "Inserimento avvenuto con
successo");
          else JOptionPane.showMessageDialog(null, "Inserimento fallito...
Riprova");
        }catch(SQLException sqle){
          JOptionPane.showMessageDialog(null, sqle.toString());
    }
---------------------------------------------------------------------------
---------------
i campi "importo", "importo_pagato" e "acconti" sono numerici, gli altri
sono tutti campi testo... sapete dirmi dove c'è l'errore? è da due giorni
che ci sbatto la testa ma non riesco proprio a trovarlo!
--
ciao,
iosephus, ego locutus

 sintassi...
Usa uno StringBuffer invece della somma tra stringhe, per motivi di
performance.
Magari postaci il risultato di sqle.toString(), cosě ad occhio la sintassi
sembrerebbe corretta. Che db usi?
Ciao,
 Stefano
----------
"X WindowSSS, teSSSoro mio... lo odieremo per SSSempre"
Bill Gollum
----------

Prova a mettere tra apici singoli anche i valori numerici.
Saluti

 Prova a mettere tra apici singoli anche i valori numerici.
?!? Da dove ti è venuta questa?


      strSQL=strSQL+importo_pag+", ";
....
Non vorrei dire una castroneria, ma secondo me dovresti usare un
PreparedStatement, ti risparima molta fatica nell'inserimento
di String e valori numerici; per lo meno ti risparmia di dover
raddoppiare tutti gli apici.
Liberi tutti di correggermi e/o sommergermi di insulti in caso
io abbia detto una castroneria, ovviamente.
Ciao,
	Rob
------------------------------------------------
"The only secured Windows is an uninstalled one"

La sintassi mi pare OK ... sicuro che i campi data_pagamento e data_scadenza
siano di tipo testo e non data?

 ha scritto nel messaggio
news:3CCD3714...@sdb.it...
| Usa uno StringBuffer invece della somma tra stringhe, per motivi di
| performance.
| Magari postaci il risultato di sqle.toString(), così ad occhio la
sintassi
| sembrerebbe corretta. Che db usi?
|
| Ciao,
|  Stefano
l'errore che viene fuori è questo:
"java.sql.SQLException:[Microsoft][Driver ODBC Microsoft Access] Errore di
sintassi nell'istruzione INSERT INTO"
                    l'ho messo io tra virgolette...
mentre quando eseguo il programma l'istruzione che deve eseguire è questa:
"INSERT INTO fatture (numero_fattura, data_fattura, partita_iva,
ragione_sociale, importo, data_scadenza, tipo_fornitore, acconti,
importo_pagato, data_pagamento, tipo_pagamento, note) VALUES ('1',
'30/10/2001', '5', 'io', 90, '12/2001', 'Cassa Ing.', 0, 90, '30/12/2001',
'Bonifico', 'ha pagato in tempo')"
                    le virgolette le ho aggiunte sempre io...
uso Access (per ora), ma non dovrebbe essere un problema perché in un
programma che feci un po' di tempo fa non mi dava nessun problema...
praticamente l'ho scopiazzato da quello... che funziona a meraviglia,mentre
questo mi da quell'errore di cui vi ho parlato
con lo StringBuffer però non risolvo questo problema... è solo per
velocizzare il tutto... giusto?
Per Jabawack (ma anche gli altri): cos'è lo "PreparedStatement"... mai
visto nella documentazione... come si usa?


 ha scritto nel messaggio
news:3CCD55D3...@nosite.com...
| La sintassi mi pare OK ... sicuro che i campi data_pagamento e
data_scadenza
| siano di tipo testo e non data?
|
|
sicurissimo... il database l'ho creato io, come potrei non esserlo?
sono tutti campi testo tranne importo, acconti e importo_pagato...
se i campi non fossero corretti mi darebbe un errore di "tipo non
corrispondente" e non di sintassi dell'istruzione INSERT INTO, giusto?


      strSQL=strSQL+"'"+data_fat+"', ";
In ODBC le date devono essere rachiuse tra cancelletti (#ddd#).
Ti consiglio di utilizzare dei preparedStatement per questo tipo di
cose, sono molto piu' semplici e ti evitano di ammattire con i tipi
di dato.
Davide


imho e` un problema di date. quel "scadenza" messo a '12/2001'?

 --
Parti da:
http://java.sun.com/j2se/1.4/docs/api/java/sql/PreparedStatement.html
La classe fa parte di java.sql.*;
In pratica:
PreparedStatement p = new PreparedStatemen("INSERT INTO fatture 
(numero_fattura,data_fattura, partita_iva, 
ragione_sociale,importo,data_scadenza, tipo_fornitore, 
acconti,importo_pagato, data_pagamento, tipo_pagamento, note) VALUES ( 
?,?,?,?,?,?,?,?,?,?,?,?)");
p.setInt(1,Integer.parseInt(numero_fattura.getText()));
p.setDate(2,data_fat);
.....
ecc...
int result=p.executeUpdate();
Ovviamente ho tralasciato i try/catch e se fosse possibile che
numero_fattura non costringesse a fare tutto quel casino per avere un
int sarebbe meglio.
Ciao,
	Rob


il nuovo codice con StringBuffer è questo (ditemi se è giusto)...
---------------------------------------------------------------------------
    StringBuffer strSQL=new StringBuffer(0);
    strSQL.append("INSERT INTO fatture ");
    strSQL.append("(numero_fattura, data_fattura, partita_iva,
ragione_sociale, importo, data_scadenza, tipo_fornitore, acconti,
importo_pagato, data_pagamento, tipo_pagamento, note)");
    strSQL.append(" VALUES (");
    strSQL.append("'"+numero_fattura.getText()+"', ");
    strSQL.append("'"+data_fat+"', ");
    strSQL.append("'"+partita_iva.getText()+"', ");
    strSQL.append("'"+ragione_sociale.getText()+"', ");
    strSQL.append(imp+", ");
    strSQL.append("'"+data_scad+"', ");
    strSQL.append("'"+tipo_forn+"', ");
    strSQL.append(account+", ");
    strSQL.append(importo_pag+", ");
    strSQL.append("'"+data_pagamento.getText()+"', ");
    strSQL.append("'"+tipo_pag+"', ");
    strSQL.append("'"+note.getText()+"')");
    try{
        int result=st.executeUpdate(strSQL.toString());
        if(result==1)
                JOptionPane.showMessageDialog(null, "Inserimento avvenuto
con successo");
        else   JOptionPane.showMessageDialog(null, "Inserimento fallito...
Riprova");
        }catch(SQLException sqle){
            JOptionPane.showMessageDialog(null, sqle.toString());
    }
---------------------------------------------------------------------------
ma da sempre lo stesso errore (non che pensassi che era una soluzione, però
ci speravo :-))) )


 ha scritto nel messaggio
news:aajn56$co4$1...@newsreader.mailgate.org...
| [CUT]
| Ovviamente ho tralasciato i try/catch e se fosse possibile che
| numero_fattura non costringesse a fare tutto quel casino per avere un
| int sarebbe meglio.
|
|
ma non faccio tutto quel casino solo per avere quell'int... ma per
aggiornare effettivamente il database... poi testo il result... se è uno
allora l'aggiornamento ha avuto successo... non faccio bene?
grazie di tutto... ora vado a vedere il PreparedStatement... a quanto pare
è molto interessante!


 ha scritto nel messaggio
news:3ccd5e45...@powernews.libero.it...
[cut]
| imho e` un problema di date. quel "scadenza" messo a '12/2001'?
|
no, no...le date sono tutte di tipo "text"


     strSQL.append("'"+partita_iva.getText()+"', ");
AAARGH non ha senso usarlo in questo modo... se all'interno delle parentesi ai
una somma tra stringhe aggiungi comunque la creazione di due stringbuffer
temporanei. Inoltre perchč fai "', " + "'" quando puoi fare "', '" ? Riduci le
costanti al minimo possibile!
Fai cosě:
strSQL.append(") VALUES (")
    .append("'")
    .append(numero_fattura.getText())
    .append("', '")
    .append(data_fat)
    .append("', '") ...


PreparedStatement ps=cn.prepareStatement("INSERT INTO fatture
(numero_fattura, data_fattura, partita_iva, ragione_sociale, importo,
data_scadenza, tipo_fornitore, acconti, importo_pagato, data_pagamento,
tipo_pagamento, note) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)");
     ps.setString(1,numero_fattura.getText());
     ps.setString(2,data_fat);
     ps.setString(3,partita_iva.getText());
     ps.setString(4,ragione_sociale.getText());
     ps.setInt(5,imp);
     ps.setString(6,data_scad);
     ps.setString(7,tipo_forn);
     ps.setInt(8,account);
     ps.setInt(9,importo_pag);
     ps.setString(10,data_pagamento.getText());
     ps.setString(11,tipo_pag);
     ps.setString(12,note.getText());
     try{
      int result=ps.executeUpdate();
      if(result==1)
        JOptionPane.showMessageDialog(null, "Inserimento avvenuto con
successo");
      else JOptionPane.showMessageDialog(null, "Inserimento fallito...
Riprova");
      }catch(SQLException sqle){
       JOptionPane.showMessageDialog(null, sqle.toString());
     }
---------------------------------------------------------------------------
questo qua sopra è il nuovo codice con PreparedStatement... ma da sempre
l'errore di sintassi nell'istruzione INSERT INTO...
che faccio?


 -------------------------------------------------------------------------
--
| >     strSQL.append(" VALUES (");
| >     strSQL.append("'"+numero_fattura.getText()+"', ");
| >     strSQL.append("'"+data_fat+"', ");
| >     strSQL.append("'"+partita_iva.getText()+"', ");
|
| AAARGH non ha senso usarlo in questo modo... se all'interno delle
parentesi ai
| una somma tra stringhe aggiungi comunque la creazione di due stringbuffer
| temporanei. Inoltre perchè fai "', " + "'" quando puoi fare "', '" ?
Riduci le
| costanti al minimo possibile!
| Fai così:


 
Puoi postare l'errore che ti da?
Ciao,
	Rob
------------------------------------------------


 ha scritto nel messaggio
news:aajqjb$fgu$1...@newsreader.mailgate.org...
| Iosephus wrote:
| [CUT]
| > questo qua sopra č il nuovo codice con PreparedStatement... ma da
sempre
| > l'errore di sintassi nell'istruzione INSERT INTO...
| > che faccio?
| >
| >
|
| Puoi postare l'errore che ti da?
"java.sql.SQLException:[Microsoft][Driver ODBC Microsoft Access] Errore di
sintassi nell'istruzione INSERT INTO"


 sintassi nell'istruzione INSERT INTO"
Speravo in qualcosa di più, come dire, corposo... ;o)
Mi viene un dubbio amletico.. in Access la sintassi dell'INSERT è la
stessa dell' SQL92??
Mi ricordo che nel mio Access'97 , ad esempio, ho dovuto mettere i nomi
delle tabelle tra parentesi quadre...
select * from [tabella] where....
Uhm.. altrimenti non saprei che dirti.. a parte di cambiare DB ma
se hai scelto Access ci sarà un motivo.


 ha scritto nel messaggio
news:aajs2i$ghj$2...@newsreader.mailgate.org...


 ?!? Da dove ti č venuta questa?


 venuto in mente niente riguardo all'errore di sintassi nell'INSERT?
Non è che nei valori dei campi che vanno inseriti c'è l'apostrofo ( ' è il
terminatore di stringa in SQL e potrebbe dare problemi) ?


 correttamente; E' un caso ?
No, č MySQL.


grazie a tutti dei suggerimenti... ho trovato il bandolo della matassa: non
posso chiamare un campo del database "note" perché questa è una parola
riservata di java... e quindi mi dava l'errore di sintassi... che storia,
eh?
grazie ancora a tutti!


 eh?
Meriterebe che la raccontassi a mio figlio prima di addormentarlo.
Personalmente ho un piccolo db con otto tabelle che hanno un campo chiamato
'note' e 'note' non mi pare una keyword del linguaggio Java. Io darei un'altra
occhiata fossi in te.


 ha scritto nel messaggio
news:3CCEA36A...@sdb.it...


 ha scritto nel messaggio
news:3CCEA36A...@sdb.it...



Un cavolo :-), e' una parola riservata di access! Comunque esiste una sintassi alternativa
che puoi provare ad usare, te l'hanno gia' consigliata fra l'altro: racchiudilo fra
parentesi quadre. [note]
Ciao,
    Bruno.
P.S.
Se ti consola ho avuto lo stesso problema piu' di 6 anni fa, quando passai a lavorare in
Java: chissa', magari e' di buon auspicio!
---
| Bruno Bossola
| A Java Software Engineer :-)
| 
http://digilander.iol.it/bbossola

 parentesi quadre. [note]
Allora invece che tra parentesi quadre, che è una caratteristica (deviante) di Access, lo
standard SQL dovrebbe prevedere i doppi apici (almeno, PostgreSQL quelli vuole); sarebbe
preferibile aderire agli standard internazionali piuttosto che a quelli M$. Just my 2c.


 ha scritto nel messaggio
news:3ccead36...@news.inet.it...
| >... non posso chiamare un campo del database "note" perché questa č



All'epoca in access non funzionava, chissa', magari ora si sono adeguati :-)
Ottimo consiglio, comunque.
Ciao,
    Bruno.


--
direi che ormai siamo OT. in SQL server puoi creare un campo e
chiamarlo, che so, date, pero` puoi accedervi solo se lo richiami con
[date]. in generale se fai creare uno script del db i nomi dei campi e
delle tabelle vengono inseriti in parentesi quadre.
non e` possibile, come qualcuno suggeriva in questo thread, metterli
tra apici ('date') perche` altrimenti il server non riuscirebbe a
distinguere tra una stringa ed una tabella.


ops, parlava di doppi apici. chiedo scusa

 Ottimo consiglio, comunque.
Sicuramente NON funzionano tuttora, perň il ponte jdbc-odbc dovrebbe pensaer alla conversione
" -> [, rendendola trasparente al programmatore. (Almeno cosě *dovrebbe* fare...)


 ha scritto nel messaggio
news:3CCEB9A2...@sdb.it...


provato... funziona... avevi ragione... grazie mille... ora scappo!
telegrafico! :-)
--
ciao,
iosephus, ego locutus
"Iosephus" <iosephu...@PLEASEiol.it> ha scritto nel messaggio
news:n3zz8.35592$W9.8...@twister2.libero.it...



Per inserire un doppio apice in una stringa e' sufficiente che tu lo faccia precedere da
un carattere slash:
String saluto = "Hello, \"boys!\"";
Ciao,
    Bruno.
