PDA

Visualizza la versione completa : [Java] Eseguire più PreparedStatement


JAEP
04-01-2005, 16:42
Salve amici,
vorrei far eseguire più PreparedStatement nella stessa servlet, in questo modo:



conn=null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(path);
PreparedStatement pstmt = conn.prepareStatement("INSERT INTO utente VALUES(?,?,?,?,?)");
pstmt.setString(1,null);
pstmt.setString(2,request.getParameter("txtCognome"));
pstmt.setString(3,request.getParameter("txtNome"));
pstmt.setString(4,request.getParameter("txtProfessione"));
pstmt.setString(5,request.getParameter("txtMail"));
pstmt.executeUpdate();

// Recupera l'ID dell'ultimo utente inserito
int autoIncKeyFromApi = -1;
ResultSet rs = pstmt.getGeneratedKeys();
if (rs.next())
autoIncKeyFromApi = rs.getInt(1);
rs.close();

// SE INSERISCO QUESTA NUOVA PreparedStatement HO I PROBLEMI!!!!!!
pstmt.clearParameters();
pstmt.execute("INSERT INTO appartiene VALUES(?,?,?,?)");
pstmt.setInt(1,autoIncKeyFromApi);
pstmt.setInt(2,1);
pstmt.setInt(3,1);
pstmt.setString(4,"ciao");
pstmt.executeUpdate();



conn.close();
}
catch(ClassNotFoundException cnfe) {
out.println("Errore " + cnfe.getMessage());
}
catch(SQLException sqle) {
out.println("Errore " + sqle.getMessage());
}


Se inserisco la seconda PreparedStatement ho il seguente errore:

Errore Syntax error or access violation message from server: "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 '?,?,?,?)' at line 1"

Dov'è l'errore?????

Grazie

pippo75
05-01-2005, 10:29
per me ti converrebbe definire la seconda PreparedStatement esattamente come hai definito la prima:
pstmt = conn.prepareStatement("INSERT INTO appartiene VALUES(?,?,?,?,?)");
e poi settargli i parametri e alla fine eseguirla: l'execute dovrebbe eseguire l'istruzione sql, che ovviamente non è valida :)

Dorcan82
05-01-2005, 14:12
se vuoi eseguire più script SQL su di una sola connesione, deve predisporre il tutto in modo tale che la transazione SQL permetta esecuzione multipla di scriptSQL. Devi settare il valore commit a false.
Questo è il codice:
dopo aver creato l'oggetto Connection e aver caricato i driver del dbms corretti, scrivi: connectionObject.setAutocommit(false);

dopo aver eseguito tutte gli sql script, scrivi connectionObject.commit();
se manca questo metodo non eseguirai nessun sql multiplo


Spero di essere stato chiaro......
In caso contrario ti riposto meglio, magari con del codice....

:ciauz: :ciauz:

Dorcan82
05-01-2005, 14:16
altra cosa importantissima.....
tutti i flussi di I/O e quindi tutti i statement e preparedstatement e la connessione vanno chiusi sempre e comunque anche in caso di errori.

Se qualcosa dovesse andare storto, nel catch va inserito il richiamo al metodo ROLLBACK......attraverso connectionObject.rollback();
questo ultimo evita di lasciare il dbms in un stato non coerente o poco definito....riportanto il tutto allo stato precedente alla connessione

per coriosità quale dbms utilizzi??????

:ciauz:

Dorcan82
05-01-2005, 14:18
l'ultimo post fa un pò pena?????
spero sia cmq chiaro

JAEP
05-01-2005, 21:20
Originariamente inviato da Dorcan82
altra cosa importantissima.....
tutti i flussi di I/O e quindi tutti i statement e preparedstatement e la connessione vanno chiusi sempre e comunque anche in caso di errori.

Se qualcosa dovesse andare storto, nel catch va inserito il richiamo al metodo ROLLBACK......attraverso connectionObject.rollback();
questo ultimo evita di lasciare il dbms in un stato non coerente o poco definito....riportanto il tutto allo stato precedente alla connessione

per coriosità quale dbms utilizzi??????

:ciauz:

Come DBMS uso MySql.

Il problema l'ho aggirato in questo modo



pstmt.clearParameters();
pstmt = null;
pstmt = conn.prepareStatement("INSERT INTO appartiene VALUES(?,?,?,?)");
//...


Adesso, non so quanto questo stratagemma sia funzionale, anche dal punto di vista delle prestazioni.....

Un'altra cosa. Ma Come posso memorizzare la data odierna in un campo data di MySql???

Ho provato così


java.util.Date oggi = new java.util.Date();
pstmt.setDate(3,oggi);


Ma Java mi ritorna un errore.... :dhò:

Grazie a tutti

Dorcan82
06-01-2005, 00:06
il costruttore Date è deprecato sotto molti aspetti......
esiste un Date sotto java.sql......
Prova un pò......

Loading