Newsgroup: it.comp.lang.visual-basic
Titolo: Chi è pratico di ADO ??

Salve- sto iniziando ad imparare ADO e sono alle prese
con alcuni problemini.
1) Non riesco a modificare il valore di un campo in ADO-
dim rs as Recordset
................
rs.Fields("Nome") = "Pippo"
Ottengo un errore del tipo "Operazione non supportata dal
provider"
La transazione riesce perfettamente se sono in modalità
inserimento.....(rs.Addnew)
Quindi devo evidentemente entrare in modalità di Editing...
come fare?
(Ho notato che non esiste un metodo Edit nel Recordset
di ADO, a differenza del DAO. Esiste soltanto una variabile EditMode
è lì che devo operare?)
2) Come si fa a conteggiare i records che ottengo dall'apertura
del cursore? (rs.open "...." )
Ho provato con rs.RecordCount ma ottengo sempre e comunque -1
sia che ci siano record nel cursore sia che non ci siano.
Questo è tutto- grazie 1000 anticipatamente
Francesco
gi...@tin.it

 sia che ci siano record nel cursore sia che non ci siano.
In ADO non è necessario il comando Edit (non esiste proprio, come anche tu
hai notato); il record corrente viene messo automaticamente in edit appena
si cambia il valore di un campo.
Per darti una risposta precisa sul mancato aggiornamento bisognerebbe che tu
dicessi con quale
istruzione apri il cursore e magari che DB e che OLEDB Provider usi.
Poichè ti da -1 su RecordCount presumo che sia di tipo ForwardOnly e
ReadOnly (è quello di default in ADO) che non permette l'aggiornamento.
Apri un cursore lato client o server, di tipo adOpenStatic o adOpenKeyset e
con blocco adLockOptimistic e dovrebbe risolversi; se non è così, riposta
indicando tutto il codice che usi per l'apertura.
Ti segnalo anche che sul sito comune
http://www.murialdo.it/it_lang_vb/
nella sezione Piccole Perle, c'è un tutorial sull'uso degli ADO che potrebbe
aiutarti a superare le prime difficoltà.
Ciao,
   <--< Nik >-->




Grazie della risposta: in effetti ho utilizzato un motore Jet 3.51
per aprire la connessione. Non ho specificato il tipo di cursore
aperto....
connetti = "Provider=Microsoft.Jet.OLEDB.3.51;"
connetti = connetti & "Data Source =" & App.Path & "\dati.mdb"
cn.Open connetti ', , , adAsyncConnect
Set rs.ActiveConnection = cn
Set cmd.ActiveConnection = cn
rs.CursorType = adOpenStatic
connetti = "SELECT * from ........."
rs.Open connetti, , , , adCmdText
rs!Nome = "pippo"
tuttavia anche specificando rs.CursorType = adOpenStatic
prima di aprire il cursore, l'errore (Operazione non supportata
dal privider) persiste lo stesso.
Qualche suggerimento ?
Grazie 1000
Francesco
gi...@tin.it

mmmmm.... ma perche' le caratteristiche del cursore non le specifichi
in fase di apertura del recordset?? Perche', facendo come hai fatto
tu, ho il sospetto che le tue impostazioni vengano sovrascritte da
quelle predefinite all'atto dell'esecuzione del metodo Open.
Dai un occhio a questo helper che ho scritto io.....
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''  OpenRecordset
''  Helper per l'apertura di un recordset come indicato dalla stringa
''  SQL Passata
''
Public Function OpenRecordset(cnsApp As ADODB.Connection, _
                              strSQL As String, _
                              Optional ByVal iCursorType =
adOpenStatic, _
                              Optional ByVal iLock = adLockOptimistic)
As ADODB.Recordset
    Dim cmdApp As ADODB.Command
    Dim rstApp As ADODB.Recordset
 
    Set cmdApp = New ADODB.Command
    Set rstApp = New ADODB.Recordset
 
    cmdApp.ActiveConnection = cnsApp
    cmdApp.CommandType = adCmdText
    cmdApp.CommandText = strSQL
    rstApp.CursorLocation = adUseClient
    rstApp.Open Source:=cmdApp, _
                CursorType:=iCursorType, _
                LockType:=iLock
 
    Set cmdApp = Nothing
    Set OpenRecordset = rstApp
End Function
Prima che qualcuno dica qualcosa.... il passaggio per un oggetto
command e' necessario perche' non facendolo (e fornendo la stringa SQL
direttamente al metodo open dell'oggetto recordset) ho avuto alcuni
fastidiosi problemi nell'accesso a DB2 su AS/400 via ODBC.
Ciao!
Luca Menegotto.
PS. Parlo da ignorante in questo caso, quindi.... sei sicuro di poter
aprire la connessione in modo adAsyncConnect col data provider
indicato? io non l'ho mai fatto.......


Proverò il tuo helper senz'altro- grazie x il suggerimento.
Per quanto riguarda  adAsyncConnect, devo essermelo portato
appresso da qualche vecchio esempio- purtroppo non ho ancora
installato la libreria MSN, quindi x quanto riguarda i metodi di Ado
vado un po' a naso, secondo quello che ho imparato utilizzando DAO.
Comunque in DAO, ricordo che x modificare un campo dovevo trovarmi
in fase di Edit oppure di Addnew. Penso che  anche in Ado sia la stessa
cosa- se faccio ad esempio
rs.Addnew
rs!Nome = "Pluto"
l'operazione riesce perfettamente-quindi a occhio e croce penso che
se riuscissi ad entrare in modalità di Editing potrei anche lì modificare
un singolo campo.
Comunque sto aspettando i CD delle librerie MSN- ti farò sapere se correggo
l'errore.
Grazie
Francesco
gi...@tin.it

No, in ADO il principio e' diverso; a patto che tu abbia la facolta'
di farlo (recordset aperto nel modo giusto e modificabile) tu sei
SEMPRE in modo edit; l'AddNew tiserve solo per crearti un deposito per
il tuo nuovo record (semplicistico, ma prendilo come viene)
Ciao.
Luca Menegotto.
