Newsgroup: it.comp.java
Titolo: [ODBC SQL Server Driver]La connessione è occupata dai risultati di un altro hstmt.

Nel titolo l'errore che mi viene lanciato...
Il problema è che non capisco da cosa sia generato..questa la
struttura del codice
Connection c=null;
PreparedStatement p=null;
ResultSet rs=null;
PreparedStatement p2=null;
//dentro il try
String sql="SELECT * FROM TDatiASsicurativi WHERE TDAS_CODFISCALE=?";
p=c.prepareStatement(sql);
p.setString(1,codfis);
rs=p.executeQuery();
if(rs.next()){
String sqlA="UPDATE"
p2=c.prepareStatment(sqlA)
p2.executeUpdate;
}
else{
String sqlB="UPDATE"
p2=c.prepareStatment(sqlB)
p2.executeUpdate;
}
Cosa sbaglio???

La cosa si risolve se imposto la struttura in questo modo
//eseguo la SELECT, p=preparedStatement
rs=p.executeQuery()
int b=0;
WHILE(rs.next()){
b=1;
}
if(b==1){
//eseguo l'update
}
else{
//eseguo l'insert
}
Perchè con l'if non funzioni e con il while sì, rimane per me un
mistero...anche se credo possa dipendere dal driver...



 struttura del codice
La butto li': Prova a chiudere il ResultSet appena non serve piu' 
(Magari anche il PreparedStatement ...)
-- 
Giambo - Occhio al filtro antispam _e_ alla whitelist !

> Il problema è che non capisco da cosa sia generato..questa la
Mi hai davvero incuriosito: mi diverto a volte a pasticciare
con IBM DB2 tanto per vedere quanto traffico si riesce a generare
tramite JDBC prima che si incarti tutto, ed un errore simile
non l'avevo mai visto... da una rapida ricerchina pare che
la causa dei tuoi mali sia MicroSoft stessa: "Sql Server
non e' in grado di mantenere all'interno di una transazione due 
statements sql (hsmt) contemporaneamente aperti"
Può essere questo ?
Se è così sarebbe davvero "castrante"... ebbrava MS !
Devi proprio usare ODBC ? non c'è un driver nativo JDBC ?
-- 
----------------------------------------------------------------------------------
       /)/)		La mia vita è tutta rose e fiori...
      ( '.')
    o(('')('')				... ma io sono allergico !!!

 mistero...anche se credo possa dipendere dal driver...
com'č spiegato sopra il driver non ammette piů di uno statement attivo 
su di una singola connessione. Si definisce "statement attivo" uno 
statement che ha risultati pendenti, ovvero uno statement dal cui 
ResultSet non sono ancora state lette tutte le righe.
Facendo la while, leggi tutte le righe fino alla fine, quindi quella 
istruzione si "disattiva" e la successiva puň aver luogo; con un 
semplice if leggi solo una tupla, non arrivi alla fine del resultset, 
l'istruzione resta attiva e la successiva si incarta...
-- 
----------------------------------------------------------------------------------
       /)/)		La mia vita č tutta rose e fiori...


 Giambo - Occhio al filtro antispam _e_ alla whitelist !
Il discorso è che la cosa sarebbe utile se si potesse fare(l'ho fatto
con driver di tipo 4 in passato)
if(rs.next()){
//eseguo UPDATE
}
else{
//eseguo INSERT
}
ma se chiudo il ResulsSet prima di eseguire l'UPDATE..ad occhio non
dovrebbe funzionare....
Comunque proverò a settare la variabile nell'if e poi chiudere il
RS...vediamo che esce fuori.
E' la prima volta che uso un ODBC (non per mia scelta purtroppo) e non
è l'unica cosa che mi crea problemi..vedi ad esempio non poter usare:
rs.getString(i);
ma solo
rs.getString("NOME CAMPO");
tra l'altro rigorosamente in ordine......

 dovrebbe funzionare....
C'e' solo un modo per saperlo ;)
Comunque non credo che debba influenzare. Anzi, non vedo perche' dovrebbe !
Tra l'altro a me piace sempre mettere tutte le operazioni sul database 
tra un try e un finally, cosi' da essere sicuro che le risorse vengano 
liberate sempre in maniera corretta:
   Connection c=null;
   PreparedStatement p=null;
   ResultSet rs=null;
   String sql="SELECT * FROM TDatiASsicurativi WHERE TDAS_CODFISCALE=?";
   p=c.prepareStatement(sql);
   p.setString(1,codfis);
   try {
     rs=p.executeQuery();
     boolean update = rs.next();
   } finally {
     rs.close();
     p.close();
   }
   if (update) {
     sql="UPDATE ... ";
   } else {
     sql="INSERT ... ";
   }
   try {
     p=c.prepareStatment(sql)
     p.executeUpdate;
   } finally {
     p.close();
     c.close();
   }
Secondo le API "A ResultSet object is automatically closed when the 
Statement object that generated it is closed, re-executed, or ...", ma 
io preferisco sempre chiuderli "a mano" ... Lo so, sono pignolo !


 tra l'altro rigorosamente in ordine......
Non e` vero, personalmente uso sempre e comunque la prima versione,
anche con ODBC
Enrico