Newsgroup: it.comp.lang.visual-basic
Titolo: [VB.NET] Balena: test dello stato di una connessione

Ciao.
Sto leggendo il capitolo relativo ad 
ADO.NET
 del libro Programmare Visual
Basic.NET di Francesco Balena.
C'č un esempio in cui testa la proprietą CurrentState della connessione
all'interno della procedura StateChange
Private Sub Cn_StateChange(ByVal sender As Object, ByVal e As
System.Data.StateChangeEventArgs) Handles Cn.StateChange
        If (e.CurrentState And ConnectionState.Open) <> 0 Then
            MessageBox.Show("Cn_StateChange = " & e.CurrentState.ToString())
        ElseIf e.CurrentState = ConnectionState.Closed Then
            MessageBox.Show("Non aperto")
        End If
End Sub
La curiositą che mi č venuta č questa:
come mai usa If (e.CurrentState And ConnectionState.Open) <> 0 invece di If
e.CurrentState = ConnectionState.Open?
Le due istruzioni sono equivalenti o c'č qualcosa di diverso?
Grazie.
Skysurfer

 Le due istruzioni sono equivalenti o c'è qualcosa di diverso?
c'è qualcosa di diverso: la proprietà currentstate è una "maschera di bit",
quindi per testare una singola proprietà devi fare un "and" per vedere se il
relativo bit è "alzato". Questo non vale per la proprietà closed in quanto non
prevede bit alzati (=0) e quindi la tecnica dell'and non è applicabile.
Però, se non ricordo male, questo è chiaramente detto nel libro.
--
Salutoni
Sergio

 Le due istruzioni sono equivalenti o c'è qualcosa di diverso?
Non conosco .Net, ma anche in Ado occorre effettuare il test in quel modo.
Lo stato degli oggetti Ado è una maschera di bit.
Ad esempio, tu potresti avere un recordset aperto ma che sta scaricando
(soprattutto se apri in modalità asincrona), per cui lo stato non è nè
aperto nè fetching, ma una combinazione dei due.
L'unico caso in cui è possibile (anzi, è doveroso) effettuare un controllo
di stato con l'operatore = anzichè l'AND binario, è il caso di
AdStateClosed, in quanto vale 0 ed è documentato che varrà sempre 0.
Ciao
Alberto


In effetti può darsi che sia scritto in qualche parte precedente del libro,
ma ho iniziato a leggere il capitolo 20 saltando temporaneamente i capitoli
dal 7 al 19 e quindi probabilmente mi sarà sfuggito.
Grazie e ciao
Skysurfer


Urc... allora ho sempre sbagliato anche in ADO, perchè ho sempre usato
State=AdStateOpen
Grazie per la risposta.
Ciao
Skysurfer

 State=AdStateOpen
Male, molto male...
in generale, si usa:
If CBool(Rs.State AND AdStateOpen) Then
per sapere se è aperto (o qualunque altro stato tranne il chiuso).
If Rs.State=AdStateClosed Then
per sapere se è chiuso
Per sapere se si è in uno stato qualsiasi, ma non chiuso (ad esempio, se
devi chiudere un recordset per poterlo poi riaprire in altro modo):
If Not (Rs.State=AdStateClosed) Then
Ciao
Alberto

 Male, molto male...
Beh... in fondo non mi sembra questa grande tragedia visto che:
[Guida di .Net]
"OleDbConnection e SqlConnection supportano solo i valori Open e Closed di
ConnectionState."
Ciao.
Skysurfer


Già. Ma si parlava di "Oggetti Ado", non solo di connessioni.
E comunque esiste anche ODBC, altri provider, eccetera, quindi le cose vanno
fatte in modo da essere compatibili.
E Recordset e Command supportano tanti altri stati. Il ragionamento è lo
stesso (tant'è che nei miei esempi usavo proprio un recordset...).
Ciao
Alberto


Vero!
Grazie, ne terrò presente per il futuro.
Ciao
Skysurfer