Laden...

Sortierte Ausgabe DATATABLE SELECT liefert falsche Ergebnisse

Erstellt von thesysde vor 2 Jahren Letzter Beitrag vor 2 Jahren 307 Views
T
thesysde Themenstarter:in
7 Beiträge seit 2015
vor 2 Jahren
Sortierte Ausgabe DATATABLE SELECT liefert falsche Ergebnisse

C# Datatable - Visual Studio 2019

Hallo!
Die Datenbank wurde so aufgebaut:
DataTable Tevent = new DataTable();
CultureInfo MyCultureInfo = new CultureInfo("de-DE");
Tevent.Locale = MyCultureInfo;
Tevent.Columns.Add("id", typeof(int));
Tevent.Columns.Add("Datum", typeof(DateTime));
Tevent.Columns.Add("Zeit", typeof(DateTime));

Ich lese eine XML Datei ein, wo ein Wert das amerikanische Datum hat:
Das bringe ich in das Feld DTdatum: DTdatum = DateTime.Parse(datum, CultureDE);
In DTdatum ist, wenn ich mir das im Debugger ansehe, ein deutsches Datum.
Und so wird es eingetragen:
Tevent.Rows.Add(Iid, DTdatum, DTzeit);

Später will ich einige Daten auswähle:
In Tactual steht ein deutsches Datum (laut Debugger).
DatumRows = Tevent.Select("datum = #" + Tactual.ToString("d", CultureDE) + "#");
Und was ist das Ergebnis?
Ein US sortiertes Datum.
Also z.B. 9.1.2021 statt 1.9.2021 - natürlich mit dem Wert, der vom 9.1. ist.

Was mache ich falsch?

mfg
Olaf

4.938 Beiträge seit 2008
vor 2 Jahren

Zuersteinmal: Ein Datumswert ist intern unabhängig von der Locale, sondern nur für die Ausgabe wird diese Locale (also z.B. deutsch, amerikansich, britisch, ...) verwendet.
Und der Debugger zeigt es dir in dem Format an, daß du bei Visual Studio als Sprache eingestellt hast.

Ich denke, dein Fehler liegt bei


DTdatum = DateTime.Parse(datum, CultureDE);

Wenn du in der XML-Datei ein amerikanisches Format hast, dann mußt du es auch mit einer amerikanischen ("en-us") Locale parsen.

Lesenswert außerdem: [FAQ] DateTime vs. DateTimeOffset und der Umgang mit Zeiten in .NET

T
thesysde Themenstarter:in
7 Beiträge seit 2015
vor 2 Jahren

Ja, da bin ich deiner Meinung.
Hatte mich letzte Nacht nochmal dran gesetzt und dann den Suchstring nun in en-US geändert und somit geht alles.
Das Einlesen der XML ging ja ohne Probleme, auch mit DTdatum = DateTime.Parse(datum, CultureDE);

Und der Tipp mit DT vs. TDO...
Ich habe im Programm schon ein Teil von DateTime benutzt.
Tactual = Tactual.AddDays(-1);
Das hatte ich mir schon vorher angesehen.

mfg
Olaf

16.827 Beiträge seit 2008
vor 2 Jahren

Ich habe im Programm schon ein Teil von DateTime benutzt.

Dann hast eben falsch angefangen 😉
Steht ausführlich in dem Link und in den Microsoft Docs, wieso DateTime keine gute Idee mehr ist - und wieso man DateTimeOffset verwenden sollte.
Kann man korrigieren.

Aber ja, wenn man sich die Grundlagen dazu nicht durchliest, dann verleitet IntelliSense leider einen, DateTime zu verwenden.
Sollte man aber nicht mehr.