Strona 1 z 1

ADO, ODBC - wykrycie zerwanego polaczenia

Nowy postNapisane: wtorek, 2 czerwca 2009, 22:09
przez banita
sprawa wyglada tak:
lacze sie z baza postgres za pomoca ADO przez provider dla ODBC czyli ADO->ODBC->postgres.

przykladowy problem:

try
{
// tu wykonujemy jakies zapytanie, dowolne
}
catch(EOleException& ex)
{
// cos sie nie udalo wiec sprawdzamy co jest grane
ShowMessage(ex.ErrorCode);
}

w jaki sposob w bloku catch moge sprawdzic to ze zapytanie nie udalo sie bo np padl serwer bazy danych?
nie wazne jaki jest powod bledu (bledne,zapytanie,brak polacznie...) kod bledu zawsze jest taki sam i rowny -2147467259 co w opisie bledow OLE-DB oznacza blad niezdefiniowany. zawsze ten sam kod!
obsluga zdazen AfterDisconnect czy OnDisconnect nic nie da bo one dzialaja tylko wtedy gdy sam rozlacze baze. gdy to serwer padnie to zdarzenia te nie maja miejsca, malo tego gdy sprawdze stan obiektu polaczenia to wykazuje on ze polaczenie jest ciagle nawiazane.

w obiekcie wyjatku dostaje poprawny komunikat (np brak polaczenia, zle zapytanie itd) ale kod bledu jest ten sam. jak zatem moge sprawdzic ze winowajca jest zerwane polaczeni(np reset serwera) i ponowanie prubowac nawiazac polaczenie.
nie chec za kazdym wyjatkiem nawiazywac polaczenia na nowo bo w 90% przypadku nie bedzei takiej potzreby.

Re: ADO, ODBC - wykrycie zerwanego polaczenia

Nowy postNapisane: czwartek, 4 czerwca 2009, 10:13
przez Ho88it
Chyba tylko przez ping'a w serwer..
Dodaj funkcję która sprawdzała by co np 5-10sek. połączenie przez pinga w trakcie działania programu (najlepiej jako osobny wątek) i gdybyś nie dostał odpowiedzi od serwera wtedy generujesz zdarzenie zerwanego połączenia sam. Po wystąpieniu zdarzenia np: "OnConnectionLoose" aplikacja monitorowała by przez 1 min. połączenie z serwerem dając mu czas np. na restart. Poza tym ping sprawdza aktywność karty sieciowej a nie usługi serwera bazy! Co za tym idzie, możesz rozróżnić powód braku połączenia i wziąć poprawkę na czas jaki potrzebuje system na uruchomienie usługi.
Wystarczy wysyłać malutkie pakieciki żeby nie syfić łącza.

Re: ADO, ODBC - wykrycie zerwanego polaczenia

Nowy postNapisane: czwartek, 4 czerwca 2009, 15:46
przez banita
bez urazy ale to kiepskie rozwiazanie.
wysylajac dowolne zapytanie do bazy w momencie gdy serwer lezy powoduje iz sterownik ODBC zwraca poprawny komunikat, czyli jest w stanie stwierdzic ze powodem jest niemoznosc uzyskania polaczenia. problem polega na tym iz ja otrzymuje tylko komunikat bledu(string) mowiacy ze poalczenie padlo a kod bledu zawsze mam ten sam bez wezgledu na przyczeyne i komunikat.
gdyby te kody bledow byly ustawiane poprawnie to bez problemu w blokach obslugi sytuacji wyjatkowych identyfikowalbym przyczyne takiego stanu.
potrzebuje odpowiedzi na pytanie: jaka jest przyczyna tego iz zawsze mam ten sam kod bledu? kod bledu oznaczajacego blad niezdefiniowany a sam komunikat bledu jest poprawny i jasno mowiacy co sie stalo.
w mojej ocenie to ADO nie tlumaczy kodow bledow z ODBC(ADO ma swoje a ODBC swoje) na swoje kody i zawsze ustawia nieznany blad.

Re: ADO, ODBC - wykrycie zerwanego polaczenia

Nowy postNapisane: piątek, 5 czerwca 2009, 11:34
przez Ho88it
Nie wiem czy uwzględniłeś coś takiego:
1. Gdy restartuje się komputer "miękko" wszystkie usługi sieciowe powinny wysłać automatycznie zakończenie sesji połączenia co zarejestruje klient po drugiej stronie kabelka. Obsługa błędów powinna działać prawidłowo (np. połączenie z serwerem usług jest, a baza do której się odwołujesz nie istnieje i wysłany jest konkretny kod błędu).

2. Gdy serwer "leży" to OLE DB i ODBC mogą jasno powiedzieć: "Chcemy się połączyć ale nikt nie odpowiada, więc pewnie jest wyłączony." i dostajesz poprawny kod błędu.

3. Kiedy występuje twardy reset serwera lub zawieszenie systemu to nie ma szans aby jakikolwiek komunikat został wysłany do klienta. Czyli po drugiej stronie ludzik nie jest w stanie się dowiedzieć, że serwer już "nie żyje", wysyła zapytania do bazy w pakietach którym upływa czas życia w sieci i zostają bez odpowiedzi. Kod -2147467259 (szesnastkowo 0x80004005) oznacza że:
"In this case, they are the E_FAIL value, which may indicate that neither OLE DB nor its underlying provider was able to positively identify the source of the error. "
czyli ani OLE DB ani ODBC na Twoim komputerze, które jeszcze przed chwilą obsługiwały sesję z bazą nie są w stanie stwierdzić przyczyny braku odpowiedzi i mówią Ci... "Stary nie wiem czemu nie odpowiada, skoro działa (tak zakładam, bo nie zgłosił, że się resetuje i wcześniej połączenie było poprawnie nawiązane)" == kod:-2147467259.

Więc zawsze po padnięciu serwera dostaniesz ten sam kod błędu.

Sprawdź tu: http://support.microsoft.com/default.aspx?scid=kb;EN-US;q168354&GSSNB=1

Re: ADO, ODBC - wykrycie zerwanego polaczenia

Nowy postNapisane: piątek, 5 czerwca 2009, 14:46
przez banita
Nie wiem czy uwzględniłeś coś takiego:
1. Gdy restartuje się komputer "miękko" wszystkie usługi sieciowe powinny wysłać automatycznie zakończenie sesji połączenia co zarejestruje klient po drugiej stronie kabelka.

gdy wylacze serwer bazy danych(nie komupter) poprzez poprawne zakonczenie jego pracy to nie idzie do klienta zaden komunikat!

gdyby to dzialalo tak jak mowisz to sprawa bylaby prosta.
sytuacja wyglada tak ze mam poalczenie, wykonuje zapytanie itd... np w pewnym zapytaniu jest zla data wiec baza nei przyjmuje rekordu i zwraca komunikat ze CHECK wykrl blad ale KOD BLEDU JEST ZAWSZE TEN SAM - NIEZNANY BLAD!
dalej ... zupelnie bledne zapytanie np nieistniejaca tabel, komunikat poprawny ale KOD BLEDU TEN SAM. swiadome rozlaczenie bazy i wyslanie zapytania, tresc ok ale kod ten sam. ubicie procesu bazy, obiekt polaczenia mysli ze jest polaczony(jak mowisz), wysyla zapytanie i zwraca blad iz nie mozna zrealizowac zapytania bo cytuje "connection dead", kod bedlu ten sam.
problem w tym ze nie wazne jaka jest przyczyna beldu zawsze dostaje ten sam kod bledu.

Re: ADO, ODBC - wykrycie zerwanego polaczenia

Nowy postNapisane: sobota, 6 czerwca 2009, 13:44
przez Ho88it
Chyba trzeba by mocno poczytać o obsłudze błędów ADO i ODBC... A co do tego, że usługi serwera nie wysyłają komunikatu o zamykaniu sesji po stronie serwera świadczy o tym, że komuś nie chciało się zadbać o jakość oprogramowania.. Ja zawszę implementuję w zdarzeniu OnClose lub OnDestroy komunikaty dla klienta.

Re: ADO, ODBC - wykrycie zerwanego polaczenia

Nowy postNapisane: sobota, 6 czerwca 2009, 14:40
przez banita
Ho88it napisał(a):komuś nie chciało się zadbać o jakość oprogramowania..

mowa o PostgreSQL.
co do obslugi bledow to ADO nie jest stworzone do pracy z ODBC(to ze ma taka mozliwisc to inan bajka). gdyby kozystac z providera OLD-DB dla jakiejs konkretnej bazy to mysle ze byloby ok bo taki provider implementuje kody bledow rozumiane przez ADO. ODBC zwraca swoje (rozne od ADO) kody bledow i moze dlatego ADO zawsze initerpretuje to jako blad nieznany, choc moim zdaniem powinien umiec to sobie przelozyc na swoj adekwatny kod bledu. to jest oczywiscie moj domysl a nie cos potwierdzone ale innego wytlumaczenia nie widze.