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?

856voto

andyuk Punkte 36182

Dies kann passieren, wenn Sie einer Variablen keinen Wert zuweisen. DateTime Feld, wenn das Feld nicht akzeptiert NULL Werte.

Das war's für mich!

194voto

marc_s Punkte 701497

Sowohl die DATETIME y DATETIME2 Karte zu System.DateTime in .NET - Sie können nicht wirklich eine "Konvertierung" durchführen, da es sich um denselben .NET-Typ handelt.

Siehe die MSDN-Dokumentationsseite: http://msdn.microsoft.com/en-us/library/bb675168.aspx

Es gibt zwei verschiedene Werte für die " SqlDbType " für diese beiden - können Sie diese in Ihrem DataColumn Definition?

ABER: auf SQL Server ist der unterstützte Datumsbereich ganz anders.

DATETIME unterstützt 1753/1/1 bis "Ewigkeit" (9999/12/31), während DATETIME2 unterstützt 0001/1/1 bis in alle Ewigkeit.

Was Sie also wirklich tun müssen, ist, das Jahr des Datums zu überprüfen - wenn es vor 1753 liegt, müssen Sie es in etwas NACH 1753 ändern, damit die DATETIME Spalte in SQL Server, um sie zu behandeln.

Marc

41voto

Graham Punkte 3177

In meiner SQL Server 2008-Datenbank hatte ich eine DateTime Spalte als nicht löschbar gekennzeichnet, aber mit einem GetDate() Funktion als Standardwert. Beim Einfügen eines neuen Objekts mit EF4 erhielt ich diese Fehlermeldung, weil ich eine DateTime-Eigenschaft nicht explizit an mein Objekt übergeben habe. Ich hatte erwartet, dass die SQL-Funktion das Datum für mich übernimmt, aber das tat sie nicht. Meine Lösung bestand darin, den Datumswert aus dem Code zu senden, anstatt sich auf die Datenbank zu verlassen, die ihn generiert.

obj.DateProperty = DateTime.now; // C#

39voto

JGilmartin Punkte 7586

Für mich war es, weil die Uhrzeit

01/01/0001 00:00:00

In diesem Fall möchten Sie dem EF DateTime Object null zuweisen... als Beispiel dient mein FirstYearRegistered Code

DateTime FirstYearRegistered = Convert.ToDateTime(Collection["FirstYearRegistered"]);
if (FirstYearRegistered != DateTime.MinValue)
{
    vehicleData.DateFirstReg = FirstYearRegistered;
}

26voto

sky-dev Punkte 6050

Das hier hat mich verrückt gemacht. Ich wollte vermeiden, ein nullbares Datum zu verwenden ( DateTime? ). Ich hatte nicht die Möglichkeit, die SQL Server 2008 datetime2 Typ entweder

modelBuilder.Entity<MyEntity>().Property(e => e.MyDateColumn).HasColumnType("datetime2");

Ich habe mich schließlich für Folgendes entschieden:

public class MyDb : DbContext
{
    public override int SaveChanges()
    {
        UpdateDates();
        return base.SaveChanges();
    }

    private void UpdateDates()
    {
        foreach (var change in ChangeTracker.Entries<MyEntityBaseClass>())
        {
            var values = change.CurrentValues;
            foreach (var name in values.PropertyNames)
            {
                var value = values[name];
                if (value is DateTime)
                {
                    var date = (DateTime)value;
                    if (date < SqlDateTime.MinValue.Value)
                    {
                        values[name] = SqlDateTime.MinValue.Value;
                    }
                    else if (date > SqlDateTime.MaxValue.Value)
                    {
                        values[name] = SqlDateTime.MaxValue.Value;
                    }
                }
            }
        }
    }
}

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