469 Stimmen

Konvertierung eines datetime2-Datentyps in einen datetime-Datentyp führt zu einem Wert außerhalb des zulässigen Bereichs

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, der außerhalb des zulässigen Bereichs lag

Es impliziert, wie gelesen, dass mein datatable einen Typ von DateTime2 und meine Datenbank eine DateTime ; das ist falsch.

Die Datumsspalte wird auf ein DateTime wie diese:

new DataColumn("myDate", Type.GetType("System.DateTime"))

Frage

Kann dies im Code gelöst werden oder muss etwas auf Datenbankebene geändert werden?

23voto

ΩmegaMan Punkte 26232

Manchmal weiß EF nicht, dass er es mit einem berechnete Spalte oder eine Auslöser . Bei diesen Operationen wird nach dem Einfügen ein Wert außerhalb von EF gesetzt.

Die Lösung besteht darin, Folgendes anzugeben Computed in EF's edmx für diese Spalte in der Datei StoreGeneratedPattern Eigentum.

Bei mir war es so, dass die Spalte einen Trigger hatte, der das aktuelle Datum und die Uhrzeit einfügte, siehe unten im dritten Abschnitt.


Schritte zur Lösung des Problems

Öffnen Sie in Visual Studio das Model Browser Seite dann Model dann Entity Types -> dann

  1. Wählen Sie die Entität und die Eigenschaft Datum/Zeit
  2. Wählen Sie StoreGeneratedPattern
  3. Eingestellt auf Computed

EF Model Browser Model Entity Type dialog


Für diese Situation sind andere Antworten Workarounds, denn der Zweck der Spalte ist es, eine Zeit/ein Datum anzugeben, wann der Datensatz erstellt wurde, und das ist die Aufgabe von SQL, einen Trigger auszuführen, um die richtige Zeit hinzuzufügen. Wie zum Beispiel dieser SQL-Trigger:

DEFAULT (GETDATE()) FOR [DateCreated] .

12voto

Rogala Punkte 2613

Ich stieß auf dieses Problem und fügte Folgendes zu meiner datetime-Eigenschaft hinzu:

 [Column(TypeName = "datetime2")]
 public DateTime? NullableDateTimePropUtc { get; set; }

10voto

Lijo Punkte 5634

Wenn wir keine Datumszeit an das Datumszeitfeld übergeben, wird das Standarddatum {1/1/0001 12:00:00 AM} übergeben.

Dieses Datum ist jedoch nicht mit dem Entity-Rahmenwerk kompatibel, so dass es zu einem Die Umwandlung eines Datentyps datetime2 in einen Datentyp datetime führte zu einem Wert, der außerhalb des zulässigen Bereichs lag

Einfach default DateTime.now in das Datumsfeld ein, wenn Sie kein Datum übergeben.

movie.DateAdded = System.DateTime.Now

8voto

Rob Farley Punkte 15180

Am einfachsten wäre es, Ihre Datenbank so zu ändern, dass sie datetime2 anstelle von datetime verwendet. Die Kompatibilität funktioniert einwandfrei, und Sie erhalten keine Fehler mehr.

Sie werden trotzdem eine Reihe von Tests durchführen wollen...

Die Fehlermeldung kommt wahrscheinlich daher, dass Sie versuchen, ein Datum auf das Jahr 0 oder so zu setzen - aber das hängt alles davon ab, wo Sie die Kontrolle haben, um etwas zu ändern.

4voto

stink Punkte 865

Ich habe diesen Beitrag gefunden, als ich versuchte herauszufinden, warum ich immer wieder den folgenden Fehler erhalte, der in den anderen Antworten erklärt wird.

Die Konvertierung eines datetime2-Datentyps in einen datetime-Datentyp führte zu einem Wert, der außerhalb des zulässigen Bereichs lag.

Verwenden Sie ein löschbares DateTime-Objekt.
public DateTime? PurchaseDate { get; set; }

Wenn Sie das Entity Framework verwenden Setzen Sie die Eigenschaft nullable in der edmx-Datei auf Wahr

Set the nullable property in the edmx file to **True**

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X