sobota, 27 września 2025

Błędna decyzja

Jest błąd w logu, pojawia się od dawna.

Czas żeby się z nim zmierzyć, wygląda na prosty

Błąd, posłużyłem się czatem gpt:

System.Data.SqlTypes.SqlTypeException:
  Wartość 0001-01-01 00:00:00 jest poza zakresem dla typu SqlDateTime.
  Zakres prawidłowy to od 1753-01-01 00:00:00 do 9999-12-31 23:59:59.

Pole w bazie, którego błąd dotyczy jest  typu DateTime i jest nullowalne, wykorzystywane przy okazji różnych funkcjonalności z danego kontekstu. Pole nazywa  się data ważności  dajmy na to  DateValid. Czyli mamy jakąś funkcjonalność, która ma określoną datę ważności, (do spożycia). 

To jest kontekst problemu który, powinien nam wystarczyć do jego zrozumienia.

Co robić?

Na pierwszy rzut oka problem jest prosty do rozwiązania, mamy nazwę pola możemy przeszukać w kodzie gdzie jest pole używane i zmienić wpisywaną wartość na tę z zakresu. Czyli z zakresu, który łyknie ms sql.

Opcja numer 2

Możemy też wejść do bazy i zmienić typ tej kolumny z DateTime na DateTime2, przy okazji do nie dawna nie wiedziałem, że jest taki typ jest, myślałem, że to błąd EJ-a, ten typ jest wprowadzony od wersji 2008. Jest to typ zgodny z .Net-otowym typem czyli przyjmuje .netowe wartości minimalne i jest bardziej dokładny. Tak właściwie powinno się go używać zamiast standardowego DateTime (żyłem w kłamstwie).

Wracając do tematu, mamy już dwie opcje w miarę proste do ogarnięcia, tylko czy właściwe?
Mamy pole DateValid jest nullowalne czyli może być puste, ktoś wpisuje tam minimalną wartość daty, te dwie informacje budzą we mnie pewne wątpliwości:
  • dlaczego wpisywana jest wartość minimalna skoro można wpisać null?
  • nazwa pola wskazuje że powinna być tam wartość, a ktoś tam wpisuje datę z poza zakresu data czyli minimalną można przyjąć,
  • być może któraś z funkcjonalności ma źle zwalidowane dane,
  • albo co gorsza jest proces, który dopuszcza wartość pustą w polu którego nazwa sugeruje, że taka nie powinna nastąpić, czyli błąd logiczny
Jak żyć?

Zacząłbym od przeszukania kodu, żeby ustalić która dokładnie funkcjonalność powoduje ten błąd, bo pole wiemy jak się nazywa, wiemy nawet co powoduje te wrzucenie daty minimalnej, powoduje błąd wrzucany do loga.

Dobra cze go nie wiem?

  • Jakie skutki ma ten błąd, proces jest przerwany, albo nieskończony,
  • Dlaczego wpisywana jest wartość minimalna daty, zamiast null-a,
  • Jaki jest sens tego żeby tam była wartość minimalna albo null bo to właściwe w tym przypadku to samo
Kolejny krok trzeba porozmawiać z kimś kto wie, czyli byznes.

No to błąd prosty do rozwiązania czy nie?


Jak widać nie koniecznie bo rozwiązanie proste typu zmiana typu w bazie lub poprawienie na minimalną datę zgodną z ms sql nie rozwiązuje problemu, wręcz przeciwnie tworzy nowe.

Tak więc pozostanie rozmowa z kimś, kto wie jak to ma działać, jak powinno działać. I naprawienie procesu. Czyli za małego błędu robi się góra lodowa, problem kryje się w głębi.
Dzięki temu, że przeprowadziliśmy analizę zagrożenia, a nie zaczęliśmy zmieniać kod może "uratowaliśmy świat".

Linki:


Brak komentarzy:

Prześlij komentarz

Błędna decyzja

Jest błąd w logu, pojawia się od dawna. Czas żeby się z nim zmierzyć , wygląda na prosty Błąd, posłużyłem się czatem gpt: System.Data.SqlTy...