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?

0voto

RainyTears Punkte 103

Sehen Sie sich die beiden folgenden an: 1) Dieses Feld hat keinen NULL-Wert. Zum Beispiel:

 public DateTime MyDate { get; set; }

Ersetzen durch:

public DateTime MyDate { get; set; }=DateTime.Now;

2) Legen Sie die Datenbank erneut an. Zum Beispiel:

db=new MyDb();

0voto

FrankyHollywood Punkte 1199

Problem mit geerbtem datetime-Attribut

Diese Fehlermeldung wird häufig angezeigt, wenn ein nicht-nullbares Datumsfeld zum Zeitpunkt des Einfügens/Aktualisierens den Wert Null hat. Eine Ursache kann die Vererbung sein.

Wenn Ihr Datum von einer Basisklasse geerbt wird und Sie keine Zuordnung vornehmen, kann EF den Wert nicht lesen.

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-choosing-strategy-guidelines

0voto

mp3846 Punkte 100

Ich sah diesen Fehler, als ich eine Seite mit ASP.Net MVC bearbeiten wollte. Ich hatte kein Problem beim Erstellen, aber die Aktualisierung der Datenbank machte meine DateCreated Eigenschaft außerhalb des Bereichs!

Wenn Sie nicht wollen, dass Ihr DateTime Eigenschaft Nullable sein und nicht prüfen wollen, ob ihr Wert im sql DateTime-Bereich liegt (und @Html.HiddenFor nicht hilft!), fügen Sie einfach eine static DateTime Feld in der zugehörigen Klasse (Controller) und geben Sie ihm den Wert, wenn GET in Betrieb ist, und verwenden Sie ihn, wenn POST seine Arbeit erledigt:

public class PagesController : Controller
{
    static DateTime dateTimeField;
    UnitOfWork db = new UnitOfWork();

    // GET:
    public ActionResult Edit(int? id)
    {
        Page page = db.pageRepository.GetById(id);
        dateTimeField = page.DateCreated;
        return View(page);
    }

    // POST: 
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Edit(Page page)
    {
        page.DateCreated = dateTimeField;
        db.pageRepository.Update(page);
        db.Save();
        return RedirectToAction("Index");

    }
}

0voto

Überprüfen Sie das Anforderungsformat in der DB. z.B. hat meine DB einen Standardwert oder eine Bindung (((1)/(1))/(1900))

System.DateTime MyDate = new System.DateTime( 1900 ,1, 1);

enter image description here

0voto

Für mich habe ich eine Devexpress DateEdit Komponente, die zu nullable datetime MSSQL-Spalte durch die Nullable Modelleigenschaft gebunden wurde. Alles, was ich zu tun hatte, war Einstellung AllowNullInput = True auf DateEdit. Nachdem es "Standard" verursacht, dass das Datum 1.1.0001 erschien - NUR VOR dem Verlassen der DateEdit - und dann bekam ich diese Konvertierung Fehlermeldung wegen der nachfolgenden Anweisungen oben erwähnt.

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