Discussione:
[ODBC SQL Server Driver]La connessione è occupata dai risultati di un altro hstmt.
(troppo vecchio per rispondere)
Barbara
2006-11-30 12:42:23 UTC
Permalink
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???
Barbara
2006-11-30 16:40:28 UTC
Permalink
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...
STB_Caos
2006-12-01 00:34:56 UTC
Permalink
Post by Barbara
La cosa si risolve se imposto la struttura in questo modo
WHILE(rs.next()){
b=1;
}
Continuo qui quello che ho scritto nell'altro post, scusate!

Da un articolo nel KBase della MS:

"This error occurs when there are pending results on a statement handle
that is then used to execute another query. This causes a problem when
the ODBC data source is a SQL Server (Microsoft or Sybase) because,
owing to the architectural design, there can be only one active
statement per connection on an SQL Server."

Therefore the SQL Server ODBC driver (SQLSRVR.DLL) cannot allow multiple
active HSTMTs on a single connection handle or HDBC. An active statement
is defined as a statement that has pending results; that is, the whole
result set has not been read from the server. "
Post by Barbara
Perchè con l'if non funzioni e con il while sì, rimane per me un
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...
( '.')
o(('')('') ... ma io sono allergico !!!
Barbara
2006-11-30 16:46:13 UTC
Permalink
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...
Giambo
2006-11-30 17:42:50 UTC
Permalink
Post by Barbara
Nel titolo l'errore che mi viene lanciato...
Il problema è che non capisco da cosa sia generato..questa la
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 !
Barbara
2006-12-01 12:24:23 UTC
Permalink
Post by Giambo
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 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......
Giambo
2006-12-01 17:33:43 UTC
Permalink
Post by Barbara
ma se chiudo il ResulsSet prima di eseguire l'UPDATE..ad occhio non
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 !
--
Giambo - Occhio al filtro antispam _e_ alla whitelist !
Enrico 'Henryx' Bianchi
2006-12-09 19:33:00 UTC
Permalink
Post by Barbara
E' la prima volta che uso un ODBC (non per mia scelta purtroppo) e non
rs.getString(i);
ma solo
rs.getString("NOME CAMPO");
tra l'altro rigorosamente in ordine......
Non e` vero, personalmente uso sempre e comunque la prima versione,
anche con ODBC

Enrico

STB_Caos
2006-12-01 00:16:04 UTC
Permalink
Post by Barbara
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 !!!
Loading...