Mam dane z 5 kolumnami, w których wiersz jest wypełniany danymi, a następnie zapisywany w bazie danych za pośrednictwem transakcji.
Podczas zapisywania zwracany jest błąd:
Konwersja typu danych datetime2 na typ danych datetime spowodowała przekroczenie zakresu
Oznacza to, jak czytano, że mój plik DateTime2
danych ma typ, a moja baza danych a DateTime
; to jest złe.
Kolumna daty ma następującą wartość DateTime
:
new DataColumn("myDate", Type.GetType("System.DateTime"))
Pytanie
Czy można to rozwiązać za pomocą kodu lub czy trzeba coś zmienić na poziomie bazy danych?
źródło
Może się to zdarzyć, jeśli nie przypiszesz wartości do pola DateTime, gdy pole nie przyjmuje wartości NULL .
To naprawiło to dla mnie!
źródło
Zarówno
DATETIME
iDATETIME2
odwzorowanie naSystem.DateTime
.NET - tak naprawdę nie można wykonać „konwersji”, ponieważ jest to naprawdę ten sam typ .NET.Zobacz stronę dokumentu MSDN: http://msdn.microsoft.com/en-us/library/bb675168.aspx
Istnieją dwie różne wartości „
SqlDbType
” dla tych dwóch - czy możesz podać te w swojejDataColumn
definicji?ALE: w SQL Server obsługiwany zakres dat jest zupełnie inny.
DATETIME
obsługuje 1753/1/1 do „wieczności” (9999/12/31), a jednocześnieDATETIME2
wspiera 0001/1/1 przez wieczność.Tak więc, co naprawdę musisz zrobić, to sprawdzić rok daty - jeśli jest on wcześniejszy niż 1753, musisz zmienić go na coś PO 1753, aby
DATETIME
kolumna w SQL Server mogła to obsłużyć.Marc
źródło
DtInit = new System.DateTime(1492, 10, 12),
zawodzi.W mojej bazie danych SQL Server 2008 miałem
DateTime
flagę oznaczoną jako nie zerowalna, ale zGetDate()
funkcją jako wartością domyślną. Podczas wstawiania nowego obiektu za pomocą EF4 wystąpił ten błąd, ponieważ nie przekazałem jawnie właściwości DateTime na mój obiekt. Spodziewałem się, że funkcja SQL obsłuży dla mnie datę, ale tak nie było. Moim rozwiązaniem było wysłanie wartości daty z kodu zamiast polegać na bazie danych w celu jej wygenerowania.źródło
Nullable<DateTime>
, aw kodzie mogę pozostawić to naprawdę puste (zamiast 01/01/0000). Byłem mile zaskoczony, widząc, że EF na SQL wiedział, że ignoruje wartość null na INSERT i używa daty z serwera (GetDate()
) ... Dla nas było to nawet lepsze, ponieważ potrzebowaliśmy lepszej spójności na serwerze, nie martwiąc się o różnice zegarowe między serwer WWW i serwer SQL.dla mnie to dlatego, że data i godzina były ...
w tym przypadku chcesz przypisać null do obiektu EF DateTime ... używając mojego kodu FirstYearRegistered jako przykładu
źródło
Ten doprowadzał mnie do szału. Chciałem uniknąć używania zerowej wartości daty i godziny (
DateTime?
). Nie miałem możliwość korzystania z SQL Server 2008 zadatetime2
typ alboW końcu zdecydowałem się na następujące:
źródło
[Column(TypeName = "datetime2")]
?Czasami EF nie wie, że ma do czynienia z kolumną obliczeniową lub wyzwalaczem . Z założenia operacje te ustawią wartość poza EF po wstawieniu.
Poprawka polega na określeniu
Computed
w EFedmx
dla tej kolumny weStoreGeneratedPattern
właściwości.Dla mnie to było, gdy kolumna miała wyzwalacz, który wstawił bieżącą datę i godzinę, patrz poniżej w trzeciej części.
Kroki, aby rozwiązać
W Visual Studio otwórz
Model Browser
stronę, aModel
następnieEntity Types
-> następnieStoreGeneratedPattern
Computed
W tej sytuacji innymi odpowiedziami są obejścia, ponieważ kolumna ma określić czas / datę, kiedy rekord został utworzony, a zadaniem SQL jest wykonanie wyzwalacza w celu dodania poprawnego czasu. Takich jak ten wyzwalacz SQL:
DEFAULT (GETDATE()) FOR [DateCreated]
.źródło
GETDATE()
co dosłownie wtedy zrobiłem. Ale ostatnio pojawił się komentarz, którego należy używaćSYSDATETIME()
do wszelkich operacji DateTime2, które uważam za prawdziwe.Natknąłem się na to i dodałem następujące elementy do mojej właściwości datetime:
źródło
using System.ComponentModel.DataAnnotations.Schema;
jest wymaganeJeśli nie przekażemy pola data-godzina-data, domyślna data {1/1/0001 12:00:00 AM} zostanie zatwierdzona.
Ale ta data nie jest zgodna z pracą ramki encji, więc spowoduje rzutowanie konwersji typu danych datetime2 na typ danych datetime, co spowoduje powstanie wartości spoza zakresu
Tylko
default DateTime.now
do pola daty, jeśli nie przekazujesz żadnej daty.źródło
Najłatwiej byłoby zmienić bazę danych, aby używała datetime2 zamiast datetime. Kompatybilność działa dobrze i nie dostaniesz błędów.
Nadal będziesz chciał przeprowadzić wiele testów ...
Błąd prawdopodobnie wynika z tego, że próbujesz ustawić datę na rok 0 lub coś takiego - ale wszystko zależy od tego, gdzie masz kontrolę nad zmianą.
źródło
Znalazłem ten post, próbując dowiedzieć się, dlaczego wciąż pojawia się następujący błąd, który jest wyjaśniony przez inne odpowiedzi.
Konwersja typu danych datetime2 na typ danych datetime spowodowała przekroczenie zakresu.
Użyj zerowalnego obiektu DateTime.
Data publiczna? Data zakupu {get; zestaw; }
Jeśli używasz struktury encji Ustaw właściwość zerowalną w pliku edmx na True
źródło
Jak już zauważył andyuk , może się to zdarzyć, gdy wartość NULL zostanie przypisana do niezerowalnego pola DateTime . Rozważyć zmianę DateTime na DateTime? lub Nullable < DateTime >. Należy pamiętać, że w przypadku korzystania z właściwości zależności należy również upewnić się, że typ właściwości zależności jest również dopuszczalnym typem wartości DateTime.
Poniżej znajduje się prawdziwy przykład niepełnego DateTime to DateTime? dostosowanie typu, które podnosi dziwne zachowanie
źródło
Entity Framework 4 działa z typem danych datetime2, więc w db odpowiednim polem musi być datetime2 dla SQL Server 2008.
Aby uzyskać rozwiązanie, istnieją dwa sposoby.
źródło
Utworzono klasę bazową na podstawie implementacji @ sky-dev. Można to łatwo zastosować do wielu kontekstów i podmiotów.
Stosowanie:
źródło
Dodaj niżej wymieniony atrybut do właściwości w swojej klasie modelu.
Początkowo zapomniałem dodać ten atrybut. Tak więc w mojej bazie danych zostało utworzone ograniczenie
i dodałem ten atrybut i zaktualizowałem moją bazę danych, a następnie zmieniłem ją na
źródło
W moim przypadku przesyłaliśmy datę do daty i godziny i otrzymaliśmy ten błąd. Co się dzieje, że Data ma „bardziej zorientowane na programistę” minimum 01/01/0001, podczas gdy Datetime utknął na 1753
Połącz to z błędem gromadzenia danych z naszej strony, a otrzymasz wyjątek!
źródło
Czasami działa dobrze na komputerach programistycznych, a nie na serwerach. W moim przypadku musiałem podać:
W pliku web.config.
Strefa czasowa na komputerze (serwerze) była odpowiednia (do ustawień regionalnych CO), ale aplikacja internetowa nie. To ustawienie zostało wykonane i znowu działało poprawnie.
Oczywiście wszystkie daty miały wartość.
:RE
źródło
Dodanie tego kodu do klasy w ASP.NET działało dla mnie:
źródło
Mam świadomość tego problemu i wszyscy też powinniście być:
https://en.wikipedia.org/wiki/Year_2038_problem
W SQL utworzono nowy typ pola, aby uniknąć tego problemu (datetime2).
Ten typ pola „Data” ma te same wartości zakresu, co klasa .Net DateTime. Rozwiąże wszystkie twoje problemy, więc myślę, że najlepszym sposobem na jego rozwiązanie jest zmiana typu kolumny bazy danych (nie wpłynie to na dane w tabeli).
źródło
Sprawdź następujące dwa: 1) To pole nie ma wartości NULL. Na przykład:
Zamień na:
2) Nowa baza danych ponownie. Na przykład:
źródło
Problem z odziedziczonym atrybutem daty i godziny
Ten komunikat o błędzie jest często wyświetlany, gdy pole daty, która nie ma wartości zerowej, ma wartość null w czasie wstawiania / aktualizacji. Jedną z przyczyn może być dziedziczenie.
Jeśli twoja data jest dziedziczona z klasy podstawowej i nie wykonasz mapowania, EF nie odczyta jego wartości.
Aby uzyskać więcej informacji: https://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-3-table-per-concrete-type-tpc-and- wytyczne dotyczące wyboru strategii
źródło
Widziałem ten błąd, gdy chciałem edytować stronę przy użyciu ASP.Net MVC. Podczas tworzenia nie miałem problemu, ale aktualizacja bazy danych spowodowała, że moja właściwość DateCreated była poza zasięgiem!
Jeśli nie chcesz, aby twoja
DateTime
właściwość miała wartość Nullable i nie chcesz sprawdzać, czy jej wartość należy do zakresu DateTime sql (i@Html.HiddenFor
to nie pomaga!), Po prostu dodajstatic DateTime
pole w pokrewnej klasie (Controller) i podaj jej wartość, gdy GET działa, a następnie użyj go, gdy POST wykonuje swoją pracę:źródło
Wystąpił ten problem w prostym projekcie aplikacji konsoli i moim szybkim rozwiązaniem jest przekonwertowanie wszelkich możliwych dat datetime2 na zerowy datetime, uruchamiając tę metodę:
Z pewnością nie jest to całkowicie kompleksowa metoda, ale działała na moje potrzeby i być może pomoże innym!
źródło
Sprawdź format wymagań w DB. np. moja DB ma wartość domyślną lub Binding
(((1)/(1))/(1900))
źródło
będziesz miał kolumnę daty, która została ustawiona tak, by zmniejszać minimalną wartość dozwolonego czasu, np. 1/1/1001.
aby przezwyciężyć ten problem, możesz ustawić odpowiednią wartość daty / godziny dla właściwości ur i ustawić inną magiczną właściwość, taką jak IsSpecified = true.
źródło