Ostatnimi czasy miałem mały problem a raczej dwa gdzie jeden z nich nie został jeszcze do końca rozwiązany. W jednym z projektów korzystam z Entity Framework jako DAL do bazy danych. Pewnego dnia funkcja zwracająca dane przestała działać. Tak, po prostu, przestała działać. Podczas jej wywoływania dostaję wyjątek:
Co dziwne, wyjątek ten skutkuje jedynie bardzo dużym lagiem przy pobieraniu danych i tyle. Po około 3h szukania rozwiązania doszedłem do wniosku, że tą funkcję wywołam za pomocą obiektu DBCommand (dlaczego nie SQLCommand? ponieważ connectionString zwracany przez Entity jest typu DBConnection) tak aby zachować jedno i to samo połączenie do bazy danych. Na szybko napisałem wywołanie SQL z kodu bo czasu mało. Niby wszystko działa ale podczas testowania rozwiązania natknąłem się na dziwną sytuację. Moje obiekty typu DateTime zamiast przyjmować wartości NULL (są zaprojektowane jako Nullable) zaczęły ustawiać się na datę 01-01-0001!? Siedziałem kilka ładnych godzin patrząc się między innymi na tą oto linijkę:
Szybki test pomyślałem: WhenUpdatet = null; Sprawdzam… rzeczywiście jest NULL…. I w tym momencie znowu ta cholerna linijka… Ugryzłem się w język.. Wypowiedziałem kilka “słów” i ową błędną linijkę poprawiłem na:
Bije się po piersiach za to co zrobiłem i sam nie wiem dlaczego… Nie ma na to racjonalnego wytłumaczenia. Rozwiązanie mojego błędu polegało na tym, że sama metoda ToDateTime jeżeli dostaje wartość null zwraca DateTime.MinValue, którym jest 01-01-0001.
Wystrzegajcie się takich błędów… Ja zapamiętam to na bardzo długo :/ Problem z błędem pobrania danych z funkcji występuje nadal ale mam nadzieję, że w dość szybki sposób go rozwiąże. Zagadką jest to, że aplikacja napisana na szybko z boku jako osobny projekt, do którego dołączyłem Entity i zaimplementowałem wywołanie tej funkcji zadziałała prawidłowo. Nie wiem czy to czary, czy to przez to, że już po wakacjach, które i tak dopiero przede mną.
1 2 3 4 5 6 7 8 9 10 |
while(record.Read()) { var contract = new vContract() { ... WhenUpdated = Convert.ToDateTime(record["WhenUpdated"] != DBNull.Value ? record["WhenUpdated"] : (DateTime?)null), ... }; contractList.Add(contract); } |
1 |
WhenUpdated = record["WhenUpdated"] != DBNull.Value ? Convert.ToDateTime(record["WhenUpdated"]) : (DateTime?)null |
1 2 3 4 |
public static DateTime ToDateTime(object value) { return value == null? DateTime.MinValue: ((IConvertible)value).ToDateTime(null); } |