Newsgroup: it.comp.lang.visual-basic
Titolo: [SQL] ADO e cursori scorrevoli

ADO + SQL Server, adUseServer, adOpenDynamic.
Va bene che il recordset creato non ha bookmarks e quindi non sopporta il
Clone, va bene anche che il RecordCount viene restituito a -1, cioè non
esiste, ma che poi anche, se l'istruzione SQL contiene una "Select
DISTINCT", non sia scorrevole all'indietro, mi sembra devvero troppo.
Il WM ha il mio nome e cognome, lo dia pure a chiunque della M$ voglia
querelarmi per il mio:
UBRIACHI!, anzi, sarò più offensivo: DILETTANTI!
Che riassumano quelli che hanno scritto DAO e Jet!
E che, per piacere, nessuno ci provi a dirmi di usare il cursore lato
Client.
Semmai non si fosse ancora capito, rischia molto.
Piuttosto mi dica il nome di chi l'ha inventato con quelle performaces che
lo faccio correre io più veloce, molto più veloce.

 devvero troppo.
Sei sicuro di no aver fatto qualcosa del tipo:
rs = connessione.execute "SELECT ..." ??? In questo caso se ne frega del
tipo di recordset che avevi impostato e lo riassegna! :(

 tipo di recordset che avevi impostato e lo riassegna! :(
No, no, tutto a posto, infatti senza cambiare una virgola nel programma,
basta togliere DISTINCT (o Group By) e mi restituisce un recset scorrevole.

 ha scritto nel messaggio
news:1oLN8.5290$Kt3.1...@twister2.libero.it...

Prova a postare il codice sia della connessione sia dell'apertura del
recordset.
I cursori lato server dinamici supportano anche i bookmark (ADO2.x ) poi per
il recordcount c'è un piccolo discorso da fare ma ti rimando ai vecchi post
...
Direi di non prendersela tanto ... per tutto c'è una spiegazione logica
(anche se in M$ questa potrebbe sembrare un'offesa:))
Saluti

 (anche se in M$ questa potrebbe sembrare un'offesa:))
Ho moooolti dubbi, comunque sono ... fiducioso.
Ecco il codice:
--------------------
Dim oggetto_database as Object 'Devo fare cosě per far convivere DAO e ADO
Dim rs as Object 'Devo fare cosě per far convivere DAO e ADO
Set oggetto_database = New ADODB.Connection
oggetto_database.Mode = adModeShareDenyNone
Set rs = New ADODB.Recordset
fc="PROVIDER=SQLOLEDB;DATA SOURCE=PORTATILELUIGI;TRUSTED_CONNECTION=YES;USER
ID=;PASSWORD=;DATABASE=ESD00COM;"
oggetto_database.Open fc
lato_cursore = adUseServer
rs.CursorLocation = lato_cursore
tipo_apertura = adOpenDynamic
tipo_lock = adLockOptimistic
sql="SELECT DISTINCT COGNOME, NOME FROM RUBRICA"
rs.Open sql, oggetto_database, tipo_apertura, tipo_lock

 ha scritto
Cos'era, una "toccata e fuga"?

 Cos'era, una "toccata e fuga"?
Se ti consola ho provato e lo fa anche da me... stò investigndo...
Se scopro qualcosa ti faccio sapere! :(

 ha scritto nel messaggio
news:aecbju$1e0i$1...@half.spin.it...

Grazie Lord. Nel senso di quanto ho detto io? (cioè che il cursore NON è
scorrevole?) o di quanto ha detto Fox? (che presume persino i bookmarks).
Aggiungo anche che se (con ADO+SQL Server) si crea una tabella senza alcun
indice (di conseguenza senza chiave primaria/univoca, per esempio facendo
un'INSERTO INTO da una tabella con indice verso una tabella inesistente che
viene così creata al volo, senza indice) il recordset restituito, con le
modalità descritte, ANCHE SENZA DISTINCT, risulterà ForwardOnly, quindi non
scorrevole. Ovvio che, specialmente in SQL Server, gli indici vanno sempre
previsti, ma potrebbe accadere (in casi come quello esemplificato) di
incappare nel problema e, quindi, di dover esplicitamente creare anche
l'indice.

 ha scritto
Allora, va bene che a una certa età l'arteriosclerosi comincia ad
avanzare... ma dimenticarsi di aver trovato la soluzione ad un problema così
e dimenticarsi di averla postata pure sul NG poco più di due mesi fa mi
sembra esagerato! :P
http://groups.google.com/groups?hl=it&lr=&frame=right&th=f0373e028ee0d59f&se
ekm=a8qaij%241p81%241%
40newsreader1.mclink.it#link7
Come potrai leggere comodamente dalla tua stessa risposta (link sopra) per
risolvere il problema bisogna settare il lock su adLockReadOnly per renderlo
scrollabile! ;)
Nella mia lunga ricerca ho notato che: la soluzione non è documentata su
msdn e kb, che sembra una toppa per un brutto bug di ado, che mi ha fatto
impazzire, che sembra che al mondo te ne sei accorto solo tu (dato che
neanche sui NG esteri sono riuscito a trovare nulla a riguardo (o forse non
ho cercato le parole giuste)).
Un Lord Rayden Miiiiiiiiii non ci possooo creeeeedeeeereeee! ;)

 Un Lord Rayden Miiiiiiiiii non ci possooo creeeeedeeeereeee! ;)
Lord, sarei felice di darMI del cretino. No, non basta mettere
adLockReadOnly (se c'è il DISTINCT).
L'unica soluzione che ora ho trovato (ma inficia il tutto) è che, oltre a
mettere adlockreadonly, devo aprire cone adOpenStatic, ma se ne va tutta la
velocità che l'adOpenDynamic mi può dare.
;-)))

 ha scritto
In effetti il mio codice (vedi post di inizio serie) č diventato cosě:
...
sql="SELECT DISTINCT COGNOME, NOME FROM RUBRICA"
        If InStr(UCase(sql), " DISTINCT ") Then
'               In presenza di "DISTINCT" e' necessario assegnare
'               il tipo di lock a adReadOnly per ottenere un cursore
'               scorrevole (con bookmarks)
'               Con adOpenDynamic sarebbe comunque non scorrevole,
'               senza bookmarks (quindi non sopporta Clone e RecordCount)
'               In tal caso cambia modalita' di apertura in adOpenStatic
            tipo_lock = adLockReadOnly
            If tipo_apertura = adOpenDynamic Then
'                   Sarebbe non scorrevole
                tipo_apertura = adOpenStatic
            End If
        End If


 ho cercato le parole giuste)).
Vorrei approfittare per dare un possibile senso al problema.
Un recordset creato con DISTINCT puň presumere, di fatto, un raggruppamento
(come se fosse una GROUP BY). Se č cosě, si puň comprende perchč il
recordset non sia aggiornabile (sola lettura) in quanto uno specifico record
del recordset restituito puň riferirsi a piů records fisici nel database.
Probabilmente DAO (dove il problema non si presenta, almeno con db Access)
traduce la "DISTINCT" in "selezione" (non raggruppamento) e prende, per
esempio, il primo record fra i duplicati, quindi ha comunque un riferimento
fisico al record. Sinceramente non ho verificato se sia aggiornabile o meno.
Comunque sia, non si capisce il fatto del non scrollabile in ADO (in
DAO+Access il recordset pur composto con DISTINCT č sicuramente
scrollabile).

 ne va tutta la velocità che l'adOpenDynamic mi può dare.
Scusa ma imho static e keyset dovrebbero essere più performanti di
dynamic... ci dovrebbe (almeno sulla carta dato che di M$oft non bisogna mai
fidarsi) essere minor tempo speso a controllare la consistenza dei dati! ;)

 scrollabile).
E' un bug del provider o di sqlserver, con mysql+ado funge tutto! :(

 E' un bug del provider o di sqlserver, con mysql+ado funge tutto! :(
Grazie Lord, proverň senza SQLOLEDB, con un altro driver.

 fidarsi) essere minor tempo speso a controllare la consistenza dei dati!
;)
Ne ero convinto anch'io (sui libri sta scritto che Dynamic è il più pesante
in assoluto), fatto sta che (vedi VBDAOADO sul SC), Dynamic è in assoluto il
più veloce, si avvicina alle prestazioni di DAO/Jet., quindi assolutamente
buone.

 ha scritto nel messaggio
news:aecrt5$1q70$1...@half.spin.it...


 E' un bug del provider o di sqlserver, con mysql+ado funge tutto! :(
E' confermato: Non è SQL Server, ma il provider SQLOLEDB
SQL Server+adUseServer+adOpenDinamic con un comando SQL che contiene una
"DISTINCT" produce un recordset non scorrevole usando il Provider SQLOLEDB,
mentre usando il Provider MSDASQL il recordset è scorrevole (anche se non si
pone il tipo di lock a adLockReadOnly). In ogni caso il recordset non ha i
bookmarks e quindi non sopporta il metodo Clone e RecordCount restituisce
sempre -1.
Ora verifico se c'è qualche aggiornamento...

 ha scritto
Ho trovato questo:
http://support.microsoft.com/default.aspx?scid=kb;EN-US;q235566
che non si riferisce espressamente al problema qui citato, ma direi che ci
assomiglia molto.
Le soluzioni proposte sono da circo, come al solito, gią, perchč, per
esempio, MSDASQL non mi consente (non ci sono ancora riuscito, con ADOX) di
sapere di quante chiavi dispone un indice e sono di nuovo fermo.