Autor Wątek: [C#, mysql] Jak wyłapywać błędy i prezentować je w formie user-friendly  (Przeczytany 3327 razy)

Offline gemGreg

  • Użytkownik
    • gemGreg's homepage

# Styczeń 23, 2012, 14:03:08
W przeciwieństwie do zwykłych prostych sytuacji, gdzie mogę pokazać użytkownikowi komunikat że np. text box w który ma wpisać coś jest błędnie wypełniony, sytuacje błędów przy wykonywaniu zapytań do baz danych już są trochę trudniejsze.

Przypuśćmy że jest następująca sytuacja, gdzie użytkownik ma wprowadzić szereg danych a jedną z nich jest numer który ma być unikatowy. Wprowadza jakiś numer i okazuje się że naruszył więzy unikalności i jedyne co mogę zrobić to mu ten długi i niezrozumiały sql'owy błąd pokazać.

Mógłbym oczywiście przed wysłaniem inserta wysłać inne zapytanie które mi zwróci czy taki numer już jest w bazie, ale to jest zapytanie więcej i nie wiem czy to jest taki dobry pomysł.

Zna ktoś jakiś optymalny i elegancki sposób na wychwytywanie błędów i pokazywanie userowi w sposób zrozumiały?

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline dikamilo

  • Użytkownik
    • blog

# Styczeń 23, 2012, 14:31:36
Skoro numer ma być unikatowy to po co użytkownik ma go wprowadzać ?

Pomysł z wysłaniem dodatkowego, sprawdzającego zapytania wydaje mi się najbardziej sensowny, aczkolwiek można spróbować napisać procedury w pl/sql czy jakimś odpowiedniku pod bazę którą masz (mysql ma procedury i kursory) i ewentualnie tam sprawdzać integralność danych i zwracać exception lub varchar z komunikatem / numerem błędu.

W procedurach można sobie zrobić handlery na konkretne numery błędów bazy i zwracać sensowny komunikat, przykład:

http://www.devshed.com/c/a/MySQL/Error-Handling/
« Ostatnia zmiana: Styczeń 23, 2012, 14:34:57 wysłana przez dikamilo »

Offline gemGreg

  • Użytkownik
    • gemGreg's homepage

# Styczeń 23, 2012, 14:37:08
Nr pesel jest takim przykładem.

Dzięki w sumie nie pomyślałem o procedurach. Jak ktoś zna jakiś inny sposób bez dodatkowego kodu w samej bazie to chętnie poczytam ;)

Offline Paweł

  • Użytkownik

# Styczeń 23, 2012, 14:50:33
To już prędzej trigger się nada.

Offline owyn

  • Użytkownik

# Styczeń 23, 2012, 15:06:49
Mógłbym oczywiście przed wysłaniem inserta wysłać inne zapytanie które mi zwróci czy taki numer już jest w bazie, ale to jest zapytanie więcej i nie wiem czy to jest taki dobry pomysł.
Jeśli baza danych jest zawsze otwierana tylko z jednego wątku, to wystarczy. Jeśli nie, to takie sprawdzenie nic nie da, bo między sprawdzeniem a wstawieniem numeru do bazy inny wątek może wrzucić już ten numer.
Chyba najprostszy sposób jest taki: sprawdzasz jaki wyjątek rzuca sterownik bazy w przypadku naruszenia unikalności, przechwytujesz go i wyświetlasz użytkownikowi ładny komunikat. To może jednak spowodować problemy, jeśli w jednym insercie możesz naruszyć kilka różnych constraintów - wtedy trzeba kopać głębiej i sprawdzić czy np. wyjątek nie zawiera gdzieś informacji o jaką kolumnę / jaki constraint chodzi.

Offline Kos

  • Użytkownik
    • kos.gd

# Styczeń 23, 2012, 15:21:37
A czy ado.net nie ma jakichś ficzerów do tłumaczenia tekstowych błędów bazy danych na coś programatycznie zrozumiałego (i niezależnego od silnika bazy)? Zawsze mi tego brakowało w tych wszystkich interfejsach bazowych.

Offline gemGreg

  • Użytkownik
    • gemGreg's homepage

# Styczeń 23, 2012, 15:54:17
Jak dotąd nic takiego niestety nie znalazłem.

Może to by był jakiś pomysł parsować błędy sqla :) Typu jeśli w stringu błędu jest słowo PESEL i CONSTRAINT jakiś tam to oznacza naruszenie unikatowości PESELA :P

Offline Kos

  • Użytkownik
    • kos.gd

# Styczeń 23, 2012, 16:41:44
Unikatowość pesela btw to zły pomysł; słyszałem że wcale nie jest tak unikatowy jak by projektanci baz danych chcieli :D Są nawet pesele, które nie pasują do typowego wzorca, albo mają złą checksumę.

Offline ShadowDancer

  • Redaktor

# Styczeń 23, 2012, 19:06:41
Złą checksumę? To po co ona w ogóle jest?

Offline Kos

  • Użytkownik
    • kos.gd

# Styczeń 23, 2012, 21:28:11
Dla idei :D
Wiki:
Cytuj
W praktyce zdarzają się (a przynajmniej zdarzały i wciąż istnieją) numery PESEL z błędami. Błędy w dacie zwykle były zauważane i poprawiane od razu, lecz zdarzały się też powtórzenia numeru porządkowego, błędy w określeniu płci i błędne cyfry kontrolne, które zostały wychwycone po latach przy okazji wprowadzania numeru PESEL do komputerowych baz danych. W związku z tym nie można zakładać, że wynik sprawdzania jednoznacznie określa istnienie bądź nieistnienie podanego numeru PESEL.

e-> http://software.com.pl/walidacja-danych-czy-faktycznie-potrzebna/
« Ostatnia zmiana: Styczeń 23, 2012, 21:30:08 wysłana przez Kos »

Offline Kurak

  • Użytkownik

# Styczeń 23, 2012, 22:26:14
a nie lepiej w druga strone, robic zapytania przy zmianie danego pola formularza (kontrolki, czy tam czegokolwiek) i po wychwyceniu jakiegokolwiek bledu pokazywac ze 'o tu jest zle'?

Offline gemGreg

  • Użytkownik
    • gemGreg's homepage

# Styczeń 23, 2012, 23:39:14
Dla idei :D
Wiki:
e-> http://software.com.pl/walidacja-danych-czy-faktycznie-potrzebna/

Tak tak to bardzo zabawne. :P Jak bym tak miał myśleć to program dla UBOJNI który piszę przepuszczał by zwierzęta z numerami które okazuje się, że rok temu były zapisane do bazy (czyt. już kiedyś ubite) ale teraz całkiem żywe dostarczone do zakładu gdzie ma się je PONOWNIE? ubić ! :P Chciałbyś takie mięsko zjeść ?:P
« Ostatnia zmiana: Styczeń 23, 2012, 23:43:07 wysłana przez gemGreg »

Offline ConayR

  • Użytkownik

# Styczeń 24, 2012, 01:58:10
1. Użyj SP, który zwraca krotkę, albo INTa z kodem błędu, jeśli masz błąd.
2. Sprawdzanie nie kosztuje aż tyle. Lepiej sprawdzić, niż dostać wyjątek o naruszeniu warunków.
3. Pokazywanie komunikatów z SQLa to zły pomysł. Skąd pewność, że nie będzie w zapytaniu niczego delikatnego?
4. Dlaczego MySQL? To jedyna "baza", która ma problemy wydajnościowe z praktycznie wszystkim, poza prostymi selectami.
5. Nie ma gwarancji, że PESEL jest unikatowy. REGON jest, PESEL nie. Do czasu zniesienia kodowania płci w PESEL-u zdarzyło się przynajmniej raz, że urodziło się ponad 5k dzieci tej samej płci. Wiem, bo taki przypadek trafiłem. Obecnie szansa na duplikaty jest niższa, ale wciąż nie jest zerowa.

Offline Xirdus

  • Redaktor

# Styczeń 24, 2012, 02:14:48
Do czasu zniesienia kodowania płci w PESEL-u
Zniesiono to?

Offline ConayR

  • Użytkownik

# Styczeń 24, 2012, 02:19:19
IIRC ktoś skarżył, że to łamie ustawę o ochronie danych osobowych. Nie pamiętam, czy nie osoba, która chciała zmienić płeć i nie podobało jej się to, że stara płeć pozostanie zakodowana w PESEL-u.