[+/-]
MySQL und die .NET-Sprachen gehen unterschiedlich mit Datums-
und Uhrzeitinformationen um: MySQL erlaubt Datumswerte, die
von keinem .NET-Datentyp dargestellt werden können, wie etwa
'0000-00-00 00:00:00
'. Diese Unterschiede
können Probleme verursachen, wenn man nicht richtig damit
umgeht.
In diesem Abschnitt werden wir zeigen, wie Datums- und Uhrzeitinformationen mit Connector/NET korrekt behandelt werden.
Die Unterschiede in der Datumsbehandlung können Probleme
bereiten, wenn Entwickler ungültige Datumswerte verwenden.
Ungültige MySQL-Datumswerte, einschließlich
NULL
-Datumswerten, lassen sich nicht in
native DateTime
-Objekte von .NET laden.
Daher können DataSet
-Objekte von .NET
nicht mit der Fill
-Methode der Klasse
MySqlDataAdapter
gefüllt werden, da
ungültige Datumswerte eine
System.ArgumentOutOfRangeException
verursachen würden.
Datumsprobleme lassen sich am besten dadurch in den Griff bekommen, dass die Benutzer gar keine Möglichkeit erhalten, ungültige Datumswerte einzugeben. Dies lässt sich auf der Client- oder der Serverseite bewerkstelligen.
Um ungültige Datumswerte auf der Clientseite zu unterbinden,
müssen Sie die Datumswerte nur immer mit der .NET-Klasse
DateTime
behandeln. Diese erlaubt nämlich
nur gültige Datumswerte und stellt dadurch sicher, dass auch
in Ihre Datenbank nur gültige Werte gelangen. Leider kann man
sie jedoch nicht in einer gemischten Umgebung einsetzen, in
der die Datenbank sowohl mit .NET- als auch mit
Nicht-.NET-Code bearbeitet wird, da jede Anwendung ihre eigene
Datumsvalidierung vornehmen muss.
Auf MySQL 5.0.2 und höher können Sie den neuen SQL-Modus
traditional
einstellen, um ungültige
Datumswerte zu unterbinden. Informationen über diesen
SQL-Modus erhalten Sie unter traditional
,
Abschnitt 5.2.5, „Der SQL-Modus des Servers“.
Zwar raten wir von ungültigen Datumswerten in
.NET-Anwendungen ausdrücklich ab, aber es ist immerhin
möglich, ungültige Datumswerte über den Datentyp
MySqlDateTime
zu behandeln.
Der Datentyp MySqlDateTime
unterstützt
dieselben Datumswerte wie der MySQL Server. Standardmäßig
gibt Connector/NET für gültige Datumswerte ein
DateTime-Objekt von .NET und für ungültige Datumswerte einen
Fehler zurück. Diese Voreinstellung können Sie jedoch so
abändern, dass Connector/NET
MySqlDateTime
-Objekte für ungültige
Datumswerte zurückliefert.
Damit Connector/NET für ungültige Datumswerte ein
MySqlDateTime
-Objekt zurückgibt, fügen
Sie Ihrem Verbindungs-String folgende Zeile hinzu:
Allow Zero Datetime=True
Bitte beachten Sie, dass die Verwendung der Klasse
MySqlDateTime
immer problematisch sein
kann. Folgende Probleme sind bereits aufgetreten:
Die Datenbindung an ungültige Datumswerte kann trotz allem Fehler verursachen (Null-Datumswerte wie 0000-00-00 scheinen jedoch keine Schwierigkeiten zu bereiten).
Die ToString
-Methode gibt ein Datum im
MySQL-Standardformat zurück (zum Beispiel
2005-02-23 08:50:25
). Dieses
unterscheidet sich von dem
ToString
-Verhalten der .NET-Klasse
DateTime.
Die Klasse MySqlDateTime
unterstützt
NULL-Datumswerte, die .NET-Klasse DateTime hingegen nicht.
Das kann Fehler verursachen, wenn Sie versuchen, eine
MySQLDateTime in ein DateTime-Objekt zu konvertieren, ohne
sie zuvor auf NULL zu prüfen.
Wegen dieser bekannten Probleme lautet der beste Rat: Verwenden Sie bitte nur gültige Datumswerte Ihrer Anwendung.
Der .NET-Datentyp DateTime
kann mit
NULL
-Werten nicht umgehen. Daher müssen
Sie, wenn Sie Werte aus einer Anfrage an eine
DateTime
-Variable zuweisen, immer zuerst
prüfen, ob nicht ein NULL
-Wert vorliegt.
Wenn Sie einen MySqlDataReader
verwenden,
sollten Sie mit der Methode .IsDBNull
überprüfen, ob ein NULL
-Wert vorliegt,
bevor Sie die Zuweisung vornehmen:
Visual Basic-Beispiel
If Not myReader.IsDBNull(myReader.GetOrdinal("mytime")) Then myTime = myReader.GetDateTime(myReader.GetOrdinal("mytime")) Else myTime = DateTime.MinValue End If
C#-Beispiel
if (! myReader.IsDBNull(myReader.GetOrdinal("mytime"))) myTime = myReader.GetDateTime(myReader.GetOrdinal("mytime")); else myTime = DateTime.MinValue;
NULL
-Werte funktionieren nicht in einem
Dataset und können ohne Sonderbehandlung an Formularelemente
gebunden werden.
Dies ist eine Übersetzung des MySQL-Referenzhandbuchs, das sich auf dev.mysql.com befindet. Das ursprüngliche Referenzhandbuch ist auf Englisch, und diese Übersetzung ist nicht notwendigerweise so aktuell wie die englische Ausgabe. Das vorliegende deutschsprachige Handbuch behandelt MySQL bis zur Version 5.1.