Newsgroup: it.comp.lang.visual-basic
Titolo: Ho risolto tutto!





Allora, ringrazio tutti per l'aiuto che mi avete 
dato.


 


Posto come ho risolto il problema delle query con 
Access 2000 e ADO 2.6:


 


Il mio problema era quello di rendere un Recordset 
ADO leggibile e scrivibile dopo l'esecuzione di una query.


 


1) Quando la query non restituisce alcun record, il 
recordset non viene aperto (quando si tenta di aprire l'instruzione SQL con il 
metodo Open di Recordset);


2) Quando si manda in esecuzione un comando 
(parametrizzato o no) ADO con Execute il Recordset ritornato è sempre Aperto 
(anche se vuoto) ma la sua proprietà Locktype è impostata su 
ReadOnly.


 


In quest'ultimo caso, però, c'è la soluzione: basta 
clonare il recordset restituito da Execute in un altro recordset, chiuderlo, 
impostare Locktype su un diverso valore e poi riaprire il Recordset clonato; il 
vecchio non serve più! Questo è l'abbozzo della procedura che ho 
creato:


 




Public Function 
  ApriRecordset(SQLString as String) as ADODB.Recordset


    Dim conn 
  As New ADODB.Connection, cmd As New ADODB.Command


    Dim rs 
  As New ADODB.Recordset, rs2 As New ADODB.Recordset
    
  
    On Error Resume 
  Next
    
    With 
  conn
        .CursorLocation = 
  adUseClient
        .ConnectionString = 
  "driver={Microsoft Access Driver (*.mdb)};dbq=database.mdb"


        .Open
    
  End With
    
    With 
  cmd
        Set .ActiveConnection = 
  conn
        .CommandText 
  = SQLString
        .CommandType = 
  adCmdText
    End With
    
  
    Set rs2 = cmd.Execute
    
  
    Set rs = rs2.Clone
    
  rs.Close
    rs.LockType = adLockBatchOptimistic   
  ' o quello che volete!
    rs.Open
    
  
    Set ApriRecordset = rs
End 
Function


 


So quello che state pensando: non si puo fare 
anche senza clonare il Recordset: risposta NO! Non ne conosco l'arcano motivo ma 
non ne ho idea! Cmq spero che possa servire a 
qualcun'altro...


 


Byez, Axel


 


PS - Scusate se posto in HTML ma avevo 
bisogno delle impostazioni del carattere!



 ha 
  scritto nel messaggio 
news:mWQ97.77433$Qf6.5...@news2.tin.it
...


 ha scritto nel messaggio
news:mWQ97.77433$Qf6.5...@news2.tin.it...
Allora, ringrazio tutti per l'aiuto che mi avete dato.
CUT
Una cosa se funziona va sempre bene....però permettimi credo ci sia stato un
equivoco di fondo...
Il metodo execute (almeno a sentire la guida di VB  ) serve ..cito:
"Metodo Execute: esegue la query,l'istruzione SQL o la stored procedure
specificata dalla proprietà commandText"
il fatto che ti riporti un recordset E' SOLO UN DETTAGLIO....nel senso che
intravedo per tale istruzione non lo scopo principale di aprire recordset ma
di "aggieggiare" in remoto via SQL un database...
A conferma anche se non lo dice espressamente l'Help fa supporre che ritorni
un recordset ReadOnly e se la query non restituisce righe il recordset torna
chiuso...
Tradotto (secondo me) significa che VB ti da possibilità di intervenire via
SQL su un DBserver e ti copia il risultato A CONFERMA in un recordset
...addirittura se fai qualcosa che non ritorna righe il recordset neanche lo
crea!
perchè poi complicarsi la vita con l'execute:
conn la setti alla tua stringa di connessione
Function apriConnessione() As ADODB.Connection
Dim tmpC As New ADODB.Connection
tmpC.ConnectionString = conn
On Error Resume Next
Do While True
    tmpC.Open
    If Err <> 0 Then
        If MsgBox("Accesso ai dati non valido" & vbCrLf & "Ritento la
connessione ?" & vbCrLf & conn, vbInformation + vbYesNo) = vbNo Then
            End
        End If
    Else
        Exit Do
    End If
Loop
On Error GoTo 0
Set apriConnessione = tmpC
End Function
Function apriRecordset(CONN As ADODB.Connection, _
                        xSql As String, _
                        Optional curLocazione As Integer = adUseClient, _
                        Optional curTipo = adOpenKeyset, _
                        Optional lockTipo As Integer = adLockOptimistic)
Dim rs As New ADODB.Recordset
rs.CursorLocation = curLocazione
rs.LockType = lockTipo
rs.CursorType = curTipo
On Error Resume Next
 rs.Open xSql, CONN
If Err = 0 Then
    Set apriRecordset = rs
Else
    MsgBox "Errore in apertura" & vbCrLf & Error
    Set rs = Nothing
    apriRecordset = Nothing
End If
On Error GoTo 0
End Function
Questo è il codice che uso nei miei programmi (integrato + o -) e funge alla
perfezione con l'SQL
bye man!
:-)

Scusa se non idento ma probabilmente devi leggere i post precedenti per dare
un giudizio. Cmq uso ADO 2.6 perché mi serve l'accesso a SQL Server 2000 e
ne il 2.0 ne il 2.5 non può accedervi.
Byez, Axel!

 perchè poi complicarsi la vita con l'execute:
A me lo chiedi? Vallo a spiegare ai genii della Microzozz!

OK! Grazie per la dritta, lo proverò senz'altro! Magari con una versione
precedente di ADO :-)
Denghiu, Axel!