Newsgroup: it.comp.lang.visual-basic
Titolo: adUseServer VS adUseClient

Ciao a tutti.
Qualche giorno fa ho dovuto modificare la proprietą da adUseClient a
adUseServer nell'interfacciamento con un database Mysql gestito con le
ADO via OLEDB in quanto adUseClient creava problemi quando recuperavo
dalle tabelle dei valori con gli apici. Modificando tale parametro
risolvevo questo tipo di problema, ma quando ho fatto per inserire un
record:
    rst.AddNew
    rst!campo= "Ciao"
    rst!Update
questo non č stato inserito ma č stato modificato il recordset corrente.
Rimettendo adUseClient mi inserisce il record, ma mi rimane il problema
del reperimento dei dati con apici.
Qualcuno ha qualche idea?
Ringrazio anticipatamente per le risposte
Max
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 Rimettendo adUseClient mi inserisce il record, ma mi rimane il problema
Che cursore hai utilizzato lato server ?
Se hai utilizzato un Dynamic non dovresti avere nessun problema, ma se hai
utilizzato un KeySet, i nuovi record non vengono visualizzati (solo le
modifiche) per cui devi fare un requery.
Sottointeso che la sintassi correttatta è rst.Update
Sicuro che tra l'addnew e l'update non ci sia qualche MoveX oppure qualche
rollback di transazione oppure qualche gestore di errore ..
meglio se posti il codice
Saluti

 meglio se posti il codice
Eccolo:
CONNESSIONE AL DATABASE
   Public conn As ADODB.Connection
   Set conn = New ADODB.Connection
   conn.Provider = "MySQLProv"
   conn.Properties("Data Source") =
"DSN=max;SERVER=localhost;DB=gestio;uid=root;pwd=;port=3306"
   conn.Open
PROCEDURA CHE APRE UN RECORDSET
Public Sub ApriRecordset(ByRef r As ADODB.Recordset, ByVal S As String)
On Error GoTo abc
    Set r = New ADODB.Recordset
    r.CursorLocation = adUseServer
    r.Open S, conn, adOpenStatic, adLockOptimistic
    ' se ci sono problemi modificare adOpenDynamic in adOpenStatic
Exit Sub
abc:
    MsgBox err.Description
End Sub
PROCEDURA CHE INSERISCE IL RECORD
Private Sub bsave_Click()
On Error GoTo errsave
Dim r As ADODB.Recordset
ApriRecordset r, "select * from anartmag where cdmag=" + CStr(magazzino)
r.AddNew  <---- NON FUNZIONA!! MI MODIFICA IL RECORD CORRENTE!!
r!cdpar = Me.lstArticoli.List(Me.lstArticoli.ListIndex)
r!cdmag = magazzino
r!cdubi = Me.txtUBI.Text & ""
r!siscc = Me.txtSCORTA.Text & ""
r!desis = Me.txtDESIS.Text & ""
r!cdfoa = GetCodiceFornitore(ldati(0).Caption)
r!cdter = GetCodiceTerzista(ldati(1).Caption)
r.Update
BottoniInsMod False
Exit Sub
errsave:
    MsgBox err.Description
End Sub
E' possibile che la libreria di cursori lato server non funzioni 
correttamente con l'AddNew?


> rollback di transazione oppure qualche gestore di errore ..
Attenzione, se non mi ricordo male  my sql non supporta rollback di
transazione
---
Carlo Alberto
xsiem.xta...@tin.it
  (togli le x)
--
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (
http://www.grisoft.com
).
Version: 6.0.476 / Virus Database: 273 - Release Date: 24/04/2003

 correttamente con l'AddNew?
E' possibilie che un provider non accetti cursori lato server (molto
improbabile però .. non conosco MySQL), ma che sia in grado solo di fornire
snapshot ai client.
Esattamente qual'è l'error retituito ?
Saluti

 Esattamente qual'è l'error retituito ?
Nessun errore. Solo l'AddNew non funziona e in pratica mi modifica il
record corrente
(il primo restituito dopo l'apertura del recordset)


 lato client.
Dubito, sinceramente dubito. Il problema è semmai il contrario: lato client
puoi aprire solo cursori statici, lato server puoi fare quello che vuoi.
Salutoni da un
Sergio che è tornato dalle ferie.

 wrote in message
news:e930d225036b416bf56...@mygate.mailgate.org...

Non riesco a capire ...
dopo l'aggiunta del record al recordset che operazioni compi ? (farai un
MoveFirst last next o che ne so un requery)
prova a fare una RecordCount prima dell'addnew e uno dopo l'Update ... mi
pare proprio impossibilie che esegua entrambi i metodi e che non ti permetta
l'inserimento.
Hai controllato le proprietà CursorX e LockType, sono in dubbio sul fatto
delle modifiche automatiche : ti hai imposto un cursore client o lo ha
lasciato server con un Dynamic ?
Fammi sapere

 puoi aprire solo cursori statici, lato server puoi fare quello che vuoi.
RS.Cursorlocation = adUseServer
RS.Open CursorType:=adStatic
cosa succede ?
1) diventa CursorLocation = Client
oppure
2) CursorType diventa adDynamic
non saprei e non ho voglia di provare :)
Saluti

 2) CursorType diventa adDynamic
3) resta server e resta static.
senza provare
Salutoni
Sergio

 Fammi sapere
Il problema č a monte. L'AddNew aggiunge un record vuoto, ma dopo aver
fatto la
chiamata questo non avviene e resto praticamente sul record corrente.
E' come se il metodo AddNew non avesse effetto.


 E' come se il metodo AddNew non avesse effetto.
Non č la soluzione ma prova ad utilizzare questa tecnica:
rs.addnew array(rs(0),rs(1)),array(valore1,valore2)
e testare l'eventuale errore


 3) resta server e resta static.
Azz... non credevo che esistessero cursori lato server static .. ora li
provo
Grazie Sergio

 provo
Come ti ha detto Sergio, il lato server supporta tutti i tipi di cursori (al
limite li trasforma in KeySet), il lato Client, comunque venga dichiarato il
cursore, lo trasforma in Static che, IMHO, è l'unico, in ogni lato,
consigliabile (salvo esigenze particolari).
Approfitto per ricordare un ritornello evidentemente poco "orecchiabile":
Prevedere, in ogni caso, almeno un indice con chiave univoca per ogni
tabella.

 tabella.
I buoni consigli sono sempre bene accetti
Quello che non capisco è a cosa possa servire uno static lato server.
Se lavoro lato server di certo uso un KeySet (al massimo un Dynamic) che
senso ha fare uno snapshot e poi tenerlo sul server ... i dati sono già sul
server perchè crearne una copia ?
Saluti

 server perchè crearne una copia ?
Io non ho parlato di Snapshot (in DAO, sarebbe ForwardOnly in ADO)... che
consentono solo lo scorrimento avanti

 (il primo restituito dopo l'apertura del recordset)
L'ipotesi piů probabile č che con le istruzioni che esegui dopo l'AddNew e
prima di Update si scateni qualche evento che sposta il record corrente e
quindi viene annullata l'AddNew.
Siccome ADO non vuole l'Edit per porre esplicitamente in variazione un
record (grande sciocchezza, IMHO) il successivo Update si comporta come un
"fine variazione, registra".
Se ti modifica il record corrente č praticamente certo č che l'azione che
avviene da qualche parte č un MoveFirst o una ricomposizione del recordset
(con automatico posizionamento sul primo record).
Se non trovi il problema (attenzione, non č detto che l'esecuzione
passo-passo riproduca esattamente la reale sequenza delle operazioni), fai
una prova: Svuota completamente quella tabella, in modo che non contenga
record e ripeti le istruzioni. Otterrai un errore per "assenza di record
corrente sull'Update"

 corrente sull'Update"
In questo modo il recordset è vuoto e nel momento dell'AddNew viene
generato
un errore generico "one or more errors occurred during processing of
command",
cosa che non avviene quando il recordset non è vuoto e allora mi va in
modifica.
Dubito fortemente che tra la AddNew e l'Update ci sia qualcosa che fa
andare
in update piuttosto che in insert: eseguo solo assegnamenti ai campi per
poi
alla fine fare l'update.
Il fatto strano è che si comporta come modifica anzichè come inserimento
lasciandomi ritenere che ci sia qualche problema col lato server di
mysql
con l'AddNew...
Tu che dici???


 consentono solo lo scorrimento avanti
Direi di no ... Snapshot DAO = Static ADO ...
lo snapshot è una fotografia dei dati, proprio come il cursore static.
(ma di certo non voglio impuntarmi .. come al solito mi aspetto smentite)
il ForwardOnly non è proprio un cursore ma comunque è quello che preferisco
(è l'unico che uso lato server) e di certo non è statico.
Comunque sono contento che esita un cursore in più (rispetto a quelli che
conoscevo io) anche se non ne trovo una grossa utilità.
Saluti

 mysql
Non conosco mysql, ma credo che un problema del genere sarebbe già saltato
fuori, no?!
Fai un programma di prova (nuovo e completamente vuoto!, non lo stesso) che
si limita ad aprire la stessa connessione e stesso recordset. Segue un
AddNew e l'assegnazione di qualche campo, poi Update. Facci sapere se va,
ovvero se aggiunge il record e non (come ora) modifica il corrente.
Anticipo: Se va devi concentrarti sul tuo programma e la mia ipotesi di
qualche evento che scatta e sposta il puntatore sul recordset dopo l'AddNew
assume maggior consistenza...

 conoscevo io) anche se non ne trovo una grossa utilità.
Lo Static dici? Ripeto: E' l'unico che si lascia utilizzare senza troppi
problemi.

 assume maggior consistenza...
Purtroppo ho lo stesso problema. Posto il codice che peraltro non 
varia da quello precedente. Tento di fare un inserimento di valori della
chiave primaria, ma, come nel caso precedente, va in update sul primo
record.
Public conn As ADODB.Connection
Public Sub ApriRecordset(ByRef r As ADODB.Recordset, ByVal s As String)
On Error GoTo abc
    Set r = New ADODB.Recordset
    r.CursorLocation = adUseServer
    r.Open s, conn, adOpenStatic, adLockOptimistic
Exit Sub
abc:
    MsgBox Err.Description
End Sub
Private Sub Command1_Click()
Dim r As ADODB.Recordset
ApriRecordset r, "select * from anartmag"
r.AddNew
r!cdpar = "PIPPO 2"
r!cdmag = 99
r.Update
End Sub
Private Sub Form_Load()
  Set conn = New ADODB.Connection
    conn.Provider = "MySQLProv"
    conn.Properties("Data Source") =
"DSN=max;SERVER=localhost;DB=gest;uid=root;pwd=;port=3306"
    conn.Open
End Sub


Ieri ho letto il tuo messaggio è ho fatto delle prove ulteriori, anche a 
me utilizzando il cursore lato server quandi faccio l'addNew mi 
incrementa il valore del contarore e inserisce i dati del primo recordset.
Perchè non usi ODBC.
Tra l'altro ho fatto delle prove di velocità e risula essere più veloce 
nel caricare una tabella in un recordset ado.
Giò

 Public Sub ApriRecordset(r As ADODB.Recordset, s As String)
Se ancora non va credo di poter dire che si tratta di un problema di MySQL o
del suo corretto uso. Prova a sentire su qualche NG di MySQL (o anche su
it.comp.software.database)

 it.comp.software.database)
Eh eh... Ti ringrazio comunque! Anch'io sono prossimo a pensare di
cambiare metodo.
E cioè di usare istruzioni sql che funzionano bene (anche se dovrò
rivedere
tutti gli inserimenti fatti). 
Avrai notato che c'è un post di Giò che ha verificato ciò che dicevo,
quindi
qualche problema in giro c'è...
Grazie di nuovo!


 nel caricare una tabella in un recordset ado.
Non conoscendo MySQl, non insisto, ma da quel che si sente in giro,
generalmente i provider per ADO sono (per quanto lenti possano essere) più
prestanti di ODBC...

 wrote in message
news:3EAE32B8...@tiscali.it

Meno male che non sono l'unico ad avere questo problema. 
Pensavo piuttosto di usare come alternativa istruzioni sql che ho potuto
sperimentare che funzionano bene. 
Avrei tuttavia preferito risolvere questo problema :(


 
  Non conoscendo MySQl, non insisto, ma da quel che si sente in giro,
  generalmente i provider per ADO sono (per quanto lenti possano essere) più
  prestanti di ODBC...
Io preferisco provare, ho appena terminato lo sviluppo di un software 
per un assicuratore e ho deciso di usare MySql (tra l'atro non e MS!!)al 
posto del solito Access. I oltre c'è la possibilità di installare il 
database su una macchina Linux e accedere de "Client" windows.
Per la velocità ho fatto un test sul campo, con l'ausilio di un tool ho 
popolato una tabella con 10000 record (in automatico).
Ho impostato la stringa di connessione con ODBC, ho creato un form con 
tutti i campi della tabella e ho aperto il form ordinando i dati per chiave.
Idem con OLEDb.
Ho ripetuto una decina di volte l'apertura alternandole e ODBC è 
risultato più veloce.
Giò

 del reperimento dei dati con apici.
Anch'io uso mysql ed ho lo stesso problema con l'addnew.
Mettendo adUseClient invece l'addnew funziona tranquillamente ? Non ci avevo 
provato.
Alla fin fine ho preso l'abitudine a scrivere tutto il SQL.
Ciao,
        Fabrizio

 Alla fin fine ho preso l'abitudine a scrivere tutto il SQL.
Sono giunto alla conclusione che č la cosa migliore. Dicono che sia
addirittura 30 volte piu performante dell'uso dei recordset...
Ciao

 addirittura 30 volte piu performante dell'uso dei recordset...
Si, č una scheggia.
Ciao,
        Fabrizio