Newsgroup: it.comp.lang.delphi
Titolo: TADOConnection a design time

ciao a tutti,
oggi ho installato su un pc con win2000 un mio programma che fa uso di un 
db Access.
Nell'installazione ho eseguito tutta la procedura, prima gli MDAC poi ho 
riavviato windoz poi ho installatto il mio programma.
Quando ho eseguito il mio programma...boom! Errore! Dal mio splash 
screen, che mi va vedere lo stato di avanzamento, il mio programma si 
bloccava dopo la scritta 'Connesione alla base dati in corso...'
Per farla breve il problema era che la proprietà Connected del componente 
TADOConnection era a True nel progetto, impostandola a False e copiando 
l'eseguibile sulla macchina win2000 non mi ha dato più il problema 
durante l'esecuzione.
La connesione l'ho fatta nell'evento onCreate del primo DataModule creato 
dal progetto e la prima riga è proprio :
adoConnection.Connected := False;
Dico! ci si può dimenticare di lasciare la propietà Connected a True, 
vorrei sapere se qlc di voi ha già avuto questo inconveniente e se c'è un 
modo più corretto di creare una connessione al DB.
Diego
--- posted by geoForum on 
http://www.delphiedintorni.it

 modo più corretto di creare una connessione al DB.
Io ho costantemente un problema come il tuo ed ho ripiegato obbligandomi 
a chiudere la connessione prima di compilare: nel Form1.OnCreate (dove 
Form1 è il form principale), metto un
   if ADOConnection1.Connected then
     Application.Terminate;
così sono sicuro che se voglio provare il programma la connessione devo 
averla chiusa...
Se trovi qualcosa di più comodo, dillo anche a me!
Saluti
     Marco Bortolani
     info @ 
marcobortolani.it
P.S.
Scusa Rubio: sono i primi giorni che uso Thunderbird (fantastico) e per 
sbaglio ti ho inviato lo stesso messaggio anche in privato :-((

sbaglio ti ho inviato lo stesso messaggio anche in privato :-((
ma in privato dove?


 ma in privato dove?
L'indirizzo è diego_difilippo @ 
virgilio.it
, ovviamente senza spazi...
Marco

fino ad ora sono solo riuscito a catturare l'eccezione di windoz e a 
visualizzare un messaggio personale.
try
  Application.CreateForm( TmioDatamodule, mioDatamodule );
except
  ShowMessage( 'Errore connesione!!!' );
  Application.Terminate;
end;
ma visto che si è verificata l'eccezione non è nemmeno possibile 
impostare la proprietà Connected a False e continuare.


RUBIO ha scritto:
[cut]
Nei miei programmi di solito imposto la stringa di connessione 
(componendola con delle informazioni che in genere carico da un file 
.ini) direttamente nell'evento /TADOConnection.BeforeConnection/ in 
questo modo posso anche dimenticarmi la connessione attiva a Design Time.
Ciao,
Gianluca.

questo modo posso anche dimenticarmi la connessione attiva a Design Time.
io ho risolto creando il componente TADOConnection a runtime così avrà 
sempre la proprietà a False.
facendo come dici tu mi succede una cosa strana, nell'evento onCreate del 
Datamodule metto adoConnection.Connected := True e nell'evento 
OnBeforeConnection metto la connessione e l'apertura delle tabelle nel 
main del progetto quando viene eseguita :
Application.CreateForm( TDataModule, mioDatamodule );
viene creato prima l'oggetto TADOConnection e poi il datamodule...come è 
possibile non lo so! ma questo avviene solo quando la famosa proprietà è 
a True.
:O


 a True.
Non è proprio così: prima viene creato il /TDataModule/, poi gli oggetti 
in esso contenuto. Però l'evento /TDataModule.OnCreate/ viene eseguito 
solo nel momento cui sono stati creati tutti gli oggetti. Infatti, se 
questi non esistessero, non potresti mai inizializzarli.
Quando il TDataModule crea gli oggetti (prima del proprio OnCreate), 
imposta le proprietà così come le legge dal proprio file .dfm e, se 
/TADOConnection.Connected/ è True, ovviamente apre la connessione.
Quindi, in questo specifico farebbe scattare 
/TADOConnection.OnBeforeConnection/. A questo punto se nell'evento metti 
il codice di inizializzazione della ConnectionString (ad esempio 
caricandolo da un .ini), sei sempre tranquillo.
Naturalmente, per essere sicuro di aprire *sempre* la connessione, nel 
/TDataModule.Create/ dovrai scrivere soltando:
"
   if not cnnADO.Connected then
     cnnADO.Connected := True;
"
facendo così scattare /TADOConnection.OnBeforeConnection/
Se invece hai bisogno di una soluzione che *non* apra mai in automatico 
(ad esempio perchè in fase di creazione del TDataModule non hai 
abbastanza informazioni per impostare la ConnectionString), puoi 
supportarti da una variabile globale che indica l'inizializzazione in 
corso dell'applicazione ed utilizzarla per interrompere l'apertura della 
connessione:
- dove crei il datamodule potrai scrivere:
"
   ...
   InitApplication := True;
   Application.CreateForm(TdmDB, dmDB);
   ...
   InitApplication := False;
"
- e nell'evento /TADOConnection.OnBeforeConnection/, testi il valore del 
flag di inizializzazione:
"
   ...
   if InitApplication then
     SysUtils.Abort;
   ...
"
in questo modo sollevi un'eccezione "silenziosa" ma che impedisce di 
aprire la Connessione finché non hai tutte le informazioni necessarie.
Ciao,
Gianluca.