Newsgroup: it.comp.lang.delphi
Titolo: BDE e DB

 Salve a tutti e buona giornata, ho questo piccolo problema...
Circa un anno fa abbiavo sviluppato un programma con delphi6 che 
utilizza il BDE per accedere ad un database SQL. Il programma ora è 
stato installato in uno stabilimento dove anno alcuni problemi di rete.
Mi capita che il programma si "scolleghi" dal DB e con BDE non riesco 
più ad accedere alle tabelle.
Se spengo il programma e lo faccio ripartire tutto riparte correttamente.
Ci sono delle microinterruzioni sulla rete che mi fanno cadere la 
connessione con il DB.
Quello che vi chiedo è se esiste un modo con BDE per forzargli 
la "riconnessione automatica" a fronte di un problma di collegamento 
oppure se è possibile capire quando BDE mi si scollega dal database.
Vi ringrazio in anticipo.
Saluti
Andrea Montanari c/o Villiam Bonini
--- posted by geoForum on 
http://www.delphiedintorni.it

ho affrontanto un problema simile con gli ibx.
Un client di una app è connesso ad un server interbase via connessione 
isdn che viene interrotta dopo 3 minuti se sulla linea non viaggiano dati.
Nel mio caso ho risolto usando una proprietà di tibdatabase che indica 
un timeout dopo il quale la connessione viene chiusa.
Tale timeout è ovviamente stato impostato ad un tempo inferiore ai 3 
minuti della linea.
Nel tuo caso, essendo le interruzioni random, un sistema del genere non 
va...
Quindi, oltre a suggerire al cliente di verificare la rete e magari 
sostituire i cavi che passano accanto ad apparecchiature che generano 
forti campi magnetici o roba simile con cavi schermati, credo che 
l'unica sia avere un processo in background che pinga il server e, se 
esso non è raggiungibile, applica il metodo close al tdatabase.
Occhio che è solo una pezza xche non è detto che la rete vada giù in un 
momento "morto"...
Se capita mentre vi sono dati che viaggiano l'app va in errore e buonanotte.
AS

connessione con il DB.
Non ho provato questo specifico caso, ma sto ripassando proprio oggi i
capitoli relativi al database. L'oggetto TDatabase ha la proprieta'
KeepConnection che, se impostata a true, dovrebbe assicurarti il mantenimento
della connessione verso il database.
Nel caso non dovesse risultare efficace a causa dei breakdown della rete,
potresti tamponare applicando un timer che, ad intervalli ad es. di mezzo
secondo, verifica se la proprieta' connected e' True e in caso negativo agisca
di attivandola. 
ciao,
-- 
Morde. 
Plonkatore professionista di ICLD.

Concordo in generale con i principi suggeriti da chi mi ha preceduto.
Tuttavia potrebbe essere piu' economico utilizzare un thread.
Delphi fornisce un'implementazione molto semplice dei thread creabili in
spazio utente (vedi TThread nella guida on-line).
L'idea sarebbe quella di far partire, allo startup del tuo programma, dopo
l'apertura della connessione al DB, un thread che attiva il timer e, ad ogni
interrupt del timer verifica la proprieta' connectred etc. etc.
ciao
baba

> interrupt del timer verifica la proprieta' connectred etc. etc.
no, xche tdatabase, tiibdatabase etc non sanno se il socket aperto dal 
client del db č andato giů oppure no.
Altrimenti l'errore non lo avresti. ;)
AS

ok, giusto, chiedo venia.
Continuo pero' a sostenere la teoria del thread per evitare la creazione di
un altro processo per il ping...
Poi il thread si potrebbe occupare di contattare il server via Berkeley
socket API di Windows o di trappare una eventuale eccezione di un metodo di
piu' alto livello della VCL.
cheers,
baba