Newsgroup: it.comp.java
Titolo: SQLException

 
conn=DriverManager.getConnection("jdbc:ucanaccess://C:/ricevute.mdb"); 
 
             pst = conn.prepareStatement("Select * from RICEVUTE Where 
Year(CONDATA) ='" + anno + "' And NRIC=" + nu);
 
             int Upd=pst.executeUpdate("DELETE from RICEVUTE Where 
Year(CONDATA) ='" + anno + "' And NRIC=" + nu);
 
Mi restituisce:
net.Ucanaccess.jdbc.UcanaccessSQLException:feature not supported
 
Cosa sbaglio?
-- 
Gulp®
(forse mi sono perso qualcosa :))

A occhio potrebbe essere perchè cerchi di paragonare un numero (presumo 
Year restituisca un numero) con una stringa (stai usando gli apici 
singoli intorno alla variabile anno)...
 
... e comunque la prepareStatement usata così serve a ben poco


 ... e comunque la prepareStatement usata così serve a ben poco
 
Dentro a prepareStatement ci deve comunque essere una stringa sql?
La mia domanda era diretta alla correzione di eventuali errori nella 
sintassi sql, ma anche, dal momento che sono alle prime armi in, a 
cercare di capire come vanno utilizzati i vari strumenti di connessione 
ed esecuzione di query, oltre alla query stessa. E' quindi gradito anche 
l'aiuto nella correzione di questo.


Ho corretto così:
 
conn=DriverManager.getConnection("jdbc:ucanaccess://C:/ricevute.mdb"); 
 
 
st = conn.createStatement();
st.execute("Delete from RICEVUTE Where Year(CONDATA) ='" + anno + "' And 
NRIC=" + nu);
 
Ora l'errore dice:
File marked as read only.Notice that only one process (one VM) for time 
can access in writing mode.
 
Non ho altre connessioni aperte.
La domanda è, come apro una connessione in lettura/scrittura anzichè 
read-only?


 (forse mi sono perso qualcosa :))
 
Ma usare un DBMS tecnologicamente recente piuttosto che un dinosauro estinto
come un file .mdb proprio no, eh? :-\
 
 


mi sembra strano.
Beh prova a vedere cosa ti restituisce con connection.isReadOnly()
e al limite prova a settare connection.setReadOnly(false).
Però mi sa che il problema è altrove.

 come un file .mdb proprio no, eh? :-\
 
ciccio, io passerei volentieri ad un DBMS diverso, ma....non son capace! :)
Mi dai una mano? Es. ho ricevute.mdb carico di dati, come prima cosa 
dovrei trasferire il tutto in un file "più moderno".... tipo?
Come lo faccio c'è una utility?
Me la dai una mano? Grazie.
 
 
-- 


 Però mi sa che il problema è altrove.
 
FATTO: connection.setReadOnly(false)
 
Ma dà lo stesso errore.


 come un file .mdb proprio no, eh? :-\
 
tipo cosa? mysql magari?
 
Ciao Jack
-- 
Yoda of Borg am I! Assimilated shall you be! Futile resistance is, hmm?


e se metti connection.setAutoCommit(true) ?
scusa ma l'errore è causato dal driver specifico che non ho mai utilizzato.


ovviamente i set devi eseguirli prima della execute


Chiaro.
Si, mi dà lo stesso errore. Il file non è protetto da password, come 
vedi nella stringa di correzione.


 vedi nella stringa di correzione.
 
 
connessione!!


> scusa ma l'errore è causato dal driver specifico che non ho mai utilizzato.
 
Ho preferito utilizzare ucanaccess perchè posso connettere un *.mdb 
senza utilizzare ODBC, così riesco a mantenere svincolato il tutto dalla 
piattaforma utilizzata.


 Cosa sbaglio?
Allora, principalmente utilizzi la stessa PreparedStatement sia per la 
select che per la delete. Non si fa, e' maleducazione! Scherzi a parte, 
dovresti ricreare la PreparedStatement se la usi per scopi diversi.
 
In secondo luogo il messaggio "feature not supported" farebbe pensare ad 
una versione di access non supportata dal driver. Verifica. Per quanto 
ne so il driver UCanAccess supporta access fino alla versione 2010, Non 
so se esistano versioni più recenti.
 
 
Inoltre, una prepare statement dovrebbe utilizzare i marker, non 
concatenazione di stringe e separatori, che è compito della 
PreparedStatement, ad esempio:
 
pst = conn.prepareStatement("Select * from RICEVUTE " +
	"Where  Year(CONDATA) = ? And NRIC= ?");
pst .setString(1, anno);
pst .setInt(2, nu);
ResultSet rs = pst.executeQuery();
...
 
stessa cosa:
pst = conn.prepareStatement("DELETE from RICEVUTE " +
	"Where  Year(CONDATA) = ? And NRIC= ?");
pstt.setString(1, anno);
pstt.setInt(2, nu);
int Upd=pst.executeUpdate();
...

 Me la dai una mano? Grazie.
 
Posso consigliarti di usare HSQLDB (
hsqldb.org
), lo puoi anche
utilizzare come DB embedded nei tuoi progetti, e in più
ti liberi dalla dipendenza di dove usare un formato proprietario
per il DB.
 
Ho trovato qualche articolo che potrebbe interessarti:
 
Usare HSQLDB embedded in un progetto java
http://akeltux.blogspot.it/2009/12/usare-hsqldb-embedded-in-un-progetto.html
 
 
Introduzione ad HSQLDB
http://www.ingegno.it/it/arch/2011/01/hsqldb/
 
 
 

 
 
Puoi fare lo stesso con HSQLDB, vedi risposta più sopra.
 
 


Molto interessante! Grazie!
Ho intenzione di approfondire.
Sai come si comporta in multi-utenza?


 Cosa sbaglio?
 
un po' tutto. concentrato in due righe non è male.
per esempio il primo statement (select) non è mai eseguito. inoltre
il PreparedStatement prima lo crei con uno statement in sola lettura 
e poi lo usi con un altro di delete.
correggi questo e poi vediamo.
 

 
 
Sicuramente anni luce meglio di access.
Devi attivare la modalità server (Database HSQLDB Engine Server)
per poi connetterti dalle postazioni client (occhio che la stringa di
connessione dovrebbe essere del tipo jdbc:hsqldb:hsql://ip server).
Comunque consulta la guida sul sito ufficiale, è in inglese
ma è fatta molto bene e spiega i concetti in maniera semplice
e chiara.
 
 

 Cosa sbaglio?
 
Ad usare Access? E` una possibilita`...
 
 
Enrico

Aveva proprio ragione ciccio. Quel DB dimostra tutti i suoi anni, è 
bastato aggiornare il DB da *.mdb a *.accdb e tutto è andato a posto 
anche mantenendo il driver ucanaccess.
 
Comunque ho intenzione di provare il passaggio a HSQLDB, ma per il 
momento solo nella modalità embedded.
 
Grazie della collaborazione.
