Datetime: nur Time inTextbox darstellen und wieder speichern

  • VB.NET

Es gibt 39 Antworten in diesem Thema. Der letzte Beitrag () ist von Romed.

    Datetime: nur Time inTextbox darstellen und wieder speichern

    Hy.

    Wieder mal ein Problemchen. Ich rufe über einen sqlDataadapter und eine Datatable die Daten aus einer SQL DB (sqlexpress 2005) ab.
    Das funzt schon ganz gut.

    Nun möchte ich von der Datetime Spalte nur die Zeit also Time anzeigen.

    Da hab ich auch noch so einigermasen hinbekommen mit der zugrunde liegenden Select Abfrage:

    VB.NET-Quellcode

    1. dataset = New DataSet("stundenadapter")
    2. dienstschichttable = dataset.Tables.Add("tbldienstschichten")
    3. adapter = New SqlDataAdapter("SELECT schicht_id, schicht_name, CONVERT(char(5), schicht_beginn, 108) as schicht_beginn," + _
    4. " CONVERT(char(5), schicht_ende, 108) as schicht_ende, CONVERT(char(5), schicht_pausenbeginn, 108) as schicht_pausenbeginn," + _
    5. " CONVERT(char(5), schicht_pausenende, 108) as schicht_pausenende, CONVERT(char(5), schicht_soll, 108) as schicht_soll," + _
    6. " CONVERT(char(5), schicht_verein, 108) as schicht_verein, CONVERT(char(5), schicht_uest50, 108) as schicht_uest50," + _
    7. " CONVERT(char(5), schicht_uest100, 108) as schicht_uest100, CONVERT(char(5), schicht_tatsDienstbeginn, 108) as schicht_tatsDienstbeginn," + _
    8. " CONVERT(char(5), schicht_tatsDienstende, 108) as schicht_tatsDienstende, CONVERT(char(5), schicht_tatsPausenbeginn, 108) as schicht_tatsPausenbeginn," + _
    9. " CONVERT(char(5), schicht_tatsPausenende, 108) as schicht_tatsPausenende, CONVERT(char(5), schicht_Urlaub, 108) as schicht_Urlaub, CONVERT(char(5)," + _
    10. " schicht_Krank, 108) as schicht_Krank FROM tbldienstschichten", sqlconn)
    11. adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey
    12. adapter.Fill(dienstschichttable)


    Nun möchte ich in der Textbox "NUR" die Zahlen z.b. "1200" für "12:00" oder "1300" für "13:00" und die dann als Datetime speichern.

    Per

    VB.NET-Quellcode

    1. cmd = New SqlCommand( _
    2. "UPDATE tblstundenzettel SET " &
    3. "Dienstbeginn = '" & CDate(mtb_dienstbeginn.Text) & "', " &
    4. "Dienstende = '" & CDate(mtb_dienstende.Text) & "', " &
    5. "Pausenbeginn = '" & CDate(mtb_pausenbeginn.Text) & "', " &
    6. "Pausenende = '" & CDate(mtb_pausenende.Text) & "', " &
    7. "tatsDienstbeginn = '" & CDate(mtb_tatsdienstbeginn.Text) & "', " &
    8. "tatDienstsende = '" & CDate(mtb_tatsdienstende.Text) & "', " &
    9. "tatsPausebeginn = '" & CDate(mtb_tatspausenbeginn.Text) & "', " &
    10. "tatsPauseende = '" & CDate(mtb_tatspausenende.Text) & "', " &
    11. "Schulungsanfang = '" & CDate(mtb_schulungsbeginn.Text) & "', " &
    12. "Schulungsende = '" & CDate(mtb_schulungsende.Text) & "', " &
    13. "Begruendung = '" & tbx_begruendung.Text & "', " &
    14. "pausedurch = '" & cbx_pausedurch.CheckState & "', " &
    15. "schicht_id_f = '" & cbx_schichtauswahl.SelectedValue & "'" &
    16. "WHERE stundenliste_id = " & tagesid, sqlconn)
    17. cmd.ExecuteNonQuery()


    schreibe ich dann die Daten wieder in die zugrundeliegende Datenbank. Wenn die Textbox Leer ist, wirft er mir immer einen Fehler auf. "Ungültige konvertierung von Zeichenfolge im Typ Datetime"

    Gibt es da eine Möglichkeit um dieses zu realisieren?

    LG
    wenn nur eine uhrzeit angegeben wird, dann geht die DB aber vom kleinstmöglichen Datum aus, d.i. glaub der 1.1.1900 (oder wars der 1.1.1970?). Egal, jdfs. mit Sicherheit nicht das richtige Datum.

    Dein Textbox-Problem wäre am besten zu Lösen durch Verwendung eines DateTimePickers. Der kann nicht leer sein.
    Oder sonstwie dafür sorgen, dass die Textbox nicht leer ist.

    Databinding könnte auch dieses Prob lösen.
    Hy Erfinder

    Ich Binde die Textbox mit einem

    VB.NET-Quellcode

    1. mtb_schulungsende.DataBindings.Add("Text", stundentable, "Schulungsende")


    Wenn die Textbox LEER ist dann sollte auch in der DB "NULL" stehen.
    Konkret geht es um einen Stundenzettel bzw Stundentabelle der Mitarbeiter pro Monat.

    Wenn ich nun keine Zeit eingebe dann sollte auch keine drinnen stehen. Schwierig oder??

    LG
    bei databinding soll man nie den Wert aus dem Control holen, sondern aus den Daten - das Control ist da ja nur drangebunden.

    Das liefe auf einen ziemlichen Umbau deines Monster-Sqls hinaus, denn die Daten sind ja bereits DataTimes und müssen also nicht konvertiert werden.

    Noch günstiger wären typisierte DataTables als Daten, denn da sagt man dem DataAdapter einfach "UpdateDuDas!" - und das Thema ist abgehandelt.

    Achja - DbParameter verwenden sprach ich ja erst neulich an.
    Wenn ich mcih recht erinnere, wolltest du dich damit beschäftigen.

    Ähm - falls es dir damit ernst ist, kannstejetzt eiglich hiermit aufhören, denn wenn du dich wirklich damit beschäftigst, wirst du diesen Ansatz ziemlich komplett übern Haufen werfen - also wozu jetzt hier vertane Arbeit reinstecken?

    ErfinderDesRades schrieb:

    Noch günstiger wären typisierte DataTables als Daten, denn da sagt man dem DataAdapter einfach "UpdateDuDas!" - und das Thema ist abgehandelt
    Und wie mach ich das. Sorry bitte nicht lachen :(

    ErfinderDesRades schrieb:

    Das liefe auf einen ziemlichen Umbau deines Monster-Sqls hinaus, denn die Daten sind ja bereits DataTimes und müssen also nicht konvertiert werden.

    Und wie muss ich den umbauen?

    Romed schrieb:

    Was meinst du genau damit mit auseinandersetzten???

    Also hier findet zB. eine Auseinandersetzung mittm Datenmodell statt: [VB 2010] Nach erfolgter Auswahl die Auswahlliste in einer DataGridViewComboBox ändern

    ich weiß auch nicht, warum das immer so schwierig ist - es geht im Grunde nur darum, ziemlich banale Zusammenhänge ganz konkret zu beschreiben. Einfach sich verständlich ausdrücken.
    Eine Schwierigkeit dabei scheint zu sein, wirklich die treffenden Bezeichnungen zu finden, und nicht rumzuabstrahieren, wo man konkret bleiben kann und sollte.
    ok Ich beschäftige mich gerade mit den Parametern. Ich komme jedoch nicht genau mit wie deine kleiene Extension abgeht. Nur zum Teil zumindest check ich die.

    Also:

    VB.NET-Quellcode

    1. If splits.Count <> values.Length + 1 Then Throw New ArgumentException( _
    2. "Anzahl der Argumente passt nicht zur Anzahl der Parameter-Platzhalter im CommandText")


    Heir fragst du ob die Parameterangabe mit dem Array überinstimmt oder?


    VB.NET-Quellcode

    1. For i = 0 To values.Length - 1
    2. Dim param = cmd.Parameters.AddWithValue("@a" & i, values(i))
    3. splits(i) = splits(i) & param.ParameterName
    4. Next


    Was passiert hier??

    VB.NET-Quellcode

    1. cmd.CommandText = String.Concat(splits)
    2. cmd.Connection = con
    3. Return cmd


    Wo wird cmd deklariert?

    Ich hoffe ich nerve nicht, möchte es nur echt gerne verstehen :(
    jetzt hab ichs gerafft kommt dann gleich da ich die verjknüpfungen noch nicht definiert habe

    hab die schon mal gehapt aber durch die umstellung von MYSQL auf sqlexpress 2005 hat es mir die rausgeschmissen
    Hier die Beziehungen

    teilweise lassen sich beziehungen nicht erstellen


    Edit:

    Die ALTER TABLE-Anweisung steht in Konflikt mit der FOREIGN KEY-Einschränkung "FK_tbkkurse_tblkursarten". Der Konflikt trat in der "verwaltung"-Datenbank, Tabelle "dbo.tblkursarten", column 'kursart_id' auf.

    Edit:

    Jetzt hat es mit den Tabellenverknüpfungen geklappt. Musste überprüfung beim erstellen auf nein machen oder sollte man das nicht?
    Bilder
    • Neue Bitmap.jpg

      386,3 kB, 1.817×982, 143 mal angesehen

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

    jo, jetzt musstes nurnoch erklären.

    also Kontakte scheint mir eine falsche Bezeichnung - es sind Mitarbeiter (oder?).

    Dann sehe kurse, teilnehmer, und - KundenDaten??

    sind die Teilnehmer nicht die Kunden?


    Insgesamt empfehle ich, unnütze Prefixe weglassen (inne DB sind alle Prefixe unnütz), Tabellen als Singular bezeichnen, groß geschrieben.
    PrimKey einer Tabelle heißt (fast) immer ID, ForeignKey heißt immer "AndereTabelleID".

    Das issn ganz einheitliches System, mit dem man sich gut orientieren kann, und woraus sich später auch leidlich erträgliche CodeNamen generieren.


    Aber ich hab kein Plan, wozu der Stundenzettel gut sein soll, und v.a. was das ganze Zeug dadrin soll.
    Mir scheint "Dienst" könnte eine treffende Bezeichnung sein.
    Weil es sind ja keine Stundenzettel in der Tabelle, sondern Dienste.
    Und sicherlich gibtes Dienste verschiedener Art, das scheint mir in tbldienstschichten angedeutet. Auch hier vernünftig benamen: "DientsArt".
    (wenn ich denn den Sinn dieser Tabellen ühaupt richtig erfasst habe)
    Und natürlich muß der konkrete Dienst per ForeignKey auf eine DienstArt verweisen, und dann kann man glaub schon reihenweise Spalten ausmisten, die ja bereits in DienstArt definiert sind.

    soweit erstmal.
    Hmmm

    da haste in gewisser weisse ja recht

    Also:

    Konatkte - Hier habe ich meine Mitarbeiter gespeichert und deren andere allfällige daten wie man sieht

    Kunden - sind die Firmen denen wir kurse anbieten.

    Teilnehmer - sind die Kursteilnehmer selbst die bei den kursen anwesend sind. sind die mitarbeiter der firmen bzw Kunden.

    Stundenzettel - Hier werden die Zeiten der Dienste gespeichert die der Mitarbeiter selbst eintragen bzw. verändern kann.

    Dienstschichten - hier sind vorgefertigte Dienstschichten definiert, die über eine Combobox ausgewählt udn deren vordefinierten Zeiten in die Stundenzettel eingefügt wird.

    Ich blicke wenn ich ehrlich sein darf selbst nicht mehr ganz durch.

    Ich hoffe du kannst mir helfen :?: :?: :?:
    Ich hoffe du hast jetzt ein wenig einen Einblick.

    Wenn ich aber nun die ganzen ID usw ändere kann ich dann eh das programm neu schreiben oder??

    Die tabellen sind schon mal unter Access im Produlktiveinsatz gewesen udn nun habe ich die übernehmen müssen.

    LG