none
Probleme mit new DateTime() unter macOS

    Frage

  • Hallo,

    ich habe eine Silverlight-Anwendung, die OOB läuft. Leider unter macOS habe ich das Problem, dass ich bei bestimmten Datenbankabfragen Fehlermeldungen bekomme, nämlich wenn ich mit new DateTime(2017, 10, 1); das Datum für die Datenbankabfrage erzeuge, bekomme folgende Fehlermeldung:

    Fehler beim Konvertieren einer Zeichenfolge in ein Datum und/oder einer Zeit.

    Habe dann herausbekommen dass new DateTime(2017, 10, 1); folgende Datum erzeugt: 01.10.17

    Woran kann es liegen, da unter Windows es ohne Probleme funktioniert! 


    Gruesse, NUNUI

    Dienstag, 5. September 2017 18:28

Antworten

  • Hi,

    das liegt ganz einfach daran, dass Du versuchst, einen String in ein SQL Statement einzubauen, um Werte zu übergeben. Das ist aus verschiedenen Gründen schlecht.

    Zum einen handelst Du dir damit SQL Injection Probleme ein.

    Zum anderen wirst Du immer auf Probleme wie das aktuelle stoßen, sei es bei Zahlen, bei Datumswerten, ...

    Arbeite mit Parametern und nicht mit Stringverkettungen.

    SqlConnection connection = new SqlConnection( "<ConnectionString>" );
    connection.Open();
    
    SqlCommand command  = new SqlCommand( "SELECT ... FROM Tabelle WHERE Datumsfeld BETWEEN @Start AND @Ende", connection );
    
    command.Parameters.AddWithValue( "@Start", Datum );
    command.Parameters.AddWithValue( "@Ende",  Datum.AddMonaths( 1 ) );
    
    ...
    
    connection.Close();
    connection.Dispose();


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Mittwoch, 6. September 2017 09:20

Alle Antworten

  • Hi,

    was sollte denn auch sonst für ein Datum bei new DateTime( 2017, 10, 1 ) rauskommen? (Allerdings wird das nicht "01.10.17" erzeugen, sondern eben ein Datum diesen Werts.)

    Und was hat das mit der Fehlermeldung zu tun? Die spricht von einer Zeichenfolge, nicht von einem Konstruktoraufruf.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Dienstag, 5. September 2017 20:48
  • Hallo Stefan,

    Danke für die Antwort. Das ist auch genau das Problem. Unter Windows funktioniert es ohne Problem aber unter macOS bekomme ich die Fehlermeldung. Ich bekomme bei dem Befehl 

    MessageBox.Show((new DateTime(abfrageDatum.Year, 12, 10)).ToString());

    folgende Ausgabe:

    10.12.17 01:00:00 +01:00

    Und deswegen auch meine Frage!


    Gruesse, NUNUI

    Dienstag, 5. September 2017 22:08
  • Hi,

    das mag sein aber mit dem Fehler hat das immer noch nichts zu tun.

    Das Datum hat mit deiner Ausgabe nichts zu tun.

    Wichtiger wäre, bei welchem Code dieser Fehler ausgelöst wird und was genau Du dort als Wert für den Filter in deiner SQL Abfrage annimmst.

    Solange Du uns das nicht beantwortest, können wir dir leider auch nicht helfen.

    Merke: Ein Datum ist kein String und umgekehrt ist ein String auch kein Datum. Der Inhalt kann, wenn man das als Zeichenfolge ausgibt, ähnlich oder auch gleich aussehen. Dasselbe ist es aber dennoch nicht.

    Falls Du also der irrigen Annahme bist, dass das Datumsformat bei der Ausgabe als String auf jedem System gleich aussehen sollte, möchte ich dir versichern, dass das bei weitem nicht der Fall ist. Da musst Du nur mal mit anderen Ländereinstellungen (bspw. einem englischen Windows) arbeiten, dann hast Du nochmal komplett andere Datums- (und auch Zahlen-)formate.

    Arbeite daher immer mit den richtigen Datentypen und nicht mit Stringentsprechungen, wenn Du die nicht selbst konvertiert hast, da Du nur so das Format (zumindest in den meisten Teilen) vorgeben kannst.

    So oder so: Es wäre sinnvoll und hilfreich, wenn Du uns zuerst mal zeigst, wo genau (Code) welcher Fehler (bitte die exakte und vollständige Fehlermeldung) kommt.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community


    • Bearbeitet Stefan Falz Mittwoch, 6. September 2017 05:35
    Mittwoch, 6. September 2017 05:34
  • Erstmal Danke für die ausführliche Erklärung.

    Meine Select-Abfrage sieht wie folgt aus:

    DateTime abfrageDatum = new DateTime(aktuelleDatumVorStart.Year, aktuelleDatumVorStart.Month, 1);
    
    string command = "SELECT start, ende, betreff, inhalt FROM dbo.termin WHERE (start < CONVERT(DATETIME,'" +
    abfrageDatum.AddMonths(1) + "', 104)) AND (start >= CONVERT(DATETIME, '" + abfrageDatum + "', 104))";
    


    Und bekomme die Fehlermeldung:

    Fehler beim Konvertieren einer Zeichenfolge in ein Datum und/oder einer Zeit.
    

    Wie gesagt unter Windows gibt es keine Probleme aber unter MacOS bekomme den Fehler!



    • Bearbeitet Nunui Mittwoch, 6. September 2017 09:14
    Mittwoch, 6. September 2017 09:09
  • Hi,

    das liegt ganz einfach daran, dass Du versuchst, einen String in ein SQL Statement einzubauen, um Werte zu übergeben. Das ist aus verschiedenen Gründen schlecht.

    Zum einen handelst Du dir damit SQL Injection Probleme ein.

    Zum anderen wirst Du immer auf Probleme wie das aktuelle stoßen, sei es bei Zahlen, bei Datumswerten, ...

    Arbeite mit Parametern und nicht mit Stringverkettungen.

    SqlConnection connection = new SqlConnection( "<ConnectionString>" );
    connection.Open();
    
    SqlCommand command  = new SqlCommand( "SELECT ... FROM Tabelle WHERE Datumsfeld BETWEEN @Start AND @Ende", connection );
    
    command.Parameters.AddWithValue( "@Start", Datum );
    command.Parameters.AddWithValue( "@Ende",  Datum.AddMonaths( 1 ) );
    
    ...
    
    connection.Close();
    connection.Dispose();


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Mittwoch, 6. September 2017 09:20