Warsztat.GD

Programowanie => Projektowanie kodu => Wątek zaczęty przez: gemGreg w Styczeń 23, 2012, 14:03:08

Tytuł: [C#, mysql] Jak wyłapywać błędy i prezentować je w formie user-friendly
Wiadomość wysłana przez: gemGreg w 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?
Tytuł: Odp: [C#, mysql] Jak wyłapywać błędy i prezentować je w formie user-friendly
Wiadomość wysłana przez: dikamilo w 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/
Tytuł: Odp: [C#, mysql] Jak wyłapywać błędy i prezentować je w formie user-friendly
Wiadomość wysłana przez: gemGreg w 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 ;)
Tytuł: Odp: [C#, mysql] Jak wyłapywać błędy i prezentować je w formie user-friendly
Wiadomość wysłana przez: Paweł w Styczeń 23, 2012, 14:50:33
To już prędzej trigger się nada.
Tytuł: Odp: [C#, mysql] Jak wyłapywać błędy i prezentować je w formie user-friendly
Wiadomość wysłana przez: owyn w 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.
Tytuł: Odp: [C#, mysql] Jak wyłapywać błędy i prezentować je w formie user-friendly
Wiadomość wysłana przez: Kos w 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.
Tytuł: Odp: [C#, mysql] Jak wyłapywać błędy i prezentować je w formie user-friendly
Wiadomość wysłana przez: gemGreg w 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
Tytuł: Odp: [C#, mysql] Jak wyłapywać błędy i prezentować je w formie user-friendly
Wiadomość wysłana przez: Kos w 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ę.
Tytuł: Odp: [C#, mysql] Jak wyłapywać błędy i prezentować je w formie user-friendly
Wiadomość wysłana przez: ShadowDancer w Styczeń 23, 2012, 19:06:41
Złą checksumę? To po co ona w ogóle jest?
Tytuł: Odp: [C#, mysql] Jak wyłapywać błędy i prezentować je w formie user-friendly
Wiadomość wysłana przez: Kos w 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/
Tytuł: Odp: [C#, mysql] Jak wyłapywać błędy i prezentować je w formie user-friendly
Wiadomość wysłana przez: Kurak w 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'?
Tytuł: Odp: [C#, mysql] Jak wyłapywać błędy i prezentować je w formie user-friendly
Wiadomość wysłana przez: gemGreg w 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
Tytuł: Odp: [C#, mysql] Jak wyłapywać błędy i prezentować je w formie user-friendly
Wiadomość wysłana przez: ConayR w 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.
Tytuł: Odp: [C#, mysql] Jak wyłapywać błędy i prezentować je w formie user-friendly
Wiadomość wysłana przez: Xirdus w Styczeń 24, 2012, 02:14:48
Do czasu zniesienia kodowania płci w PESEL-u
Zniesiono to?
Tytuł: Odp: [C#, mysql] Jak wyłapywać błędy i prezentować je w formie user-friendly
Wiadomość wysłana przez: ConayR w 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.
Tytuł: Odp: [C#, mysql] Jak wyłapywać błędy i prezentować je w formie user-friendly
Wiadomość wysłana przez: Xirdus w Styczeń 24, 2012, 02:31:51
Wszędzie gdzie patrzę na necie, na .govach włącznie, pisze że w PESEL-u jest płeć. A w linku Kosa pisze, że po zmianie płci PESEL też się zmienia.
Tytuł: Odp: [C#, mysql] Jak wyłapywać błędy i prezentować je w formie user-friendly
Wiadomość wysłana przez: lmmilewski w Styczeń 24, 2012, 07:00:28
Z numerem PESEL też miałem kiedyś problem w programie. Okazuje się, że nie zawsze te numery były przetwarzane przez komputery (kto by pomyślał?), a przez to są numery zupełnie bez sensu (jak wspomniana niezgadzająca się suma kontrolna).

Walidacja PESELu, tak samo jak walidacja imienia czy nazwiska, to prosty sposób żeby jakiegoś użytkownika odciąć od usługi.
Tytuł: Odp: [C#, mysql] Jak wyłapywać błędy i prezentować je w formie user-friendly
Wiadomość wysłana przez: skowronkow w Styczeń 24, 2012, 13:14:11
Najlepszym rozwiązaniem jest faktycznie wspomniana tutaj procedura, ale to tylko w oderwaniu od tej sytuacji.  W żadnym produkcyjnym systemie, który znam pesel nie jest unikalny.
Tytuł: Odp: [C#, mysql] Jak wyłapywać błędy i prezentować je w formie user-friendly
Wiadomość wysłana przez: Kos w Styczeń 24, 2012, 13:29:26
Wychodzi nam z tego, że walidacja pod względem "sensowności" danych, a wymagania odnośnie ich spójności, to 2 różne rzeczy.