Newsgroup: it.comp.lang.visual-basic
Titolo: come si verifica se il recordset è aperto (no gestendo l'errore)

ciao
è possibile verificare se il recordset è aperto
qualcosa del tipo
if  Rsdatestare.open then Rsdatestare.close
ciao e grazie
ps
non voglio gestire l'errore

 if  Rsdatestare.open then Rsdatestare.close
C'eri quasi
if rs.state=adstateopen then 'recordset aperto
per la precisione
adStateClosed Predefinita. L'oggetto è chiuso.
adStateOpen L'oggetto è aperto.
adStateConnecting L'oggetto Recordset è in fase di connessione.
adStateExecuting L'oggetto Recordset sta eseguendo un comando.
adStateFetching È in corso un'operazione di fetch per le righe dell'oggetto
Recordset.

molte grazie


attenzione: se hai una funzione che ti restituisce un recordset:
dim rs as ADODB.Recordset
set rs = funzione()
attenzione che se la funzione non ti ha restituito nulla oppure se fai il test
prima di chiamarla otterrai un errore,
poichè
dim rs as ADODB.Recordset
dichiara un puntatore al recordset e non crea l'istanza.
ciao

 if rs.state=adstateopen then 'recordset aperto
Piccola precisazione:
Gli stati Ado vanno testati con maschere di bit.
L'unico stato per cui si può usare l'operatore = è il AdStateClosed.
Quindi, per sapere 'genericamente' se un recordset è aperto:
If CBool(Rs.State AND AdStateOpen) Then
oppure
If Not(Rs.State = AdStateClosed) Then
Ciao
Alberto
-- 
Santo cielo, Magnum, si può sapere cos'è questo baccano?
Higgins, posso spiegarle...
Credo non sia necessario.
Zeus, Apollo, a voi...

 If Not(Rs.State = AdStateClosed) Then
Non metto in dubbio quello che dici, però con l'altro metodo non ho mai
avuto problemi, neppure testando adstateopen
Why?

 mai avuto problemi, neppure testando adstateopen
Credo che il problema lo ottieni solo se interroghi lo stato durante qualche
operazione lunga.
Andrea

 operazione lunga.
Ho capito, grazie

 Why?
Perchè non usi aperture asincrone.
Oppure perchè, in seguito al test, non fai operazioni che possono generare
problemi.
L'utilizzo dell'operatore = non è sbagliato, in certe situazioni.
In generale, cerco di usare metodiche che non richiedano modifiche cambiando
altre cose del codice.
Esempietto: Se un recordset non è aperto, lo apro (caso classico nelle
applicazioni unattended in cui un errore potrebbe aver fatto cadere la
connessione).
Metodo =:
If Rs.state=AdStateOpen then
    'eseguo normalmente
Else
    Rs.Open
Endif
Con un recordset aperto in modalità asincrona, tu potresti passare sull'IF
mentre il recordset si sta aprendo. Lo stato sarebbe AdStateOpen +
AdStateFetching (vado a memoria), quindi l'operatore = darebbe False, tu
andresti sull'Open, e andresti in errore.
Usando uno qualunque di questi due costrutti, invece, il problema non si
porrebbe:
If Not(Rs.State=AdStateClosed) Then
If CBool(Rs.State And AdStateOpen) Then
Tu mi dirai: ma io apro i recordset in modo sincrono, quindi il problema non
si pone.
Giusto.
Ma tu non puoi sapere se domani, per risolvere ad esempio un problema di
lentezza nell'apertura di una form, non ti serva modificare l'apertura da
sincrona ad asincrona. Usando l'operatore = con AdStateOpen, saresti esposto
a diversi rischi, e dovresti verificare nel tuo codice tutti i test che fai.
Usando la maschera di bit, sei a posto a priori.
Ciao
Alberto

 Usando la maschera di bit, sei a posto a priori.
Grazie

....
veramente interessante
grazie a tutti