Ich habe diesen Code verwendet, den ich geschrieben habe, und er funktioniert auf diese unklarste Weise. Ich möchte eine Zeile in die Datenbank einfügen, die zwei Spalten von DateTime enthält:
myrow.ApprovalDate = DateTime.Now
myrow.ProposedDate = DateTime.Now
Und doch erhalte ich beim Aktualisieren der Datenbank folgende Fehlermeldung:
SqlDateTime-Überlauf. Muss zwischen dem 1.1.1753, 12:00:00 Uhr und dem 31.12.19999, 23:59:59 Uhr liegen.
Ich habe sogar versucht, einen eingefügten Wert aus der Datenbank zu kopieren und ihn fest in das zu aktualisierende Objekt zu codieren:
// I copied this value from the DB
myrow.ApprovalDate = Convert.ToDateTime("2008-12-24 00:00:00.000");
Immer noch der gleiche Fehler, der seltsame Teil ist, dass der obige Trick für die erste Einfügung in die Datenbank funktioniert hat, aber von da an fehlgeschlagen ist. Irgendwelche Ideen, was los ist?
asp.net
linq-to-sql
sql-server-2008
Drew Noakes
quelle
quelle
Antworten:
A
DateTime
in C # ist ein Werttyp, kein Referenztyp und kann daher nicht null sein.DateTime.MinValue
Dies kann jedoch die Konstante sein, die außerhalb des Bereichs des Datentyps SQL Server liegtDATETIME
.Werttypen haben garantiert immer einen (Standard-) Wert (von Null), ohne dass dies immer explizit festgelegt werden muss (in diesem Fall DateTime.MinValue).
Schlussfolgerung ist, dass Sie wahrscheinlich einen nicht festgelegten DateTime-Wert haben, den Sie an die Datenbank übergeben möchten.
MSDN: DateTime.MinValue
In Bezug auf SQL Server
MSDN: SQL Server DateTime und SmallDateTime
Wenn Sie ein C #
DateTime
als Zeichenfolge an SQL übergeben, müssen Sie es wie folgt formatieren, um die maximale Genauigkeit beizubehalten und zu verhindern, dass der SQL Server einen ähnlichen Fehler auslöst.Update (8 Jahre später)
Erwägen Sie die Verwendung des SQL-
DateTime2
Datentyps, derDateTime
mit Datums-0001-01-01 through 9999-12-31
und Zeitbereich besser mit dem .net übereinstimmt00:00:00 through 23:59:59.9999999
MSDN datetime2 (Transact-SQL)
quelle
DateTime
Hinweis, dass C # nicht nullbar ist!Ich finde, dass die Verwendung der folgenden Funktionen für SQL-Min / Max-Daten nach vielen DB-bezogenen Fehlern recht gut funktioniert:
quelle
DateTime.MaxValue
und ein paar Zeckenunterschiede bestehenSqlDateTime.MaxValue.Value
. SQL Server 2014 und SQL Server 2016 (andere nicht überprüft) akzeptieren,DateTime.MaxValue
was - lustig genug - größer ist alsSqlDateTime.MaxValue.Value
.Seien Sie vorsichtig, wenn Sie eine .Net DateTime mit SqlDateTime.MinValue oder MaxValue vergleichen. Folgendes löst beispielsweise eine Ausnahme aus:
DateTime dte = new DateTime(1000, 1, 1); if (dte >= SqlDateTime.MinValue) //do something
Der Grund ist, dass MinValue eine SqlDateTime und keine DateTime zurückgibt. Daher versucht .Net, dte zum Vergleich in eine SqlDateTime zu konvertieren, und löst die Ausnahme aus, da es außerhalb des zulässigen SqlDateTime-Bereichs liegt.
Eine Lösung hierfür besteht darin, Ihre DateTime mit SqlDateTime.MinValue zu vergleichen. Wert .
quelle
SqlDateTime.MinValue.Value
oderSqlDateTime.MaxValue.Value
von denen beide vom Typ sindDateTime
. Ich weiß nicht, wann diese eingeführt wurden. Beachten Sie jedoch, dass zwischenDateTime.MaxValue
und ein paar Zeckenunterschiede bestehenSqlDateTime.MaxValue.Value
. SQL Server 2014 und SQL Server 2016 (andere nicht überprüft) akzeptierenDateTime.MaxValue
welche - lustig genug ist größer alsSqlDateTime.MaxValue.Value
.Der Code, den Sie für die beiden Spalten haben, sieht in Ordnung aus. Suchen Sie nach anderen Datums- / Uhrzeitspalten in dieser Zuordnungsklasse. Aktivieren Sie außerdem die Protokollierung im Datenkontext, um die Abfrage und die Parameter anzuzeigen.
DateTime wird auf c # 's 0 initialisiert - das ist 0001-01-01. Dies wird von linqtosql über das SQL-String-Literal '0001-01-01' an die Datenbank übertragen. SQL kann ab diesem Datum keine T-SQL-Datums- und Uhrzeitangabe analysieren.
Es gibt verschiedene Möglichkeiten, damit umzugehen:
quelle
Dieser Fehler tritt auf, wenn Sie versuchen, eine Variable vom Typ DateTime auf null zu setzen . Deklarieren Sie die Variable als nullbar, dh DateTime? . Dies wird das Problem lösen.
quelle
Um weniger Code zu schreiben, wird manchmal SQL Server verwendet, um Felder wie Datum, Uhrzeit und ID beim Einfügen festzulegen, indem der Standardwert für Felder auf
GETDATE()
oder gesetzt wirdNEWID()
.In solchen Fällen sollte die Eigenschaft " Automatisch generierter Wert" dieser Felder in Entitätsklassen auf "true" gesetzt werden.
Auf diese Weise müssen Sie keine Werte im Code festlegen (um den Energieverbrauch zu vermeiden !!!) und sehen diese Ausnahme nie.
quelle
Verwenden Sie die Erweiterungsmethode
quelle
Dies bedeutet normalerweise, dass anstelle des gewünschten Werts eine Null an die Abfrage gesendet wird. Sie können versuchen, den SQL Profiler auszuführen, um genau zu sehen, was von linq an SQL Server übergeben wird.
quelle
Normalerweise tritt diese Art von Fehler auf, wenn Sie DateTime konvertieren oder analysieren. Überprüfen Sie die Kalendereinstellung auf dem Server, auf dem die Anwendung gehostet wird, hauptsächlich die Zeitzone und das kurze Datumsformat, und stellen Sie sicher, dass die richtige Zeitzone für den Standort eingestellt ist. Hoffe, dies würde das Problem lösen.
quelle
Ich sehe das Gleiche. Der Fehler tritt nicht beim Einfügen einer Zeile, sondern bei einem Update auf. Die Tabelle, auf die ich verweise, enthält zwei DateTime-Spalten, von denen keine nullwertfähig ist.
Ich habe das Szenario darauf reduziert, die Zeile abzurufen und sofort zu speichern (keine Datenänderungen). Das Get funktioniert einwandfrei, aber das Update schlägt fehl.
Wir verwenden NHibernate 3.3.1.4000
quelle
Wenn Sie NHibernate verwenden, überprüfen Sie, ob die entsprechenden DateTime-Eigenschaften, die nullbar sind, in den Zuordnungen auf nullable gesetzt sind.
quelle
Wenn Sie Datetime wie DateTime auf null setzen? In Ihrem Modell wird keine Ausnahme ausgelöst. Ich habe das Problem in meinem Fall so gelöst
quelle
In meinem Fall Dieser Fehler wurde ausgelöst, da die Tabellendatumspalte nicht nullfähig ist
Wie nachstehend:
Create Table #TempTable( ... ApprovalDate datatime not null. ...)
Um diesen Fehler zu vermeiden, machen Sie ihn einfach nullfähig
Create Table #TempTable( ... ApprovalDate datatime null. ...)
quelle
DateTime.MinValue und DateTime.MaxValue
quelle