DateTime FormatException Problem auf Windows Server 2003 x64
-
Hallo,
also erstmals hallo und schöne Grüsse aus Wien
Ich habe folgendes Problem: Auf meinem normalen x86 Betreibssystem Windows XP kann ich folgenden Code ohne Probleme ausführen:
DataTable dt = new DataTable(); dt.Columns.Add("EXPIRY", typeof(DateTime)); dr["EXPIRY"] = DateTime.Parse("11.11.2005");
Wenn ich den Code jedoch auf einem Windows Server 2003 (64bit) ausführe, bekomme ich in der Zeile
dr["EXPIRY"] = DateTime.Parse("11.11.2005");
immer eine System Format Exception.
Hat wer eine Ahnung worans liegt?
-
Lass mich raten, dein XP System ist deutsch, und dein Win2k3 englisch(bzw. nicht deutschsprachig) oder?
Du kannst, bzw musst wenn du solche länderspezifischen Eingaben machst, immer einen IFormatProvider als zweiten Parameter mitgeben der die Culture beschreibt.
-
Zwergli schrieb:
Du kannst, bzw musst wenn du solche länderspezifischen Eingaben machst, immer einen IFormatProvider als zweiten Parameter mitgeben der die Culture beschreibt.
Oder, in diesem speziellen Fall, ganz auf den String verzichten und stattdessen lieber den 'DateTime'-Konstruktor zur Angabe eines Datums verwenden.
-
Hallo & vielen Dank für die Antworten.
Ich habe das Problem nun mit
dr["EXPIRY"] = DateTime.Parse("11.11.2005", new CultureInfo("de-DE", true));
gelöst. So funktioniert es auch
Leider haut das Programm (die Programme) generell nicht ganz hin, aber nicht mehr wegen diesem Fehler. Ich versuche mal das Problem zu beschreiben.
Also, ich habe eine *.exe die mittels einer Drittanbieter API Kurse ausliest und diese dann in eine SQL 2005 Datenbank reinschreibt.
Eine andere Applikation legt Depencies auf die entsprechende Tabelle an, die bei Veränderungen in der Datenbank die UI der Applikation updated.
Interessanterweise laufen beide Applikationen, wenn sie alleine laufen, ohne Probleme. Sobald aber beide gleichzeitig laufen (also wie vorgesehen), kommen seltsame DW20.EXE Fehlermeldungen bzw. Visual C++ Érror-Fenster mit kryptischen Fehlermeldungen - so quasi das unhandled exceptions auftreten blabla.
Auf meinem Rechner zuhause laufen beide Applikationen gleichzeitig ohne Probleme - da verwende ich allerdings die SQL 2005 Express Edition.
Ich nehme an, das es was mit dem gleichzeitigen Datenbank-Zugriff zu tun hat. Der SQL 2005 Server auf dem Windows Server 2003 System scheint diesen "gleichzeitigen" Zugriff bzw. irgendwas mit den Dependencies nicht zu verkraften bzw. ist nicht richtig konfiguriert (Rechte?!?).
Weiss da jemand Bescheid?
Edith sagt mir, das ich das lieber ins DB Forum stellen sollte.
-
flotschie schrieb:
Ich habe das Problem nun mit
dr["EXPIRY"] = DateTime.Parse("11.11.2005", new CultureInfo("de-DE", true));
gelöst.
Steht das so hartcodiert im Code? Sorry, aber das ist Schrott. Verwende für solche Werte wenn überhaupt ne InvariantCulture. Sonst wäre das genauso, als würdest Du Deine Bezeichner auf Deutsch (oder Swaheli) benennen statt auf Englisch.
-
Hm es steht nicht exakt so im code, statt dem Datum steht ein String[] Array, ,also so schauts aus:
dr["EXPIRY"] = DateTime.Parse(info[4], new CultureInfo("de-DE", true));
Ändert das was?
-
flotschie schrieb:
Hm es steht nicht exakt so im code, statt dem Datum steht ein String[] Array, ,also so schauts aus:
dr["EXPIRY"] = DateTime.Parse(info[4], new CultureInfo("de-DE", true));
Ändert das was?
Nö. Es geht einfach darum, dass man hartcodierte Infos „kulturneutral“ ablegt. Also im Falle von Daten möglichst im international genormten Format (ISO-Standard 8601) und dann halt mit der 'CultureInfo.InvariantCulture' geparst. Also z.B. folgendermaßen:
const string dt = "2007-08-04 14:55:00"; // Geburtstag eines wertvollen Menschen. ;-) DateTime d = DateTime.Parse(dt, System.Globalization.CultureInfo.InvariantCulture);
Das allgemeine Format ist hierbei jjjj-mm-dd hh
ss. Für mehr Infos siehe http://en.wikipedia.org/wiki/ISO_8601
-
ok danke. Das Problem ist halt, ich habe einen String Array, an dessen Stelle 4 immer ein Datum im Format "tt.mm.jjjj" steht. Ich fülle einen Datatable in einer Schleife mit den Informationen aus dem Array.
Das heisst, ich kann nirgendwo schreiben
const string dt = "2007-08-04 14:55:00";
weil der Array von einem *.txt file befüllt wird, in dem immer was anderes drinnstehen kann. Kurz gesagt: ich tu das Datum nirgendwo hardcoden.
Oder hast du das nur als Beispiel gebracht, und soll ich dann so vorgehen:
DateTime d = DateTime.Parse(info[4], System.Globalization.CultureInfo.InvariantCulture); dr["EXPIRY"] = d;
?
-
flotschie schrieb:
Kurz gesagt: ich tu das Datum nirgendwo hardcoden.
Okay, dann gilt das von mir gesagte nicht unbedingt. Wobei es natürlich auch beim Ablegen von Daten in externen Dateien bzw. Datenbanken durchaus gut wäre, ein portables Format zu verwenden und kein länderspezifisches. Aber ich kenne Deine Anforderungen nicht, von daher kann es gut sein, dass die Formatwahl bei Dir die richtige ist.