Laden...

Klasse für DateTime.Picker

Erstellt von Markus1510 vor 2 Jahren Letzter Beitrag vor 2 Jahren 387 Views
M
Markus1510 Themenstarter:in
7 Beiträge seit 2021
vor 2 Jahren
Klasse für DateTime.Picker

Hallo zusammen,

ich habe folgenden Fehler erhalten.
Vielleicht kann mir hier jemand Helfen??

Grüße Markus

190 Beiträge seit 2012
vor 2 Jahren

Hallo
Dein Code ist sehr interessant 😉 Den Text aus dem DateTimePicker versuchst du in ein Integer umzuwandeln. Das kann nicht funktionieren, da dort irgendwas mit Zeit drin steht. Warum soll einsatzbeginn ein Integer sein? Ein DateTimeOffset wäre da bestimmt besser. Und das kannst du direkt aus DateTimePicker.Value übernehmen.
Schau dir mal die Doku an. DateTimePicker Klasse

  • Wer lesen kann, ist klar im Vorteil
  • Meistens sitzt der Fehler vorm Monitor
  • "Geht nicht" ist keine Fehlermeldung!
  • "Ich kann programmieren" != "Ich habe den Code bei Google gefunden"

GidF

M
Markus1510 Themenstarter:in
7 Beiträge seit 2021
vor 2 Jahren

Hallo,

das hab ich auch schon bemerkt das es nicht geht🙂
Hatte erst string davor ging auch nicht.

Will den Wert in eine Datenbank speichern hier habe ich Date genommen.

Grüße Markus

190 Beiträge seit 2012
vor 2 Jahren

Durchprobieren ist kein guter Weg. Beschäftige dich unbedingt mit den Grundlagen. Überlege dir, wie du einen Wert speicherst. Für Datum und Zeit nutzt man im allgemeinen DateTimeOffset.

  • Wer lesen kann, ist klar im Vorteil
  • Meistens sitzt der Fehler vorm Monitor
  • "Geht nicht" ist keine Fehlermeldung!
  • "Ich kann programmieren" != "Ich habe den Code bei Google gefunden"

GidF

T
2.224 Beiträge seit 2008
vor 2 Jahren

Und anstelle von String.Format zum bauen der Strings samt einfügen der Werte auch SqlParameter nutzen.
Sonst kannst du dir durch manipulierte Werte z.B. durch Strings einfach eine SQL Injection einfangen.
Schau dir dazu SqlParameter an!

Artikel dazu:
[Artikelserie] SQL: Parameter von Befehlen

Nachtrag:
Anbei setzt du deine Values auch alle in Hochkomma ('')
Kannst du dir mit den Sql Parametern sparen, dass kümmert sich dann um alles weitere.
Du musst dann nur die Platzhalter einfügen.

Nachtrag 2:
Pasend zu dem Hinweis von Wilfried der Artikel dazu:
[FAQ] DateTime vs. DateTimeOffset und der Umgang mit Zeiten in .NET

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

2.080 Beiträge seit 2012
vor 2 Jahren

Für Datum und Zeit nutzt man im allgemeinen DateTimeOffset.

Oder seit .NET 6 auch DateOnly (Api-Docs) oder TimeOnly (Api-Docs) - je nachdem, was man braucht.

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.

16.841 Beiträge seit 2008
vor 2 Jahren

@Markus1510, bitte in Zukunft solche Fehler nicht als Bilder posten, sondern in Error Tags.
Dann wäre sowas auch über die Suche für andere Hilfesuchenden auffindbar, siehe [Hinweis] Wie poste ich richtig? 😉

Der DateTimePicker kann von Haus aus leider kein DateTimeOffset (nur die von Drittherstellern).
Man muss daher manuell konvertieren


DateTimeOffset dateTimeOffset = new DateTimeOffset(dateTime);

bzw sofern notwendig manuell die Zeitzone mitgeben (zweiter Parameter des Konstruktors).

Oder seit .NET 6 auch DateOnly (Api-Docs) oder TimeOnly (Api-Docs) - je nachdem, was man braucht.

Man muss bedenken:

  • DateTimeOffset hat IMMER die Zeitzonen-Information -> für absolute Zeitpunkte gedacht
  • DateOnly und TimeOnly haben NIEMALS eine Zeitzonen-Information -> für relative Zeitangaben gedacht
M
Markus1510 Themenstarter:in
7 Beiträge seit 2021
vor 2 Jahren

Hallo,

bekomme es einfach nicht hin (Blutiger Neuling🙂)

Es kommt jetzt der Fehler bei diesem String.
System.Data.SqlClient.SqlException: "Conversion failed when converting date and/or time from character string."


string einsatzbeginn = dateTimePickerEinsatzbeginn.Text;

Grüße Markus

J
61 Beiträge seit 2020
vor 2 Jahren

Wenn man eine Fehlermeldung bekommt und man sie nicht versteht, kann man sie einfach bei Google eingeben.

Dann bekommt in deinem Fall conversion-failed-when-converting-date-and-or-time-from-character-string-while-i.

T-Virus hat dir schon eine gute Lösung präsentiert. Baue nicht den String selbst zusammen, sondern benutze SQL Parameter.

190 Beiträge seit 2012
vor 2 Jahren

Hallo Markus1510,
gerade wenn man blutiger Neuling ist, dann sollte man Ratschläge auch annehmen und nicht einfach ignorieren.
Den String, den du von dateTimePickerEinsatzbeginn.Text erhältst, den wird deine Datenbank nicht verstehen. So steht es auch in der Fehlermeldung. Darum nutze zum zwischenspeichern DateTimeOffset und zum schreiben in die Datenbank SQL Parameter.

  • Wer lesen kann, ist klar im Vorteil
  • Meistens sitzt der Fehler vorm Monitor
  • "Geht nicht" ist keine Fehlermeldung!
  • "Ich kann programmieren" != "Ich habe den Code bei Google gefunden"

GidF

M
Markus1510 Themenstarter:in
7 Beiträge seit 2021
vor 2 Jahren

Hallo Wilfried,

kannst mir glaube ich suche mir die Finger Wund.
Komme einfach nicht drauf vielleicht sehe ich auch grad den Wald vor lauter Bäumen nicht......


string einsatzbeginn = DateTimeOffset(dateTimePickerEinsatzbeginn.Text);

Grüße Markus

2.080 Beiträge seit 2012
vor 2 Jahren

gerade wenn man blutiger Neuling ist, dann sollte man Ratschläge auch annehmen und nicht einfach ignorieren.

Und das kannst du direkt aus DateTimePicker.Value übernehmen.
Schau dir mal die Doku an.
>

Der DateTimePicker kann von Haus aus leider kein DateTimeOffset (nur die von Drittherstellern).
Man muss daher manuell konvertieren

  
DateTimeOffset dateTimeOffset = new DateTimeOffset(dateTime);  
  

Alles aus diesem eher kleinen Thema hier
Soviel zum "kannst mir glaube ich suche mir die Finger Wund."

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.

M
Markus1510 Themenstarter:in
7 Beiträge seit 2021
vor 2 Jahren

Wo muss das dann rein??


DateTimeOffset dateTimeOffset = new DateTimeOffset(dateTime);

So sieht der Speicher Button aus


private void btnEinsatzdaten_Click(object sender, EventArgs e)
        {

            // Speichert die Daten in eine Datenbank

            string einsatzstichwort = cbEinsatzstichwort.Text;
            string sachverhalt = tbSachverhalt.Text;
            string einsatzort = cbEinsatzort.Text;
            string nummer = cbNummer.Text;
            string einsatzleiter = cbEinsatzleiter.Text;
            string bearbeiter = cbBearbeiter.Text;
            string einsatzbeginn = DateTimeOffset(dateTimePickerEinsatzbeginn.Text);


            databaseConnection.Open();
            string query = string.Format("insert into Einsatzdaten values('{0}','{1}','{2}','{3}','{4}','{5}','{6}')",einsatzstichwort, sachverhalt, einsatzort, nummer, einsatzleiter, bearbeiter, einsatzbeginn);
            SqlCommand sqlCommand = new SqlCommand(query, databaseConnection);
            sqlCommand.ExecuteNonQuery();
            databaseConnection.Close();

            

            ClearAllFields();
            ShowEinsatzdaten();

190 Beiträge seit 2012
vor 2 Jahren

Das stand doch alles schon in den Antworten drin.


            DateTime einsatzbeginn = dateTimePickerEinsatzbeginn.Value;
            DateTimeOffset einsatzbeginnOffset = new DateTimeOffset(einsatzbeginn);

oder in einer Zeile:


            DateTimeOffset einsatzbeginn = new DateTimeOffset(dateTimePickerEinsatzbeginn.Value);

Du solltest anstelle von dateTimePickerEinsatzbeginn.Text dateTimePickerEinsatzbeginn.Value verwenden. Und nicht String oder Integer verwenden, sondern DateTimeOffset. Nun ist das Value vom Type DateTime. Wie du das verwendest hat dir Abt geschrieben. Ob du nun wirklich DateTimeOffset brauchst, oder ob DateTime reicht, darüber kann man philosophieren. Hängt auch davon ab, wie du die Datenbank gestaltest. Siehe hier: Datums- und Zeitdaten

  • Wer lesen kann, ist klar im Vorteil
  • Meistens sitzt der Fehler vorm Monitor
  • "Geht nicht" ist keine Fehlermeldung!
  • "Ich kann programmieren" != "Ich habe den Code bei Google gefunden"

GidF

190 Beiträge seit 2012
vor 2 Jahren

Du solltest dich ganz ganz ganz dringend mal mit den Grundlagen von C# auseinandersetzen, ansonsten bleibst du bei jedem kleinen Problem hängen.
Zum Thema Datenbank und Parameter noch dieser Link: Befehle und Parameter

  • Wer lesen kann, ist klar im Vorteil
  • Meistens sitzt der Fehler vorm Monitor
  • "Geht nicht" ist keine Fehlermeldung!
  • "Ich kann programmieren" != "Ich habe den Code bei Google gefunden"

GidF

M
Markus1510 Themenstarter:in
7 Beiträge seit 2021
vor 2 Jahren

Da bin ich grad schon dran das alles zu erlernen.

2.080 Beiträge seit 2012
vor 2 Jahren

Bist Du nicht.
Du bist dabei, eine Benutzeroberfläche mit komplexen Eingaben und Datenbank zu programmieren.
Das ist weit von den Grundlagen entfernt - klar, dass Du Schwierigkeiten hast.

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.

190 Beiträge seit 2012
vor 2 Jahren

Datenbanken ist nicht unbedingt das Level für einen Einsteiger. Dabei gibt es viel zu beachten. Nur weil etwas funktioniert und es keine Fehlermeldung gibt, ist es nicht unbedingt richtig. Dabei muss man viel wissen und besonders auch verstehen. Und bei Grundlagen sollte es keine Fragen mehr geben.

  • Wer lesen kann, ist klar im Vorteil
  • Meistens sitzt der Fehler vorm Monitor
  • "Geht nicht" ist keine Fehlermeldung!
  • "Ich kann programmieren" != "Ich habe den Code bei Google gefunden"

GidF