[ _v!rus_ @ 15.01.2007. 12:07 ] @
Ovako,

Imam jedan datamodule sa TADOConnection objektom i mnogo formi sa jednom ili vise TADOQuery nakacenim na taj TADOConnection. Tokom rada programa zbog loseg rada mreze, resetovanja servera ili ko-zna-cega pukne ta veza izmedju TADOConnection-a i underlying servera, i aplikacija izbaci jedan veliki "connection failed" msgbox na sred ekrana. U 99% slucajeva samo je potrebno zatvoriti i otvoriti TADOConn., ali ne postoji event OnError ili sl. Zna li neko kako se ovo hendluje, ne bih da opkoljavam svaki TADODataset.open sa try..except?

Znam da ovo ne bi bio problem kada bi umesto TADOConn. svaki TADODataset imao svoj conn. string, ali moze li se resiti sa TADOConnection?
[ savkic @ 15.01.2007. 15:35 ] @
> oseg rada mreze, resetovanja servera ili ko-zna-cega pukne ta veza izmedju TADOConnection-a i underlying servera, i aplikacija izbaci jedan veliki
> "connection failed" msgbox na sred ekrana. U 99% slucajeva samo je potrebno zatvoriti i otvoriti TADOConn., ali ne postoji event OnError ili sl.
> Zna li neko kako se ovo hendluje, ne bih da opkoljavam svaki TADODataset.open sa try..except?

Handluj Application.OnException.
[ _v!rus_ @ 16.01.2007. 08:42 ] @
To sam i pokusao da izbegnem ali izgleda da nema druge...

Izgleda da TADOConn.Close i Open ne vrsi posao jer zatvori sve vezane datasete, probacu da u tom error handleru prvo pokupim sve aktivne datasete, pa posle close/open da ih ponovo aktiviram.

U principu, u 90% slucajeva se kod ADO-a koristi klijentski kursor, znaci staticka kopija recorda, svaki naredni insert ili update osvezava jedan record. Mislio sam da mozda postoji naci da se underlying konekcija resetuje u slucaju pada konekcije bez da se moraju svi dataseti zatvoriti (sto se desi kada uradis TADOConn.Close), ne vidim potrebu za stalnom konekcijom kod klijentskog kursora. Ako neko zna nesto vise na ovu temu neka kaze, verujem da je ovo common problem.
[ aleksandarpopov @ 16.01.2007. 13:09 ] @
Naravno da konekcija ne treba da ti je stalno otvorena. Koristi batch optimistic locking...

otvoris konekciju -> prevuces potrebne podatke u dataset -> zavoris konekciju

sada korisnik moze da menja podatke na klijentu

otvoris konekciju -> postujes promenjene podatke iz dataseta na server-> zatvoris konekciju

Sad kako ces ti to sve uklopiti u tvoje resenje to vec ne znam...

Pozdrav!
[ bondja @ 16.01.2007. 14:58 ] @
Svi ClientDataSet ili AdoQuery ili stavec treba da ima Connected, Active := false
u design modu. U principu preko TAdoQuery iscitavas podatke, a ucitavanje uradis preko
query: TAdoQuery (podesis SQL string) i onda pozivas preko funkcije (otprilike):

f-ja readDB( query: TADoQuery): boolean; // vraca true ako je uspesna
begin
Result := false;

try
if query.Active then
query.Close;

// konektujemo se na bazu:
if NOT AdoConn1.Connected then
AdoConn1.Open;

query.Open;
Result := TRUE;
except
On E: EDatabaseError do
MessageDlg(PChar(E.Message), mtError, [mbOK], 0);
end
end;

Ako ovo ne prodje, moguci razlozi i provere istih:
- MS Server service ne radi (?!?), mozes da proveris da li ti
SQL Server radi (procedura koja proverava da li radi (neki) servis je:
ServiceGetStatus('', 'MSSQLSERVER')
- izgubio si konekciju izmedju racunara ( mozes da proveris da li
vidis IP adresu doticnog racunara na kome se nalazi baza, tj da li
mozes da pristupis tom racunaru).

itd. Otprilike proveravas konekciju na vise nivoa u programu, a cim
iscitas / upises podatke, konekcije gasis (DRZIS IH ZATVORENE)
Ako pukne u toku iscitavanja/upisa podataka, to ce try/except da uhvati.

poz.