Newsgroup: it.comp.java
Titolo: java.sql.SQLException

Sto impazzendo per quale motivo ottengo queste eccezioni ???
java.sql.SQLException: Syntax error or access violation,  message from
server: "
You have an error in your SQL syntax near 'UNION SELECT Data_Scadenza,User
FROM
oggetti_permuta' at line 1"
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:1628)
        at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:886)
        at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:945)
        at com.mysql.jdbc.Connection.execSQL(Connection.java:1809)
        at
com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1458)
        at aste_permute.Database.executeQuery(Database.java:111)
        at NotificaScadenzeThread.run(NotificaScadenzeThread.java:34)
La cosa strana è che nel server locale funziona tutto alla perffezione, dopo
aver esportato lo stesso database con mysqldump sul database dove
l'applicazione dovrà girare .. ottengo le eccezioni sopra .... il codice è
questo ...
import java.sql.*;
import java.util.*;
import aste_permute.*;
public class NotificaScadenzeThread extends Thread {
private Database db;
private TreeMap tree = null;
private Connection con;
public NotificaScadenzeThread(String str, Database database) {
super(str);
db = database;
con = db.getConnection();
}
public void run() {
//Connection con = db.getConnection();
tree = new TreeMap();
SendMailThread sendMail = null;
//while (true) {
try {
PreparedStatement select =
con.prepareStatement(
"SELECT Data_Scadenza,User "
+ "FROM oggetti_asta "
+ "UNION "
+ "SELECT Data_Scadenza,User "
+ "FROM oggetti_permuta");
ResultSet rs = db.executeQuery(select);
while (rs.next()) {
TreeSet treeUt = new TreeSet();
// se la data di scadenza è maggiore o uguale alla data attuale
// allora la metto nell'albero altrimenti no !
if
((rs.getString("Data_Scadenza")).compareTo(Gestione.date2string(Gestione.cre
aData(), 0)) >= 0) {
// se l'albero non è vuoto && la chiave esiste già
if (tree.size() != 0 && tree.containsKey(rs.getString("Data_Scadenza"))) {
treeUt = (TreeSet)tree.get(rs.getString("Data_Scadenza"));
}
treeUt.add(rs.getObject("User"));
tree.put(rs.getObject("Data_Scadenza"), treeUt);
}
}
if (sendMail != null && sendMail.isAlive())
sendMail.interrupt();
sendMail = new SendMailThread("Send Mail", tree, con, db);
sendMail.start();
sleep(86400000);
}
catch (SQLException e) {
e.printStackTrace();
}
catch (InterruptedException e1) {
System.out.println("interput di notifica");
e1.printStackTrace();
}
//}
}
}
tutto cio' non ha senso i database sono uguali solo che in locale funziona
nel database remoto no ... se provo a fare una query più semplice ...una
SELECT per esempio ...tutto funziona anche con il server locale ....
percheee ????
grazie
diego

 
Sei sicuro che il server MySql sia proprio lo stesso (stessa versione)?
Dal messaggio sembrerebbe che non capisca la sintassi che hai usato nel
comando SQL.
L'altra possibilita' e' che non hai impostato i permessi corretti sulla
tabella oggetti_permuta: controlla i grant.
-- 
Lucio Benfante - Java User Group Padova
Brainbench MVP for Java 1
http://www.brainbench.com
MyTranscript: 
http://www.brainbench.com/transcript.jsp?pid=167064

 tabella oggetti_permuta: controlla i grant.
come ? scusa l'ignoranza !
diego

 come ? scusa l'ignoranza !
...a questo punto non ha piu' importanza: non sono i permessi, ma la
sintassi.


 sintassi.
divento OT se ti chiedo come posso ottenere la stessa query senza utilizzo
di UNION ???



...siamo gia' OT da un pezzo :-)
Non puo' scrivere la stessa query in ua maniera diversa in SQL, ma
potresti ottenere lo stesso risultato eseguendo le due SELECT
separatamente e poi riunendo i due risultati.
Il problema potrebbe essere l'eliminazione dei duplicati fatta dalla
UNION, ma questo lo risolvi gia' a livello applicativo, dato che metti i
risultati in dei TreeSet.
In ogni caso le prestazioni dell'applicazione potrebbero essere un po'
migliorate eliminando un po' di duplicati gia' nelle
SELECT:
SELECT DISTINCT Data_Scadenza,User FROM oggetti_asta;
Inoltre invece di controllare se la data e' maggiore di quella
attuale nell'applicazione Java, non lo potresti mettere nella query SQL?
Pensa a cosa succede quando le tue tabelle si popoleranno un po':
recupererai sempre tutte le scadenze, anche quelle di 10 anni fa. :-)
Meglio filtrarle a livello di database.
