Newsgroup: it.comp.lang.visual-basic
Titolo: ADO Problema gravissimo

Salve, ho un problema al quale non riesco a trovare una soluzione.
Stanotte alle 3 ero ancora lì a procedere per tentativi.
Ora non so proprio cosa fare, e mi rifugio in questo ng cercando 
disperatamente aiuto da parte vostra.
Il problema è questo:
inserisco un record nel db con le istruzioni
With rsLavori
   .AddNew
   If IsNull(rsNewIDLavoro.Fields("newID_Lavoro")) Then
     .Fields("ID_Lavoro") = 1
   Else
     .Fields("ID_Lavoro") = rsNewIDLavoro.Fields("newID_Lavoro")
   End If
   .Fields("Esercizio") = Esercizio
   .Fields("Mese") = Mese
   .Fields("ID_Cliente") = Cliente
   .Fields("ID_Servizio") = Servizio
   ...
   ecc
   ...
   .Update
End With
Quando vado a posizionarmi sul record con il comando:
     rsLavori.Filter = "[Mese] = " & CStr(Mese) & " AND " & _
                       "[Esercizio] = " & CStr(Esercizio) & " AND " & _
                       "[ID_Cliente] = " & CStr(Cliente) & " AND " & _
                       "[ID_Servizio] = " & CStr(Servizio) & " AND " & _
                       "[ID_Pagina] = " & CStr(Pagina)
non mi viene ritornato alcun record e non riesco ad effettuare la 
variazione, il record fisicamente esiste nel db.
Esco dal programma, lo faccio ripartire, e funziona la modifica.
Lo stesso problema ce l'ho se faccio un eliminazione.
Sia dopo l'inserimento che dopo la modifica faccio un .requery per tutte 
le tabelle correlate.
Il db è un access2000, il provider ado è Jet4.
Qualcuno di voi può darmi qualche dritta?
Se vi può tornare utile, ho un form aperto con diversi controlli 
associati alle tabelle del db, tra cui 3 TrueOleDBGridPro 7
Non utilizzo datacontrol, ma bindo i controlli con la sintassi
Set grdDettagli.DataSource = cLavori.rsLavori_Dettagli
Inoltre spessissimo mi capita di incappare in un altro errore
"Impossibile individuare la riga specificata per l'aggiornamento" ecc...
e vi assicuro al 100% che il record esiste, ho fatto tutti i .requery 
richiesti ad ogni aggiunta od eliminazione di record se non ci credete 
vi invio tutto il progetto, con sorgenti e db.
<Sfogo> Ma a cosa serve ADO? Per tanti anni ho usato sempre DAO ed ho 
sempre avuto il massimo controllo sui db, su quello che accadeva quando 
scrivevo un'istruzione, quando eseguivo una query.
Con ADO non si sa mai cosa sta succedendo, è totalmente incompatibile 
verso DAOe si comporta in maniera assurda ed imprevedibile.
Possibile che voi riuscite ad usare ADO senza avere questi problemi strani?
Inizierò questo progetto da 0 con DAO, ma ora mi serve aggiustarlo 
perché il cliente preme, e non posso perdere altro tempo.
Non mi frega manco più dei soldi ora, voglio solo levarmelo dalle 
orecchie, perché mi sta togliendo la salute.
</Sfogo>

 Salve, ho un problema al quale non riesco a trovare una soluzione.
Prova a mettere cursore adOpenStatic (se sei lato server)
Su quei componenti bound-ati non metto lingua...

 ecc...
a parte tutto il resto, ti rispondo a questo quesito perchč forse ho la
risposta: stai lavorando con un recordset con cursore lato client in cui non č
stata caricata la chiave primaria della tabella di origine, quindi il programma
non riesce piů ad associare tra di loro i record del tuo recordset con quelli
della tabella di origine.
per lo sfogo: ho lavorato sia con dao che con ado, per quanto riguarda il
controllo sul database mi sembra meglio ado, solo che bisogna saper bene come
funziona.
(lupo per favore stai zitto :-) )
--
Salutoni
Sergio

Lupo ha scritto:

Scusami, ho dimenticato di dire come effettuo le connessioni, puň essere 
lě il problema.
Ti posto il codice.
Set cnnDb = New ADODB.Connection
cnnDb.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" 
& App.Path & "\DB.mdb;Mode=ReadWrite;Persist Security Info=False"
cnnDb.Open
Set rsLavori = New ADODB.Recordset
rsLavori.CursorLocation = adUseClient
rsLavori.Open "Lavori", cnnDb, adOpenDynamic, adLockOptimistic

Quando devo eseguire un Filtro, anche se preferisco le query, utilizzo 
un recordset temporaneo sul quale eseguo il filtro e successivamente :
set recordserPrincipale= recordsetTemp

usa refresch


 wrote in message
news:b44k0d$1rnbtq$1...@ID-174464.news.dfncis.de...

Lupo .. la fame del mezzogiorno ti abbaglia.
1) Access2000 supporta solo cursori la server
2) adOpenStatic è l'unico cursore lato client della libreria ADO
.. che poi non ti restituisca errori è un altro paio di maniche ...
per rispondere a NEO :
il problema (credo) non è dovuto al fatto che il tuo cursore non viene
aggiornato, mi sa tanto che quel filter non funzioni bene (perchè converti
in stringhe i numeri ?)...
Prova con una query tipo SELECT Max(Id_Lavoro) As NewId FROM ecc...
Oppure "SELECT TOP 1 FROM Lavori WHER ID_Lavoro = " &
rsNewIDLavoro.Fields("newID_Lavoro")
oppure dopo l'update
RS.Find "ID_LAvoro = " &
rsNewIDLavoro.Fields("newID_Lavoro"),,adSearchForward,adBookMarkFirst
(sempre che ID_Lavoro sia univoco)
Saluti

 (lupo per favore stai zitto :-) )
disclaimer: la sopra esposta battuta è stata scritta prima di leggere il post di
lupo in questo thread, e non si riferisce quindi al consiglio in esso espresso.
La battuta è stata inserita al solo scopo di evitare che lupo, attaccandosi a
questo post, ricominciasse la solita tiritera sulla superiorità di dao rispetto
a ado
Nota a margine: nella solita tiritera di lupo sono presenti parecchi elementi di
verità.
--
Salutoni
Sergio

 1) Access2000 supporta solo cursori la server
mi sento di dissentire....
--
Salutoni
Sergio

 1) Access2000 supporta solo cursori la server
Non entro nel merito (non uso Access), ma mi permetto di esprimere tutto il
mio stupore.
E chi sarebbe il server?
Un thread di Jet?
Mah...
Ciao
Alberto

 2) adOpenStatic č l'unico cursore lato client della libreria ADO
Vero, nel senso che viene trasformato in tale, ma io prima del codice non
sapevo che era lato client. Tu sě?

 mi sento di dissentire....
Ora controllo .. sono info prese dal libro "Programmare ADO 2.0"  ...
visto che non uso Access non insisto .. ma ora provo.
Se qualcuno è più veloce mi faccia sapere.
Saluti

*Fox Mulder* ha scritto:

Mi pare che l'abbiamo già fatto, in almeno 3... :-)

 
Ho creato la query "NewIDLavoro" perché precedentemente il campo 
ID_Lavoro era un Contatore, e credevo che il problema dipendesse da questo.
Ora NewIDLavoro ha un solo campo (newID_Lavoro) che restituisce sempre
MAX(ID_Lavoro) + 1, oppure Null nel caso in cui non vi siano presenti 
record, quindi come è scritta va bene, ma non era cmq il problema del 
contatore, quindi quando avrò tempo eliminerò la query con tutte le 
istruzioni correlate.

 set recordserPrincipale= recordsetTemp
Abbi pazienza, mi spiegheresti perché lo fai?
Ho bisogno di un libro che spieghi un pò in dettaglio ADO.
Magari qualcosa online, perché non ho tempo di andarlo a comprare.

 wrote in message
news:b44lj0$1rulgm$1...@ID-174464.news.dfncis.de...

Già ... sono felice di aver sbagliato ... ho sempre escluso Access per
questa sua incapacità ... a mia discolpa posso solo dire che è stata cattiva
informazione e non ignoranza ... ma il finale è sempre uguale !
Evviva i cursori client side
Evviva Access
Evviva Microsoft
vado a mangiare ... grazie e scuse a tutti.
Saluti

 vado a mangiare ...
Buon appetito.

Il problema è questo...[CUT]...
Non so se può essere lo stesso problema, ma io ho notato che il visual
basic è più veloce di access ad aggiornare il db, e questo porta ad
errori quando si eseguono modifiche nel db e si cerca subito dopo di
lavorare con il db che si pensa modificato ( in realtà proprio perchè
access è più lento non lo è ).
Spero si capisca.

 (lupo per favore stai zitto :-) )
te ne approfitti che sto gia' zitto per conto mio :)
ado sara' flessibile, ma
while true
    e' un cexon (*)
wend
scusa il capslock, ma quanno ce vo'... :>
ciao,
a.sono.gia'.flessibilissimo.io.mi.basterebbe.che.un.sw.fosse.intelligente
(*) trad. petrol. : cesso

 te ne approfitti che sto gia' zitto per conto mio :)
acc.. dovevo dire:
Canidi tutti: a cuccia! :-)
--
Salutoni
Sergio

 Canidi tutti: a cuccia! :-)
Non sono nè lupo nè cane, ma sono rimasto anche io fermo a DAO per scelta.
E adesso? ;-)
Ciao
*Roby*
P.S.
Ma CSSoft sta per CS-Software  oppure sono i Cascade StyleSheets che usa la
OFT (
http://www.oft.gov.uk/default.htm
) ? :-)

 usa la OFT (
http://www.oft.gov.uk/default.htm
) ? :-)
la prima che hai detto.
Deriva dalla società (virtuale) che avevo fondato con un compagno di classe alle
superiori, la SRCS-Software, derivata, con molta fantasia, dalle iniziali dei
nostri cognomi e nomi (nota a margine, il cognome prima del nome, retaggio della
burocrazia scolastica che nomina gli individui con il cognome)
Avevamo anche un business plan, che si basava sulla produzione di un adventure
game per lo spectrum 48K (era l'ottantatre, se non ricordo male).
Avendo perso per strada uno dei due soci, il nome è stato convenientemente
condensato. Tra parentesi, ho incontrato il tizio qualche anno fa, e lui era
arrivato a fare il programmatore per davvero.
--
Salutoni
Sergio

 burocrazia scolastica che nomina gli individui con il cognome)
oggi voglio renderti felice:
bartok bela
non affermo che il musicista sia una pecora, ma che in ungherese il
cognome-nome e' lo standard.
bello, eh ? :)


 E adesso? ;-)
e adesso sei fermo.
non voglio dare giudizi di merito su cose che non conosco in modo approfondito,
però esprimerò lo stesso la mia posizione in merito, se non altro perchè se dico
stupidaggini qualcuno mi correggerà.
Con DAO non puoi aprire recordset disconnessi. Lavorare in questo modo è molto
comodo, ma ti pone problemi di scalabilità e di "locazione" dei dati. Funziona
molto bene per applicativi con pochi utenti, e tutti attestati all'interno di
una lan. Se esci da questi confini incominci ad avere una marea di problemi.
Lavorare in modo disconnesso è più difficile, ma ti costringe a pensare
immediatamente in grande. Addirittura, con 
ado.net
 puoi caricare nello stesso
dataset dati provenienti dalle forme più disparate, effettuare join tra questi
dati, aggiornare i dati sia sulle tabelle di origine sia in altre. Questa
"interoperabilità" tra le varie fonti di dati mi affascina molto, anche se sto
facendo un po' di fatica a fare cose che in DAO (ma in fondo anche in ADO) erano
banali.
--
Salutoni
Sergio

 bello, eh ? :)
curioso, come tutti gli usi e i costumi diversi dai nostri/miei.
--
Salutoni
Sergio

 erano banali.
Ecco. Hai detto tutto.
Aggiungo solo una _mia_ dichiarazione:
ADO, se usato con cursore Static e lato server, funziona bene. Non è
completo quanto DAO (vedi Compact, Find e Filter, etc.), ma funziona bene.
ADOX? Fateci un giro...
E' molto più lento verso qualsiasi cosa, ma possiamo (solo per un momento)
compatirlo (esatto!) solo per il fatto che va verso qualsiasi cosa. Secondo
me, anche alla luce di quel che pare non essere il fratello minore/maggiore,
ma un'altra cosa ancora (
ADO.NET
), ADO non andava neppure pensato (e poi
piantato lì, con le sue palesi carenze). SQL Server? ODBC, lento anche lui,
ma si poteva spendere il tempo di ADO per qualcosa di completo, veloce e
aperto. E definitivo.

 dataset dati provenienti dalle forme più disparate,
Tutto molto bello ma, anche qui, quanto spesso serve? ;-)
Il progresso è bello quando ti facilita la vita, ed adottare le novità solo
perchè sono nuove va contro la mia filosofia di vita del "massima resa,
minimo impiego di tempo".
Ciao
*Roby*

 E adesso? ;-)
canidi robiosi, a cuccia !

 se vuoi rendermi felice sai già cosa devi fare
non se ne parla proprio, caro, sei un uomo serio, posato e sposato :>
ciao

 non se ne parla proprio, caro, sei un uomo serio, posato e sposato :>
carissimo, non fare finta di non capire.
--
Salutoni
Sergio

 Tutto molto bello ma, anche qui, quanto spesso serve? ;-)
forse più spesso di quanto si creda: questa possibilità rende estremanente
facile l'esportazione di una parte dei dati contenuti nel db, e la successiva
importazione da un'altra parte.
Per il resto assolutamente d'accordo: se uno strumento è adatto al compito che
si deve svolgere, non ha senso cambiare strumento solo perchè non è più di moda.
--
Salutoni
Sergio