Jak obsłużyć błędy ODBC/MySQL

0

Witam.
Potrzebuję drobnej pomocy. Nie mogę sobie poradzić z obsługą błędów, które mogę dostać od bazy MySQL poprzez sterownik ODBC. Czy mógłby ktoś mi podpowiedzieć jak to zrobić? O ile standardowe błędy systemowe potrafię obsłużyć, o tyle błędów i komunikatów od bazy danych już nie.

0

znaczy z czym masz problem?? try .. except nie daje rady?

0

Właśnie nie wiem, bo nie wiem jak się do tego zabrać. Dam przykład.
Osobnik loguje się do programu (uwierzytelnianie na bazie danych). Przypisuję do ADOConnection odpowiedni string, klikane jest zaloguj. Jeśli nazwa użytkownika i hasło są poprawne, wszystko jest ładnie. Natomiast w przypadku błędnego loginu lub hasła, dostaję komunikat od MySQL-a w postaci:

[MySQL][ODBC 3.51 Driver]Access denied for user 'nazwa_uzytkownika'@'host' (using password: TAK)

Lub w przypadku, gdy serwer MySQL nie odpowiada (leży):

[MySQL][ODBC 3.51 Driver]Can't connect to MySQL server on 'host' (10061)

To są typowe błędy od MySQL. I jak się do tego zabrać?? To nie jest typowy (moim zdaniem) Exception. Ale może się mylę?

0

try except powinno załątwić sprawę

0

Ja to wiem, że try..expect powinno załatwić sprawę. Tylko nie wiem kompletnie, co w tym expect wpisać.

0

To zależy co chcesz z tym błędem zrobić. Jeśli nic nie wpiszesz

try
Logowanie;
except
end;

to błąd zostanie stłumiony (powinien zostać :)).

Podejrzewam że jednak nie chcesz go tłumić, dlatego polecam takie coś. Najlepiej napisać sobie swoją prockę obsługi błędów i wtedy dajesz:

try
Logowanie
except
on E : Exception do
MojaProckaObslugiBledow(E);
end;

W tej procce możesz zbadać czy np (E is EDBEngineError) (może nie tak się to pisze), w każdym razie, jeśli to będzie ten błąd to on ma pole Errors (czy Items) nie pamiętam. Tam jest sporo cennych informacji (Kod SQL błedu, kod lokalny).

Oczywiście możesz zrobić prościej (mniej przyszłościowo).

try
Logowanie
except
ShowMessage('Nie udało się zalogować');
end;

albo

try
Logowanie
except
on E : Exception do
ShowMessage('Nie udało się zalogować' +#10#13 + E.Message);
end;

Ja jak się łączę przez ODBC z FireBirdem, to dodatkowo wycinam sobie te rzeczy co są w nawiasach kwadratowych (po co user ma wiedzieć jak się łączę) i dostaję czysty komunikat błędu.

Metoda o której Ci pisałem na początku, daje Ci duże możliwości. Możesz sobie w niej zaimplementować przyjazdny dla użytkownika mechanizm obsługi błędów. Np w triggerz'e przed insertem, sprawdzasz dane i jak coś jest nie tak to wyrzucasz Exceptiona SQL'em (w FB tak się da, więc pewnie u Ciebie też). Nazwę sobie tak układasz aby miała wyraźny początek i koniec. Później w twojej procce do obsługi błędów wycinasz tą nazwę i prezentujesz użytkownikowi ładniutki tekscik komunikatu - oczywiście dotyczy to juz samej pracy z danymi, a nie logowania. Czasem jak komunikat jest długi to jest on podzielony w tej właściwości Items(albo Errors nie pamiętam) więc trzeba to mieć na uwadze. Jak sobie wyciągniesz SQLCode - to jak pomyśleć też się do czegoś może przydać ... itd, itp

Moim zdaniem warto na początku zrobić sobie prockę do obsługi błędów (z ładniutką formateczką) + logowanie do jakiegoś errorloga. Bo czas włożony w to zwraca się potem.

Nic nie stoi na przeszkodzie żeby sobie w swojej procce obsługiwac potem inne błędy (EConverError i wiele innych, nawet zdefiniowane przez siebie wyjątki pochodne od Exception).

Wszystko zależy czy aplikacja ma być duża, jak logowanie i jakiś selekcik to nawet tego nie czytaj : )

0
  try
    ...
  except
    on E : Exception do
      //i teraz w e masz opis wyjątku chyba razem z numerem błedu i możesz z tym robić co chcesz
  end;
0

O dzięki wam. Teraz już wiem z czym to się je.

0
b0bik napisał(a)
try
Logowanie
except
on E : Exception do
ShowMessage('Nie udało się zalogować' +#10#13 + E.Message);
end;

Co dokładnie trzeba wpisać w to pole logowanie ?
Bo robię tak:

Database1.Login:=Edit2.Text;
Database1.Password:=Edit3.Text;

try
Database1.Connected:=True;
except
on E : Exception do
ShowMessage('Nie udało się zalogować' +#10#13 + E.Message);
end;

I nadal pokazują się błędy Access dienied for user XXXX
a nie ten mój komunikat !

0

Delphi 7 -> Tools -> Debugger Options -> Language Exceptions -> Odznacz "Stop on Delphi Exceptions"

1 użytkowników online, w tym zalogowanych: 0, gości: 1