Używałem tego fragmentu kodu, który napisałem i działa on w ten najbardziej niejasny sposób. Chcę wstawić wiersz do bazy danych, który zawiera dwie kolumny DateTime:
myrow.ApprovalDate = DateTime.Now
myrow.ProposedDate = DateTime.Now
A jednak kiedy aktualizuję bazę danych otrzymuję taki błąd:
Przepełnienie SqlDateTime. Musi być między 01.01.1753 00:00 a 31.12.19999 11:59:59.
Próbowałem nawet skopiować wstawioną wartość z bazy danych i zakodować ją na stałe w aktualizowanym obiekcie:
// I copied this value from the DB
myrow.ApprovalDate = Convert.ToDateTime("2008-12-24 00:00:00.000");
Wciąż ten sam błąd, dziwna część polega na tym, że powyższa sztuczka zadziałała dla pierwszego wstawienia do bazy danych, ale od tego momentu zawiodła. Jakieś pomysły, co się dzieje?
asp.net
linq-to-sql
sql-server-2008
Drew Noakes
źródło
źródło
Odpowiedzi:
A
DateTime
w C # jest typem wartości, a nie typem referencyjnym, w związku z czym nie może mieć wartości null. Może to być jednak stała,DateTime.MinValue
która jest poza zakresemDATETIME
typu danych Sql Servers .Typy wartości zawsze mają (domyślną) wartość (zero) bez konieczności ich jawnego ustawiania (w tym przypadku DateTime.MinValue).
Wniosek jest taki, że prawdopodobnie masz nieustawioną wartość DateTime, którą próbujesz przekazać do bazy danych.
MSDN: DateTime.MinValue
Odnośnie serwera Sql
MSDN: Sql Server DateTime i SmallDateTime
Na koniec, jeśli przekażesz C #
DateTime
jako ciąg do sql, musisz sformatować go w następujący sposób, aby zachować maksymalną precyzję i zapobiec wyrzucaniu przez serwer sql podobnego błędu.Aktualizacja (8 lat później)
Rozważ użycie
DateTime2
typu danych sql, który lepiej pasuje do .netDateTime
z zakresem dat0001-01-01 through 9999-12-31
i zakresem czasu00:00:00 through 23:59:59.9999999
MSDN datetime2 (Transact-SQL)
źródło
DateTime
braku wartości null w C #!Uważam, że użycie następujących elementów działa całkiem dobrze w przypadku dat minimalnych / maksymalnych SQL po wielu błędach związanych z bazą danych:
źródło
DateTime.MaxValue
a i jest kilka różnicSqlDateTime.MaxValue.Value
. SQL Server 2014 i SQL Server 2016 (nie sprawdzałem innych) akceptują,DateTime.MaxValue
który - co zabawne - jest większy niżSqlDateTime.MaxValue.Value
.Uważaj podczas porównywania .Net DateTime z SqlDateTime.MinValue lub MaxValue. Na przykład poniższy przykład zgłosi wyjątek:
DateTime dte = new DateTime(1000, 1, 1); if (dte >= SqlDateTime.MinValue) //do something
Powodem jest to, że MinValue zwraca SqlDateTime, a nie DateTime. Dlatego .Net próbuje przekonwertować dte na SqlDateTime w celu porównania, a ponieważ znajduje się poza dopuszczalnym zakresem SqlDateTime, zgłasza wyjątek.
Jednym z rozwiązań jest porównanie DateTime z SqlDateTime.MinValue. Wartość .
źródło
SqlDateTime.MinValue.Value
lubSqlDateTime.MaxValue.Value
obu typówDateTime
. Nie wiem, kiedy te zostały wprowadzone. Należy jednak pamiętać, że międzyDateTime.MaxValue
a i jest kilka różnicSqlDateTime.MaxValue.Value
. SQL Server 2014 i SQL Server 2016 (nie sprawdzałem innych) akceptują toDateTime.MaxValue
- wystarczająco zabawne jest większe niżSqlDateTime.MaxValue.Value
.Kod, który masz dla dwóch kolumn, wygląda dobrze. Poszukaj innych kolumn z datą i godziną w tej klasie mapowania. Włącz również logowanie w kontekście danych, aby wyświetlić zapytanie i parametry.
DateTime jest inicjowany na 0 C # - czyli 0001-01-01. Jest to przesyłane przez linqtosql do bazy danych za pośrednictwem literału ciągu sql: „0001-01-01”. Sql nie może przeanalizować daty i godziny T-Sql od tej daty.
Można sobie z tym poradzić na kilka sposobów:
źródło
Ten błąd występuje, jeśli próbujesz ustawić zmienną typu DateTime na null . Zadeklaruj zmienną jako dopuszczającą wartość null, tj. DateTime? . To rozwiąże problem.
źródło
Czasami, aby napisać mniej kodu, używa się serwera SQL do ustawiania pól, takich jak data, godzina i identyfikator podczas wstawiania, ustawiając domyślną wartość pól na
GETDATE()
lubNEWID()
.W takich przypadkach właściwość Wartość automatycznie generowana tych pól w klasach jednostek powinna mieć wartość true.
W ten sposób nie musisz ustawiać wartości w kodzie (zapobieganie zużyciu energii !!!) i nigdy nie widzisz tego wyjątku.
źródło
Użyj metody rozszerzenia
źródło
Zwykle oznacza to, że do zapytania jest wysyłana wartość null zamiast żądanej wartości, możesz spróbować uruchomić program SQL Profiler, aby zobaczyć dokładnie, co jest przekazywane do SQL Server z linq.
źródło
Zwykle ten rodzaj błędu pojawia się, gdy wykonujesz konwersję lub analizowanie daty i godziny. Sprawdź ustawienia kalendarza na serwerze, na którym jest hostowana aplikacja, głównie strefę czasową i format krótkiej daty, i upewnij się, że jest ustawiona odpowiednia strefa czasowa dla lokalizacji. Mam nadzieję, że to rozwiąże problem.
źródło
Widzę to samo. Błąd nie występuje przy wstawianiu wiersza, ale przy aktualizacji. tabela, do której się odwołuję, ma dwie kolumny DateTime, z których żadna nie dopuszcza wartości null.
Skończyłem scenariusz do pobrania wiersza i natychmiastowego zapisania go (bez zmian danych). Get działa dobrze, ale aktualizacja się nie udaje.
Używamy NHibernate 3.3.1.4000
źródło
Jeśli używasz NHibernate, sprawdź, czy odpowiednie właściwości DateTime, które mają wartość null, są ustawione na wartość null w mapowaniach.
źródło
Jeśli umieścisz wartość null Datetime, taką jak DateTime? w twoim modelu nie zgłasza wyjątku. rozwiązałem ten problem w moim przypadku
źródło
W moim przypadku ten błąd został zgłoszony, ponieważ kolumna daty tabeli nie może mieć wartości null
Jak poniżej:
Create Table #TempTable( ... ApprovalDate datatime not null. ...)
Aby uniknąć tego błędu, po prostu ustaw jego wartość zerową
Create Table #TempTable( ... ApprovalDate datatime null. ...)
źródło
DateTime.MinValue i DateTime.MaxValue
źródło