Unbehandelte Ausnahme - Ungültige Konvertierung - Problem

  • VB.NET

Es gibt 23 Antworten in diesem Thema. Der letzte Beitrag () ist von Humax.

    Unbehandelte Ausnahme - Ungültige Konvertierung - Problem

    Hallo, habe unter Visual Basic 2010 Express ein Programm erstellt, welches auf mehreren Computern mit unterschiedlichen Betriebssystemen läuft. Es lief bisher unter XP, Vista, WIN7 32Bit und WIN7 64BIT Problemlos.

    Seit ein paar Tagen bekommt ein Anwender unter Vista (nur er, bei allen anderen auch bei mir im Debugging funktioniert das Programm tadellos) eine Unbehandelte Ausnahme: Ungültige Konvertierung von der Zeichenfolge 01.01.1880 in Typ Date.
    Die Stelle an der der Fehler auftritt, wird bei jedem Programmstart durchlaufen.

    Als ich das Programm geschrieben hab war der Code naja sagen wir mal unsauber und sah so aus:

    VB.NET-Quellcode

    1. MonthCalendar1.MinDate = "01.01.1880"


    Ich habe es nun abgeändert auf:

    VB.NET-Quellcode

    1. MonthCalendar1.MinDate = CDate("01.01.1880")


    Fehler bleibt trotzdem bestehen.
    Ich kann das Datum natürlich auch im Designer einstellen und habe noch folgende Möglichkeit.

    VB.NET-Quellcode

    1. MonthCalendar1.MinDate = New System.DateTime(1880, 1, 1, 0, 0, 0, 0)


    Alllerdings habe ich den Fehler jetzt vorerst mal mit einem Try Catch abgefangen. Im weiteren Verlauf kommen dann immer wieder Fehler beim umwandeln in Typ Date
    z.B. bei:

    VB.NET-Quellcode

    1. mitglieder(1).abmeldedatum(a) = CDate(reader.ReadLine)



    Meine Fragen nun:
    1) Warum funktionierte das Programm bisher und jetzt nur auf einem PC nicht mehr
    2) Wie kann ich das Problem lösen

    Anmerkung: Die einzige Änderung die ich vorgenommen habe bevor das Programm lief und dann nicht mehr ist, dass ich mein Programm das unter VB Express 2010 erstellt wurde vor ein paar Tagen mit Visual Studio 2012 Express erstellt habe.

    Humax schrieb:

    2) Wie kann ich das Problem lösen

    Welches?

    Die Umwandlung von String in Date erwartet das Format, das auf dem Rechner als Datumsformat eingestellt ist! Deswegen gibts dann zb schnell mal Probleme, wenn ein "deutsches" Programm auf einem US-Rechner läuft ... MDY vs DMY!

    Fehler löst man, indem man entweder nicht String zu Date konvertiert, oder indem man mit ParseExact das Format vorschreibt. Die erste Lösung (kein String nach Date wandeln) ist allerdings langfristig die bessere.

    Humax schrieb:

    1) Warum funktionierte das Programm bisher und jetzt nur auf einem PC nicht mehr
    Wo hat es denn vorher funktioniert?
    Hat es vorher genau so funktioniert?
    Lief es unter VB6?
    Hast Du Option strict On?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Option Strict = off
    Habe im #1 Post geschrieben auf welchen PCs / Betriebssystemen gelaufen ist, dort bisher tadellos.

    Unter VB6 weiss ich nicht.

    Was mit dem Reader eingelesen wird ist ein Date. Habe es vorher ja so reingeschrieben. Und die ganze Zeit wie folgt eingelesen

    VB.NET-Quellcode

    1. mitglieder(1).abmeldedatum(a) = reader.ReadLine




    Erst jetzt dann geändert auf:

    VB.NET-Quellcode

    1. mitglieder(1).abmeldedatum(a) = CDate(reader.ReadLine)


    Aber ohne Erfolg

    Kann es sein, dass dieser Nutzer eine von DE-de verschiedene Sprache auf seinem PC als Standard gesetzt hat?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Gib das Format und die CultureInfo mit an.

    VB.NET-Quellcode

    1. dim MyDateString = "08.01.1989"
    2. dim d as date = Date.ParseExact(MyDateString, "dd.mm.yyyy", New Globalization.CultureInfo("de-DE"))
    SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=

    Weil einfach, einfach zu einfach ist! :D

    RodFromGermany schrieb:


    Kann es sein, dass dieser Nutzer eine von DE-de verschiedene Sprache auf seinem PC als Standard gesetzt hat?
    Das müsste ich klären

    BiedermannS schrieb:


    Gib das Format und die CultureInfo mit an.


    Das werde ich probieren. Danke für den Tipp


    Ich habe jetzt mal meine Sprache auf Englisch (US) umgestellt und siehe da ich bekomme den Fehler auch. Jetzt kann ich bissl tüfteln.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Humax“ ()

    Hier nochmal, mit dem richtigen Format und Fehlerbehandlung:

    VB.NET-Quellcode

    1. Sub Main()
    2. Dim DatumsText As String = "01.04.2006"
    3. Dim d As New Date
    4. If Not Date.TryParseExact(DatumsText, "dd.MM.yyyy", New Globalization.CultureInfo("de-DE"), Globalization.DateTimeStyles.None, d) Then
    5. MsgBox("Datum im falschen Format!")
    6. 'Abbruch
    7. End
    8. End If
    9. MessageBox.Show(String.Format("{0}.{1}.{2}", d.Day.ToString, d.Month.ToString, d.Year.ToString))
    10. End Sub


    dd = Tag (2-Stellig)
    MM = Monat (2-Stellig)
    yyyy = Jahr (4-Stellig)

    Edit:
    CultureInfo
    Standard Format
    Custom Format
    SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=

    Weil einfach, einfach zu einfach ist! :D

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „BiedermannS“ ()

    BiedermannS schrieb:


    Gib das Format und die CultureInfo mit an.

    Visual Basic Quellcode

    1 dim MyDateString = "08.01.1989"
    2 dim d as date = Date.ParseExact(MyDateString, "dd.mm.yyyy", New Globalization.CultureInfo("de-DE"))

    Wenn ich jetzt mit:

    VB.NET-Quellcode

    1. dim test1 as string = reader.readline

    den Wert einlese, dann ist Test1 = 18.08.2010, was richtig ist.
    Wenn ich dann mit:

    VB.NET-Quellcode

    1. dim test as date = Date.ParseExact(test1, "dd.mm.yyyy", New Globalization.CultureInfo("de-DE"), Globalization.DateTimeStyles.None)

    umwandle erhalte = Test = "#1/18/2010 12:08:00 AM#". Dann hat er aus 18.08.2010 --> 18.01.2010 gemacht
    Hab ich in meinem zweiten Post geschrieben...

    BiedermannS schrieb:


    dd = Tag (2-Stellig)
    MM = Monat (2-Stellig)
    yyyy = Jahr (4-Stellig)

    Edit:
    CultureInfo
    Standard Format
    Custom Format



    Großes M, kleines m sind Minuten
    SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=

    Weil einfach, einfach zu einfach ist! :D
    Also ich hab beim Kollegen jetzt mal nachgefragt. Er hat Deutsch eingestellt. Dies zeigt mir auch meine Fehlerdetails an:

    PC Info (OSFullName): Microsoft® Windows Vista™ Home Premium
    PC Info (OSPlatform): Win32NT
    PC Info (OSVersion): 6.0.6002.131072
    PC Info (InstalledUICulture): de-DE

    Der Kollege hat auch noch einen Laptop mit Win7 dort funktioniert es einwandfrei. Es liegt also irgendwie an Vista. Er meinte auch, dass er es 100% sicher unter Vista schon benutzt hat und keine maßgeblichen Veränderungen am System vorgenommen hat.


    Ich habe jetzt aber folgendes Problem:
    Wenn ich einer Variable die als Date deklariert ist den Wert Nothing zuweise und mit Streamwriter z.B. in eine Textdatei speichere, wird nicht Nothing gespeichert sondern "00:00:00"
    Wenn ich dies dann wieder mit einem streamreader einlese und mit date.parse konvertiere wird aus dem gespeicherten Nothing (00:00:00) das heutige Datum. Wenn ich es mit date.parseexact einlesen bekomme ich den Fehler dass die Zeichenfolge als nicht gültiges Datetime erkannt wurde.

    Mit:

    VB.NET-Quellcode

    1. mitglieder(1).aufnahmedatum(a) = Date.ParseExact(reader.ReadLine, "dd.MM.yyyy", New Globalization.CultureInfo("de-DE"), Globalization.DateTimeStyles.None)


    Bekomme ich die Fehlermeldung, "die Zeichenfolge als nicht gültiges Datetime erkannt wurde."

    Mit:

    VB.NET-Quellcode

    1. mitglieder(1).aufnahmedatum(a) = Date.Parse(reader.ReadLine, New Globalization.CultureInfo("de-DE"), Globalization.DateTimeStyles.None)


    wird aus meinem leeren (Nothing - wird gespeichert als "00:00:00) gespeicherten Datum das heutige Datum

    Mit:

    VB.NET-Quellcode

    1. mitglieder(1).aufnahmedatum(a) = cdate(reader.readline)

    habe ich das Problem das es mit US Einstellungen halt nicht funktioniert

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Humax“ ()

    Von wo kommt denn das datum? Wenn du es selber in eine Datei schreibst, achte auf die richtige formatierung. Sowohl beim lesen, als auch beim schreiben.
    SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=

    Weil einfach, einfach zu einfach ist! :D
    ich denke ja, die ganze Persistierung ist vermurkst.
    ParseExact zB. funzt natürlich nur zuverlässig, wenn die Daten auch mit exakt dem Format geschrieben wurden.

    anneres Problem ist, dass Date eine Structure ist, und als solcher den Wert Nothing nicht annehmen kann, sondern stattdessen auf den Nullpunkt aller Zeiten gesetzt wird, und das ist 00:00:00.

    mit einem typisierten Dataset als Datenbasis bräuchte einen die länderspezifischen Einstellungen nicht zu kratzen: Die DataTable würde die Datum-Spalten als Date anbieten, und wie abgespeichert wird ist dem Programmierer ja egal - hauptsache richtig. Und auch das Structure-Problem wäre gelöst: Da stellt man AllowDbNull=True ein, und das Dataset kann ein nicht gesetztes Datum gesondert behandeln.

    gugge DB-Programmierung ohne Datenbank

    Aber ist natürlich bitter, dass auf diesem Holzweg schon so weit vorangeschritten wurde - das machtes sehr aufwändig, wennmans nu richtig machen will.
    Annererseits so weiter machen hieße, es falsch weitermachen...