verwendetes Datenbanksystem: MySQL
Hi folks,
ich versuche ein Datum aus einer MySQL-DB auszulesen und in ein DateTime-Objekt zu parsen um Vergleiche anzustellen. Geparst wird bei mir vom String und sieht dann so aus
DateTime lastUpload = DateTime.Parse(reader[0].ToString());
Hier bekomme ich eine Fehlermeldung, dass das MySQL-DateTime-Objekt nicht zu DateTime geparst werden kann, wenn in der DB ein Wert wie "00:00:0000 00:00:00" (wurde bereits aufbereitet, kam imho als "00:00:00 - 00:00" rein) steht.
Das geht doch sicher auch eleganter bzw. fehlerunanfälliger, oder?
Viele Grüße
-f
Hallo memphis0815,
versuch es mal mit:
reader.GetDateTime(deinspaltenindex)
Gruß falangkinjau
Wenn man weiß, dass da ein DateTime kommt nimmt man
reader.GetDateTime(0);
Falls da null herauskommen kann muss man vielleicht ein nullable DateTime benutzen,
DateTime? dt = ....
Original von memphis0815
Das geht doch sicher auch eleganter bzw. fehlerunanfälliger, oder?
Viele Grüße
-f
Ja, indem man solchen Unsinn erst gar nicht in die Datenbank kommen lässt -> Sql Mode 'NO_ZERO_DATE' und 'NO_ZERO_IN_DATE' aktivieren bzw. gleich Strict Mode einschalten: http://dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html
Außerdem solltest du reader.GetDateTime() verwenden und einen Blick in die Connector/.NET-Doku werfen: http://dev.mysql.com/doc/refman/5.0/en/connector-net-using-datetime.html
Original von falangkinjau
Hallo memphis0815,versuch es mal mit:
reader.GetDateTime(deinspaltenindex)
Gruß falangkinjau
Das bringt nichts, da 0000-00-00 kein gültiges Datum ist und von der DateTime-Klasse nicht akzeptiert wird.
Thx für die Tipps erstmal.
Auf die Daten in der DB habe ich leider keinen Einfluss, da sie aus einem anderen Programm kommen.
Leider haben die Ratschläge bis jetzt zu keiner Lösung geführt. Jemand noch eine Idee?
Ich mache das so :
foreach (DataColumn col in rw.Table.Columns)
if (rw[col.ColumnName] is DBNull)
{
if (col.DataType == typeof(System.DateTime)) rw[col.ColumnName] = new DateTime(1800, 1, 1);
}
logindate = (DateTime)rw["usr_logindate"];
logoutdate = (DateTime)rw["usr_logoutdate"];
...
Grüße Bernd
Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3
Aus dem Link den ich gepostetet habe:
24.2.5.6.4. Handling Invalid Dates
Although it is strongly recommended that you avoid the use of invalid dates within your .NET application, it is possible to use invalid dates by means of the MySqlDateTime datatype.
The MySqlDateTime datatype supports the same date values that are supported by the MySQL server. The default behavior of Connector/NET is to return a .NET DateTime object for valid date values, and return an error for invalid dates. This default can be modified to cause Connector/NET to return MySqlDateTime objects for invalid dates.
To instruct Connector/NET to return a MySqlDateTime object for invalid dates, add the following line to your connection string:
Allow Zero Datetime=True
Please note that the use of the MySqlDateTime class can still be problematic. The following are some known issues:
- Data binding for invalid dates can still cause errors (zero dates like 0000-00-00 do not seem to have this problem).
- The ToString method return a date formatted in the standard MySQL format (for example, 2005-02-23 08:50:25). This differs from the ToString behavior of the .NET DateTime class.
- The MySqlDateTime class supports NULL dates, while the .NET DateTime class does not. This can cause errors when trying to convert a MySQLDateTime to a DateTime if you do not check for NULL first.
Because of the known issues, the best recommendation is still to use only valid dates in your application.
Oder du probierst reader.GetString() und DateTime.TryParse.