Ich habe eine Datentabelle mit 5 Spalten, in der eine Zeile mit Daten gefüllt und dann über eine Transaktion in der Datenbank gespeichert wird.
Beim Speichern wird ein Fehler zurückgegeben:
Die Konvertierung eines Datetime2-Datentyps in einen Datetime-Datentyp führte zu einem Wert außerhalb des Bereichs
Beim Lesen bedeutet dies, dass meine Datentabelle einen Typ von DateTime2
und meine Datenbank a hat DateTime
. das ist falsch.
Die Datumsspalte ist DateTime
wie folgt eingestellt :
new DataColumn("myDate", Type.GetType("System.DateTime"))
Frage
Kann dies im Code gelöst werden oder muss etwas auf Datenbankebene geändert werden?
quelle
Dies kann passieren, wenn Sie einem DateTime- Feld keinen Wert zuweisen , wenn das Feld keine NULL- Werte akzeptiert .
Das hat es für mich behoben!
quelle
Sowohl die
DATETIME
als auch dieDATETIME2
Zuordnung zuSystem.DateTime
.NET - Sie können keine "Konvertierung" durchführen, da es sich tatsächlich um denselben .NET-Typ handelt.Siehe die MSDN-Dokumentseite: http://msdn.microsoft.com/en-us/library/bb675168.aspx
Es gibt zwei verschiedene Werte für das "
SqlDbType
" für diese beiden - können Sie diese in IhrerDataColumn
Definition angeben ?ABER: Unter SQL Server ist der unterstützte Datumsbereich ganz anders.
DATETIME
unterstützt 1753/1/1 bis "Ewigkeit" (9999/12/31), währendDATETIME2
0001/1/1 bis Ewigkeit unterstützt.Was Sie also wirklich tun müssen, ist das Jahr des Datums zu überprüfen. Wenn es vor 1753 liegt, müssen Sie es nach 1753 in etwas ändern, damit die
DATETIME
Spalte in SQL Server damit umgehen kann.Marc
quelle
DtInit = new System.DateTime(1492, 10, 12),
schlägt fehl.In meiner SQL Server 2008-Datenbank wurde eine
DateTime
Spalte als nicht nullbar markiert, jedoch mit einerGetDate()
Funktion als Standardwert. Beim Einfügen eines neuen Objekts mit EF4 wurde dieser Fehler angezeigt, weil ich keine DateTime-Eigenschaft für mein Objekt explizit übergeben habe. Ich habe erwartet, dass die SQL-Funktion das Datum für mich verarbeitet, aber das war nicht der Fall. Meine Lösung bestand darin, den Datumswert aus dem Code zu senden, anstatt sich bei der Generierung auf die Datenbank zu verlassen.quelle
Nullable<DateTime>
, und im Code kann ich dies wirklich null lassen (anstelle des 01.01.0000). Ich war angenehm überrascht zu sehen, dass EF to SQL wusste, dass diese Null auf dem INSERT ignoriert und das Datum vom Server verwendet werden sollte (GetDate()
) ... Für uns war dies sogar vorzuziehen, da wir eine bessere Konsistenz auf dem Server benötigten, ohne uns um Taktunterschiede zwischen zu sorgen der Webserver und der des SQL-Servers.für mich war es, weil die datetime war ..
In diesem Fall möchten Sie Ihrem EF DateTime-Objekt null zuweisen ... am Beispiel meines FirstYearRegistered-Codes
quelle
Dieser machte mich verrückt. Ich wollte vermeiden, eine nullbare Datumszeit (
DateTime?
) zu verwenden. Ich hatte auch nicht die Möglichkeit, dendatetime2
Typ von SQL Server 2008 zu verwendenIch entschied mich schließlich für Folgendes:
quelle
[Column(TypeName = "datetime2")]
?Manchmal weiß EF nicht, dass es sich um eine berechnete Spalte oder einen Trigger handelt . Diese Operationen setzen standardmäßig nach dem Einfügen einen Wert außerhalb von EF.
Der Fix besteht darin,
Computed
in EFsedmx
für diese Spalte in derStoreGeneratedPattern
Eigenschaft anzugeben .Für mich war es, als die Spalte einen Auslöser hatte, der das aktuelle Datum und die aktuelle Uhrzeit einfügte, siehe unten im dritten Abschnitt.
Schritte zum Auflösen
Öffnen Sie in Visual Studio die
Model Browser
Seite dannModel
dannEntity Types
-> dannStoreGeneratedPattern
Computed
In dieser Situation sind andere Antworten Problemumgehungen. In der Spalte wird zum Zeitpunkt der Erstellung des Datensatzes eine Uhrzeit / ein Datum angegeben. Dies ist die Aufgabe von SQL, einen Trigger auszuführen, um die richtige Zeit hinzuzufügen. Wie dieser SQL-Trigger:
DEFAULT (GETDATE()) FOR [DateCreated]
.quelle
GETDATE()
was ich damals buchstäblich tat. Aber es gab kürzlich einen Kommentar, den manSYSDATETIME()
für alle DateTime2-Operationen verwenden sollte, von denen ich glaube, dass sie wahr sind.Ich bin darauf gestoßen und habe meiner datetime-Eigenschaft Folgendes hinzugefügt:
quelle
using System.ComponentModel.DataAnnotations.Schema;
ist erforderlichWenn wir kein Feld für Datum und Uhrzeit übergeben, wird das Standarddatum {01.01.0001 00:00:00} übergeben.
Dieses Datum ist jedoch nicht mit Entity-Frame-Arbeiten kompatibel, sodass die Konvertierung eines Datetime2-Datentyps in einen Datetime-Datentyp zu einem Wert außerhalb des Bereichs führt
Nur
default DateTime.now
zum Datumsfeld, wenn Sie kein Datum übergeben.quelle
Am einfachsten wäre es, Ihre Datenbank so zu ändern, dass datetime2 anstelle von datetime verwendet wird. Die Kompatibilität funktioniert gut und Sie werden Ihre Fehler nicht bekommen.
Du wirst immer noch ein paar Tests machen wollen ...
Der Fehler liegt wahrscheinlich daran, dass Sie versuchen, ein Datum auf Jahr 0 oder so zu setzen - aber alles hängt davon ab, wo Sie die Kontrolle haben, um Dinge zu ändern.
quelle
Ich fand diesen Beitrag, um herauszufinden, warum ich immer wieder den folgenden Fehler bekam, der durch die anderen Antworten erklärt wird.
Die Konvertierung eines Datetime2-Datentyps in einen Datetime-Datentyp führte zu einem Wert außerhalb des Bereichs.
Verwenden Sie ein nullbares DateTime-Objekt.
public DateTime? Kaufdatum {get; einstellen; }}
Wenn Sie das Entity-Framework verwenden Setzen Sie die Eigenschaft nullable in der edmx-Datei auf True
quelle
Wie andyuk bereits betont hat, kann dies passieren, wenn einem nicht nullbaren DateTime- Feld ein NULL- Wert zugewiesen wird . Betrachten Sie Ändern Datetime zu Datetime? oder Nullable < DateTime >. Beachten Sie, dass Sie bei Verwendung einer Abhängigkeitseigenschaft auch sicherstellen sollten, dass der Typ Ihrer Abhängigkeitseigenschaft ebenfalls ein nullfähiger DateTime-Typ ist.
Unten sehen Sie ein reales Beispiel für eine unvollständige DateTime to DateTime? Typanpassung, die das ungerade Verhalten erhöht
quelle
Das Entity Framework 4 arbeitet mit dem Datentyp datetime2, sodass in db das entsprechende Feld datetime2 für SQL Server 2008 sein muss.
Um die Lösung zu erreichen, gibt es zwei Möglichkeiten.
quelle
Erstellt eine Basisklasse basierend auf der Implementierung von @ sky-dev. Dies kann also leicht auf mehrere Kontexte und Entitäten angewendet werden.
Verwendungszweck:
quelle
Fügen Sie das unten angegebene Attribut für die Eigenschaft in Ihrer Modellklasse hinzu.
Anfangs habe ich vergessen, dieses Attribut hinzuzufügen. Also in meiner Datenbank wurde die Einschränkung wie folgt erstellt
und ich habe dieses Attribut hinzugefügt und meine Datenbank aktualisiert, dann wurde es in geändert
quelle
In meinem Fall haben wir ein Datum in eine Datumszeit umgewandelt und diesen Fehler erhalten. Was passiert ist, dass Date ein "programmiererorientierteres" Minimum von 01/01/0001 hat, während Datetime bei 1753 steckt
Kombinieren Sie dies mit einem Datenerfassungsfehler unsererseits und Sie erhalten Ihre Ausnahme!
quelle
Manchmal funktioniert es gut auf Entwicklungsmaschinen und nicht auf Servern. In meinem Fall musste ich sagen:
In der Datei web.config.
Die Zeitzone auf dem Computer (Server) war richtig (zum CO-Gebietsschema), die Web-App jedoch nicht. Diese Einstellung wurde vorgenommen und es hat wieder gut funktioniert.
Natürlich hatten alle Daten einen Wert.
: D.
quelle
Das Hinzufügen dieses Codes zu einer Klasse in ASP.NET hat für mich funktioniert:
quelle
Ich bin mir dieses Problems bewusst und Sie alle sollten es auch sein:
https://en.wikipedia.org/wiki/Year_2038_problem
In SQL wurde ein neuer Feldtyp erstellt, um dieses Problem zu vermeiden (datetime2).
Dieser Feldtyp 'Datum' hat dieselben Bereichswerte wie eine DateTime .Net-Klasse. Es wird alle Ihre Probleme lösen, daher denke ich, dass der beste Weg, es zu lösen, darin besteht, Ihren Datenbankspaltentyp zu ändern (es hat keine Auswirkungen auf Ihre Tabellendaten).
quelle
Überprüfen Sie die folgenden zwei: 1) Dieses Feld hat keinen NULL-Wert. Zum Beispiel:
Ersetzen:
2) Neue Datenbank erneut. Zum Beispiel:
quelle
Problem mit dem geerbten datetime-Attribut
Diese Fehlermeldung wird häufig angezeigt, wenn ein nicht nullbares Datumsfeld zum Einfügen / Aktualisieren den Wert null hat. Eine Ursache kann die Vererbung sein.
Wenn Ihr Datum von einer Basisklasse geerbt wird und Sie keine Zuordnung vornehmen, liest EF den Wert nicht.
Für weitere Informationen: https://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-3-table-per-concrete-type-tpc-and- Auswahl-Strategie-Richtlinien
quelle
Ich habe diesen Fehler gesehen, als ich eine Seite mit ASP.Net MVC bearbeiten wollte. Ich hatte kein Problem beim Erstellen, aber beim Aktualisieren der Datenbank war meine DateCreated-Eigenschaft außerhalb des Bereichs!
Wenn Sie nicht möchten, dass Ihre
DateTime
Eigenschaft nullwertfähig ist, und nicht überprüfen möchten, ob ihr Wert im SQL-Bereich DateTime liegt (und@Html.HiddenFor
nicht hilft!), Fügen Sie einfach einstatic DateTime
Feld innerhalb der zugehörigen Klasse (Controller) hinzu und geben Sie den Wert an, wenn GET ist in Betrieb und wird dann verwendet, wenn POST seine Aufgabe erfüllt:quelle
Ich bin in einem einfachen Konsolen-App-Projekt auf dieses Problem gestoßen. Meine schnelle Lösung besteht darin, alle möglichen datetime2-Daten durch Ausführen dieser Methode in eine nullfähige datetime zu konvertieren:
Dies ist sicherlich keine vollständig umfassende Methode, aber sie hat für meine Bedürfnisse funktioniert und hilft vielleicht anderen!
quelle
Überprüfen Sie das Anforderungsformat in DB. zB hat meine DB Standardwert oder Bindung
(((1)/(1))/(1900))
quelle
Sie haben eine Datumsspalte, die auf lesathan gesetzt wurde, den Mindestwert der zulässigen Zeit wie 1/1/1001.
Um dieses Problem zu beheben, können Sie den richtigen Datum / Uhrzeit-Wert auf Ihre Eigenschaft setzen und eine andere magische Eigenschaft wie IsSpecified = true festlegen.
quelle