Newsgroup: it.comp.lang.visual-basic
Titolo: [?] ADO e MySQL

Ciao a tutti.
Sto utilizzando MySQL e ADO (attraverso MyODBC) per una mia nuova
applicazione.
Tralasciando il resto della struttura del DB, ho una tabella chiamata
tblArticoli che (stranamente :D) contiene la mia anagrafica articoli.
Questa tabella viene associata direttamente ad un rsArticoli
(recordset ADO) con i seguenti parametri:
adLockReadOnly, adOpenForwardOnly,  ConnectClientSide,
adCmdTableDirect.
Il problema è che all'apertura del form apro anche il recordset e
impiega circa 3-4 secondi nonostante i record siano appena 35000.
C'è un modo per ottimizzare il recupero dei dati?
Via debug ho visto che il tempo lo "perde" proprio in apertura del
recordset.
Specifiche:
OS Windows 2K Sp3
VB 6 Sp5
MySQL server versione 3.23.54-max.nt
MyODBC Versione 3.51.05
Tabelle tipo MyISAM
Query eseguite tutto in locale
Il DNS è di tipo utente e le opzioni specificate sono: Don't Optimize
Column Width; Use Compressed Protocol (ma ho provato anche a togliero
senza miglioramenti); Return Matching Rows; Change BIGINT Columns to
INT.
Ringrazio anticipatamente chi saprà darmi una mano!
Ciao
Aran Banjo
<math> 2 + 2 = 5 for sufficiently large values of 2</math>

Query eseguite tutto in locale
Mi sono dimenticato:
ADO versione 2.7


 C'è un modo per ottimizzare il recupero dei dati?
Prova con cursore lato Server

 ha scritto nel messaggio
news:avjlg0$ggapv$1...@ID-174464.news.dfncis.de...

Giusto.
E prova anche con MyOleDb, anzichè MyODBC. Ho l'impressione che vada meglio.
Ciao
Alberto

Prova con cursore lato Server
Provato con cursore lato server, ma migliora praticamente di un
decimilionesimo di secondo.
Provo a vedere se riesco a scaricare MyOleDB.
Grazie


Nell'A.D. Thu, 09 Jan 2003 11:28:25 GMT, 
eri...@libero.it
 (Aran
Banjo) scrisse:
mmm, dal sito di MySQL non si può scaricare MyOleDB, o sbaglio?
sono andato nel sito del produttore, ma (errori di script a parte) non
si riesce a scaricare...
Mah!
Ciao
Aran Banjo


 Provo a vedere se riesco a scaricare MyOleDB.
Ho letto adesso una cosa: tu apri il recordset all'apertura del form.
Questo mi fa supporre che nella stessa sub avvenga anche l'apertura della
connessione.
Sei sicuro che non sia la connessione a prendere tutto il tempo?
Prova a mettere un
debug.print format(now(),"hh:mm:ss.nnnnn")
prima dell'open della connection, prima dell'apertura del recordset e dopo
l'apertura del recordset.
Ciao
Alberto

 si riesce a scaricare...
http://www.mysql.com/downloads/download.php?file=Downloads/Win32/MyOLEDB3.ex
e
Provato adesso, funziona benissimo.
Ciao
Alberto

 decimilionesimo di secondo.
Con ADO e OLEDB verso Access e, particolarmente, verso SQL Server,
specialmente con recordset lunghi e con molti campi, ti garantisco che la
differenza fra lato Server e lato Client č semplicemente stratosferica
(comunque giustificata dalle caratteristiche intrinseche del lato del
cursore), anche se, alla fine, ADO č molto piů lento di DAO+Access(Jet).
Credo che, come ha suggerito Albe, tu debba provare OLEDB al posto di ODBC e
senza DNS (ovvero passando tutti i parametri di collegamento e accesso alla
connessione)

Alberto
Aran Banjo


 che tiene aperta la connessione finché non esco dal programma.
Prova a postare il codice con cui apri il recordset.
Sono curioso anche io, visto che a volte uso MySql.
Ciao
Alberto

Alberto


Prova a postare il codice con cui apri il recordset.
[CUT]
Ecco il codice, fa parte di una classe e lo uso inserito in una DLL.
<-------------- CODE ------->
Public Function GetRS(SQL As Variant, Optional LockType As
ADODB.LockTypeEnum = adLockReadOnly, Optional CursorType As
ADODB.CursorTypeEnum = adOpenStatic, Optional Disconnected As Boolean
= True, Optional ConnectType As ADOConnectType = ConnectClientSide,
Optional CommandType As CommandTypeEnum = adCmdTableDirect) As
ADODB.Recordset
    On Error GoTo LocalError
    LastSQL = CStr(SQL)
    Set GetRS = New ADODB.Recordset
    With GetRS
      .Open CStr(SQL), ConObject(ConnectType), CursorType, LockType,
CommandType
        If Disconnected Then Set .ActiveConnection = Nothing
    End With
Exit Function
LocalError:
    LastError = Err.Source & " (" & Err.Number & ") " &
Err.Description
End Function
<-------------- /CODE ------->
Nel mio programma ho l'oggetto oMega che è aperto all'avvio con le
impostazioni della connessione corretti.
Ho dichiarato un ADODB.RecordSet nel seguente modo:
Set rsArticoli = oMega.GetRS("tblArticoli", adLockReadOnly,
adOpenForwardOnly, False, ConnectClientSide, adCmdTableDirect)
e poi ho una routine che mi "rinfresca" le textbox (che sono circa 6-7
al momento).
Ciao



Prova questo (non cambia pressochè nulla, è una mia curiosità...)
Public Function GetRS(SQL As Variant, Optional LockType As
ADODB.LockTypeEnum = adLockReadOnly, Optional CursorType As
ADODB.CursorTypeEnum = adOpenStatic, Optional Disconnected As Boolean
= True, Optional ConnectType As ADOConnectType = ConnectClientSide,
Optional CommandType As CommandTypeEnum = adCmdTableDirect) As
ADODB.Recordset
    On Error GoTo LocalError
    LastSQL = CStr(SQL)
    Set GetRS = New ADODB.Recordset
    With GetRS
    set .ActiveConnection=ConObject
    .Source=CStr(SQL)
    .cursortype=CursorType '<<controlla sintassi
    .locktype=LockType '<<controlla sintassi
    .commandtype=CommandType '<<controlla sintassi
    .Open
        If Disconnected Then Set .ActiveConnection = Nothing
    End With
Exit Function
LocalError:
    LastError = Err.Source & " (" & Err.Number & ") " &
Err.Description
End Function
Le righe in cui ho scritto di controllare la sintassi le ho scritte a
braccio. Verifica se in realtà non sia qualcosa da impostare nei parameters,
al limite mettili direttamente nell .Open con parametro:=valore.
Sappimi dire.
Ciao
Alberto

    End With
[CUT]
In effetti il .CommandType non esiste, bisogna specificarlo nella
open.
Cmq, a parte questo, la lentezza permane in modo sconcertante ;_;
Ho provato ad utilizzare MyOleDB, ma è un casino, errori da tutte le
parti.
Sigh, sono disperato.
Eppure mi sembrava (da prove che avevo fatto tempo addietro sempre con
la stessa configurazione elencata) che il tutto filasse come una
scheggia.
Se hai altre idee, sono qui!


 scheggia.
Confermo.
MySql mi ha sempre colpito per la velocità.
Io uso ADO+MyOleDb, e devo dire che sono entusiasta. Apro sempre lato client
(per motivi vari), ma non ho mai notato lentezza.
Ti consiglio di insistere con MyOleDB.
Nel pacchetto che si scarica, ci sono degli esempi di connessione in VB che
da me hanno funzionato al primo colpo.
Ciao
Alberto

Alberto


 recordset mi segnala errore.
Mmmmhhhh...
Devo dirti una cosa, in tutta sincerità.
Io, usando sempre recordset disconnessi, quando devo fare delle modifiche
uso un ADODB.Command con la stringa di Update o di Insert.
Non ho mai eseguito nè un .AddNew nè un .Update su un recordset connesso a
MySql (mentre su Access, MSDE, Sql-Server mi è accaduto, ma veramente molto
di rado).
Non posso quindi garantirti che funzioni.
Ciao
Alberto

Non posso quindi garantirti che funzioni.
'azzolina... bhe, probabilmente sarà che gli passo qualche valore che
non digerisce e che MyODBC metteva a posto da solo :P


Non posso quindi garantirti che funzioni.
Sono riuscito a fare andre MyOleDB!!!!
Praticamente devo settare ogni recordset ConnectedServerSide.
Adesso per aprire la maschera articoli impiega circa 1 secondo!
Grazie 1000 Albe & Lupo


Nell'A.D. Thu, 09 Jan 2003 10:36:01 GMT, 
eri...@libero.it
 (Aran
Banjo) scrisse:
[CUT]
Mi "replico" da solo:
provando con la stessa configurazione SW su un altro PC (+ carrozzato)
senza cambiare una riga di codice funziona tutto una meraviglia....
"Vecchio" HW:
Acer TravelMate 525TE con HD 20GB + 256 MB RAM (è un PIII).
"Nuovo HW":
AMD Duron 1000 Mhz 512MB RAM + 1x40GB + 1x20GB
I database di MySQL stanno sul 20GB.
Tra l'altro utilizzo il portatile collegato in rete 100 Mb al fisso...
e con il codice identico ci mette 1 secondo ad aprire 35.000 record
(rispetto ai 10 secondi).
Faccio presente che tutte le applicazioni del portatile "girano" senza
rallentamenti.
Per concludere:
(come cantava Enrico) "MISTERO"


 (come cantava Enrico) "MISTERO"
Probabilmente è un problema di priorità dei thread! Il sistema operativo e
la versione di mysql è identica sulle due macchine?

la versione di mysql è identica sulle due macchine?
Su tutte e 2 è montato:
Windows 2000 Professional SP3 con update delle patch uguale
MySQL identico (ho copiato la cartella da uno all'altro)
