Newsgroup: it.comp.lang.delphi
Titolo: Provider di dati

Sto usando i componenti ado per accedere ad un db mysql tramite 
mysql_odbc. Facendo il debug passo passo, l'istruzione
     DataSet.Active := True;
va bene, ma appena controllo
     if DataSet.RecordCount > 0 then ...
si verifica l'errore "Il provider di dati o un altro servizio ha 
restituito uno stato E_FAIL".
Ho fatto un po' di ricerche con Google e alcuni hanno suggerito di 
aggiornare MDAC e i driver MySQL_ODBC. Io cmq ho l'ultima versione di 
entrambi. Altri suggeriscono di non aprire piu' di un dataset alla 
volta, ma anche questo accorgimento non funziona.
Avete qualche idea? Grazie,
MT

 Avete qualche idea? Grazie,
Il problema potrebbe essere dovuto al fatto che il provider OLE DB non 
supporta tale operazione. In generale, trattandosi di un database 
client/server, verificherei il numero di record presenti in tabella con 
un'istruzione "SELECT COUNT"; se invece desideri verificare che la 
tabella non sia semplicemente vuota, puoi controllare lo stato della 
proprietà /Eof/.
Ciao! :-)
-- 
Marco «Alka» Breveglieri
  (marco [@] abls [.] it)
  ABLS Team S.n.c. - Software & Web
  42019 Scandiano (Reggio Emilia)
 
http://www.abls.it

 un'istruzione "SELECT COUNT";
Ciao. Ho fatto come dici tu: ho fatto precedere una query del tipo 
"select count(*)..." prima della query vera e propria, e funziona, nel 
senso che riesce a contare i record giusti.
Pero' quando "attivo" la query vera e propria, faccio semplicemente:
     with DataSet do
     begin
       Active := True;
       First;
       while not Eof do ...
     end;
il test "Eof" risulta vero, anche se due linee di codice piu' sopra ha 
contato il numero giusto di righe...
MT

 contato il numero giusto di righe...
Sei sicuro che i criteri specificati nelle query siano identici?
Stai utilizzando lo stesso componente DataSet per eseguire entrambe le 
query? Hai chiuso il DataSet e assegnato la nuova query SQL prima di 
rieseguirla?
P.S.: puoi usare il metodo /Open/ al posto della proprietà /Active/ per 
ottenere i dati.


 rieseguirla?
Le query sono identiche a parte il "count". Comunque *forse* ho risolto 
il problema cambiando set di componenti. Dico *forse* perche' questi 
componenti li ho trovati non piu' di una mezz'oretta fa e fino ad ora 
non presentano alcuna stranezza.
Forse li conosci, si chiamano "Zeos Access", sono Open Source, e sul 
sito c'e' scritto che sono indicati per l'accesso a un server mysql. 
Speriamo! Ciao e grazie,
MT

 il problema cambiando set di componenti. [...]
Forse valeva la pena analizzare a fondo il problema prima di stravolgere 
il tuo progetto adottando altri componenti.
Ad ogni modo, se puoi cambiare così facilmente lo strato di accesso ai 
dati della tua applicazione, ci sono anche i componenti della libreria 
*dbExpress* che consentono di accedere a database MySQL. :-)


 il tuo progetto adottando altri componenti.
Ciao. Non e' stato necessario stravolgere niente: ho semplicemente 
sostituito i componenti ADO con quelli Zeos, avendo premura di chiamarli 
con lo stesso nome dei primi, e il codice e' rimasto inalterato.
MT

 con lo stesso nome dei primi, e il codice e' rimasto inalterato.
E con questi componenti funziona tutto? Strano...possibile che fosse 
proprio un bug del driver ODBC per MySQL?


 proprio un bug del driver ODBC per MySQL?
Funziona... quasi tutto. Ad esempio, l'istruzione
     FieldByName('orario').AsString := '09.00';
salva nel database l'orario '00:00:09', ma sono propenso a credere che 
questo errore sia dovuto ad una mia lacuna piuttosto che ad un bug dei 
componenti. Ciao,
MT

 componenti.
Se si tratta di un campo data/ora, puoi impostarlo in questo modo:
   FieldByName('ORARIO').AsDateTime := Now;
usando una variabile /TDateTime/ con il valore opportuno al posto di Now.
Ciao! :-)


 usando una variabile /TDateTime/ con il valore opportuno al posto di Now.
La riga di codice che hai riportato (cosi' com'e') scrive nel database 
l'orario "00:00:23", cioe' mette le ore al posto dei secondi e i minuti 
(che dovrebbero essere 16) li ignora allegramente!
Comunque e' un ostacolo facilmente aggirabile... non si puo' mica avere 
tutto dalla vita! Ciao,
MT

 (che dovrebbero essere 16) li ignora allegramente!
Sicuramente la causa del problema non è nella forma del codice scritto e 
dei membri utilizzati, quanto probabilmente nel formato del campo.
Di che tipo è?


 Di che tipo è?
Il campo era di tipo TIME. Ieri sera provai a tipizzarlo come DATETIME, 
ma faceva ancora piu' pasticci (credo che cercasse di interpretare 
l'orario come una data).
Ho *tamponato* il problema tipizzando il campo come stringa, perche' 
comunque non mi serve l'aritmetica del tipo TDateTime. Lo so, e' una 
soluzione poco elegante, ma i tempi sono strettissimi (come sempre).
Adesso ho urgenza di finire il lavoro. Se dovesse capitarmi di usare di 
nuovo MySQL, allora affrontero' il problema "di petto".
MT

 l'orario come una data).
Mi pare che il tipo corretto sia DATE, ma non ne sono sicuro (non uso 
MySQL abitualmente). Prova a controllare.
Ciao! :-)


 MySQL abitualmente). Prova a controllare.
In MySQL esistono DATE, TIME e DATETIME (oltre a TIMESTAMP e forse 
qualcos'altro). Sono i campi TIME che fanno quello scherzo...
MT