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?

1voto

David Alan Condit Punkte 1143

Ich lief in dieses Problem auf eine einfache Konsole app Projekt und meine schnelle Lösung ist zu konvertieren alle möglichen datetime2 Daten zu einem nullable datetime durch Ausführen dieser Methode:

static DateTime? ParseDateTime2(DateTime? date)
    {
        if (date == null || date.ToString() == "1/1/0001 12:00:00 AM")
        {
            return null;
        }
        else
        {
            return date;
        }
    }

Dies ist sicherlich keine umfassende Methode, aber für meine Bedürfnisse hat sie funktioniert, und vielleicht hilft sie ja auch anderen!

0voto

Manchmal funktioniert es auf Entwicklungsrechnern gut, auf Servern jedoch nicht. In meinem Fall musste ich :

<globalization uiCulture="es" culture="es-CO" />

In der Datei web.config.

Die Zeitzone auf dem Rechner (Server) stimmte (mit dem Gebietsschema CO), aber die Webanwendung nicht. Diese Einstellung getan und es funktionierte wieder gut.

Natürlich hatten alle Daten einen Wert.

D

0voto

Chris Punkte 4255

In meinem Fall waren wir Casting ein Datum zu einem Datetime und wir erhielten diesen Fehler. Date hat ein "programmiererorientiertes" Minimum von 01/01/0001, während Datetime bei 1753 hängen bleibt.

Kombinieren Sie dies mit einem Fehler bei der Datenerfassung unsererseits, und Sie erhalten Ihre Ausnahme!

0voto

Howie Krauth Punkte 41

Das Hinzufügen dieses Codes zu einer Klasse in ASP.NET hat bei mir funktioniert:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Properties<DateTime>().Configure(c => c.HasColumnType("datetime2"));
}

0voto

marcolomew Punkte 3

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 geschaffen, um dieses Problem zu vermeiden (datetime2).

Dieser 'Date'-Feldtyp hat die gleichen Wertebereiche wie eine DateTime .Net-Klasse. Es wird alle Ihre Probleme lösen, also denke ich, dass der beste Weg zur Lösung darin besteht, den Typ Ihrer Datenbankspalte zu ändern (es wird Ihre Tabellendaten nicht beeinflussen).

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