Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Settaggio ADO Properties

ADO+SQL Server, via SQLOLEDB, VB6 SP5
Qualcuno, per grande favove, mi può scrivere il codice per settare una
_qualsiasi_ proprietà di un oggetto Recordset SQL Server (non Access), lato
Server (adUseServer), qualsiasi modalità di apertura (meglio se
adOpenDynamic) e di lock, vuoi prima di aprirlo, vuoi dopo averlo aperto?
Non ci riesco. Prima di aprirlo non vedo proprietà, dopo averlo aperto le
vedo tutte ma mi sembrano di sola lettura.
Il problema è questo: Determinate operazioni non paiono funzionare come
vorrei e mi sembra che possa dipendere dallo stato di alcune proprietà che
vorrei provare a cambiare. Prima di entrare nel merito delle problematiche e
delle specifiche proprietà, mi piacerebbe sapere come si possono cambiare le
proprietà stesse.
Facendo rs.Properties("nome della proprietà")=True
mi dice che l'operazione non è consentita se l'oggetto è aperto.
Se faccio la stessa cosa prima di aprire il recordset, mi dice che non trova
l'elemento (Il Count dell'insieme Properties è infatti =0)
Non so più dove sbattere la testa. Mi sta bene anche (oddio, si fa per dire)
un (per esempio): "Le proprietà con cursore lato server non si possono
cambiare". Grazie.

La problematica che vorrei risolvere è la seguente:
Con le modalità ADO 2.tutti+SQL Server 7.0 SP2, via SQLOLEDB, cursore
adUseServer, adOpenDynamic, adLockOptimistic,
1) se apro un recordset con "Select * from Tabella" e aggiungo un record
(AddNew/Append), vedo regolarmente il nuovo record (anzi, è quello corrente)
nel mio recset.
2) se apro un recordset con "Select * from Tabella Where ..." (supponiamo
che questa mi restituisca un solo record) e aggiungo un record
(AddNew/Append), subito dopo l'Update il nuovo record è apparentemente in
vista, ma facendo riferimento a eventuali campi memo (Text in SQL Server) o
a incremento automatico, questi segnalano un errore (vedi topic "[ADO]
Strano comportamento) e non risultano quindi "riferibili".
La soluzione sta nel posizionarsi esplicitamente sul record appena aggiunto,
ma, non potendomi permettere di fare una Select sullo stesso oggetto
recordset per selezionare solo quel record, ho pensato di fare una bella
MoveFirst e tante MoveNext fino a EOF per cercare il record appena aggiunto
di cui conosco i valori dei campi che lo identificano univocamente. A parte
la lentezza, che succede? Che faccio MoveFirst e trovo regolarmente il
record che la Select/Where iniziale aveva restituito, non è quello che
cerco, verifico l'EOF che è chiaramente falso, faccio MoveNext e finisco in
EOF (esatto!), come se il record appena aggiunto non  fosse stato inserito
nell'oggetto recordset in memoria (ma su disco c'è!).
3) Il comportamento descritto al punto 2 è invece regolare (cioè si comporta
come al punto 1) se (pur con una Select/Where) uso adOpenKeyset.
Allora ho pensato che ci fosse qualche proprietà che non inserisse le nuove
righe nel recordset e mi sono fatto l'elenco delle Properties e del loro
stato/valore con adOpenKeyset e le ho confrontate con lo stesso elenco
ottenuto con adOpenDynamic. Alcune differenze sono sintomatiche e volevo
"provare" a cambiare, magari una ad una, le proprietà diverse per "emulare"
il corretto comportamento del adOpenKeyset.
Queste le proprietà e le differenze (F=Falso, V=Vero), rispettivamente
adOpenDynamic e adOpenKeyset (sempre lato server), segno con un asterisco
quelle che mi sembra possano avere  un riferimento/responsabilità al
problema descritto:
*IRowsetResynch F/V
IRowsetScroll F/V
Use Bookmarks F/V (e questo lo sapevo)
*Hold Rows F/V
Immobile Rows F/V
Literal Bookmarks F/V (come sopra per Use Bookmarks)
Others' Changes Visible V/F (tipico del dynamic)
*Server Data in Insert F/V
Si noti inoltre che la proprietà "Own Inserts Visible" è Vera per entrambi,
se può contare qualcosa.
Grazie ancora per ogni idea.