Maskedtextbox für Datumeingabe speichern sehr langsam

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von Silentwolf.

    Maskedtextbox für Datumeingabe speichern sehr langsam

    Hallo an alle,

    dieses Thema wird manchen sehr einfach vorkommen aber ich komme leider nicht wirklich weiter.

    Nach durchforsten des Internets und auch hier im Forum kam ich leider nicht wirklich auf eine brauchbare Lösung.

    In einer Windowsform werden einfache Stammdaten eingetragen und mit einer Klasse an die Datenbank gesendet.

    Soweit alles gut..

    Jetzt wollte ich aber die txtDOB als maskedtextbox verwenden um eine Eingabevalidierung zu steuern.
    Leider nachdem ich nun diese maskedtextbox verwendet habe läuft das Programm sehr langsam zwar keine Exeption aber halt langsam.

    Quellcode

    1. Public Property DateOfBirth As Date
    2. Set(value As Date)
    3. m_DOB = value
    4. End Set
    5. Get
    6. Return m_DOB
    7. End Get
    8. End Property


    also eine ganz normale Property für das Datum und die
    Deklaration Private m_DOB as date

    Als ich zuvor ein normale textbox verwendet hatte war der Speichervorgang sehr schnell jetzt aber eher sehr langsam
    Ist bei maskedtextboxen noch etwas zu beachten damit es besser bzw. schneller verarbeitet werden kann.

    Vielen Dank für Eure Hilfe!

    SW
    @Silentwolf Verwende für eine Datumseingabe einen DaterTimePicker:
    docs.microsoft.com/de-de/dotne…r?view=windowsdesktop-5.0
    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!
    Was ist m_DOB und für was steht das „m“?

    Ansonsten ist am Code nichts auffällig. Wo ist der Rest der zum speichern und so gehört?
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Hallo,
    Danke mal allen für die Rückmeldung!

    VB.NET-Quellcode

    1. Public Function SaveDetails(SaveToDB As Boolean) As Boolean
    2. Try
    3. Dim strSQLInsert As String
    4. strSQLInsert = "INSERT INTO tblPeople(FirstName, MiddleName, Lastname, DateOfBirth, Address, Town, PLZ, Country, Mobile, Telefon, Email)VALUES('" & Me.FirstName & "', '" & Me.MiddleName & "', '" & Me.LastName & "', '" & Me.DateOfBirth & "', '" & Me.Address & "', '" & Me.Town & "', '" & Me.PLZ & "', '" & Me.Country & "', '" & Me.Mobile & "', '" & Me.Telefon & "', '" & Me.Email & "')"
    5. Dim strDBPath As String
    6. strDBPath = "Y:\BUSINESS\PROGRAMMING\Databases\MyDatabase.accdb"
    7. Dim strConString As String
    8. strConString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source = " & strDBPath & "; Jet Oledb:Database Password = MyPassword"
    9. Dim conPerson As OleDbConnection
    10. conPerson = New OleDbConnection
    11. conPerson.ConnectionString = strConString
    12. conPerson.Open()
    13. Dim cmdPerson As OleDbCommand
    14. cmdPerson = New OleDbCommand
    15. cmdPerson.Connection = conPerson
    16. cmdPerson.CommandText = strSQLInsert
    17. cmdPerson.ExecuteNonQuery()
    18. conPerson.Close()
    19. Return True
    20. Catch ex As Exception
    21. Return False
    22. End Try
    23. End Function


    Das wäre der Code um zu speichern..
    m_Date ist einfach die Meber Variable

    Datepicker glaub ich ist da nicht so ganz ideal oder wenn man ein Geburtstag eintragen möchte..
    Zuvor hatte ich einfach ein Textfeld und eben mit 1.1.2020 zum Beispiel war der Code sehr schnell.. aber dann hatte ich halt auch keine Kontrolle wenn das Datum 1/1/2020 gegegen wird.

    Hoffe es ist ein bisschen Verständlicher

    SW

    CodeTags korrigiert ~VaporiZed

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

    Wie/wo kommt das Datum in die Variable DateOfBirth?

    btw: Must-Know: Sql-Injection
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    VB.NET-Quellcode

    1. Public Class frmPeople
    2. Private Sub btnSaveToDB_Click(sender As Object, e As EventArgs) Handles btnSaveToDB.Click
    3. Dim p As New Person
    4. p.FirstName = txtFirstName.Text
    5. p.MiddleName = txtMiddleName.Text
    6. p.LastName = txtMiddleName.Text
    7. p.DateOfBirth = CDate(txtDOB.Text)
    8. p.Address = txtLastName.Text
    9. p.Town = txtTown.Text
    10. p.PLZ = txtPLZ.Text
    11. p.Country = txtCountry.Text
    12. p.Mobile = txtMobile.Text
    13. p.Telefon = txtTelefon.Text
    14. p.Email = txtEmail.Text
    15. If p.SaveDetails(True) = True Then
    16. MsgBox("saved in databae")
    17. End If
    18. End Sub
    19. End Class


    So kommt die Variable den Wert..

    Glaube da bin ich schon wieder auf den Holzweg ..

    CodeTags korrigiert ~VaporiZed

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

    Also das sieht für mich nicht so aus, als wenn das an der MaskedTextbox liegt. Tausche das nochmal gegen die normale TextBox aus und teste ob es dadurch wieder schnell ist.

    Wie sieht denn diese Eingabevalidierung aus von der du geschrieben hast?

    Zudem, was spricht gegen den DateTimePicker, wie von @RodFromGermany vorgeschlagen?
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Tausche das nochmal gegen die normale TextBox aus und teste ob es dadurch wieder schnell ist.

    Hab ich gemacht und ja jetzt geht auch diese nicht schneller das stimmt erst nach dem Build da geht es etwas schneller...

    Aber das so zu coden ist ja eh auch nicht gut wie Du ja den Link von EDR's Beitrag schreibt.. soweit ich das nun auf die schnelle so Durchgesehen habe.

    Wie sieht denn diese Eingabevalidierung aus von der du geschrieben hast?

    Einfach nur "__.__.____" Das hatte ich verwendet um eben keine Datumsangaben mit 1/1/2020 eintragen zu können.

    Zudem, was spricht gegen den DateTimePicker, wie von @RodFromGermany vorgeschlagen?

    Na ja mit dem DateTimePicker ist es ja etwas umständlich das Datume inzugeben oder nicht? Also wenn man es verwendet um den aktuellen Datumswert anzuzeigen da ist es ja super aber wenn man
    eben Geburtsdatum eintragen möchte kann man ja nicht einfach nur das datum reinschreiben oder?

    Aber wie gesagt ist das ja eh komplett aussen vor zu lassen mit den Textboxen n die DB zu schreiben oder?

    Ist halt als Neuling auf VB.net noch etwas schwierig die richtigen Artikel und auch zu wissen nach was man genau suchen muss um die richtigen oder besten Möglichkeiten zu erfahren.

    Der Link z u einen Buch das von EDR vorgeschlagen wurde ist leider nicht mehr aktuell würde mir aber gerne eines anschaffen wo ich die richtigen Konzepte erlernen kann.

    Möchte ja auch besser werden :)

    Vielleicht hat ja jemand ein Buch das er mir vorschlagen könnte kann auch ruhig auf englisch sein das kann ich nähmlich besser als VB. net gg
    3 Anmerkungen:

    VB.NET-Quellcode

    1. '[…]
    2. p.MiddleName = txtMiddleName.Text
    3. p.LastName = txtMiddleName.Text
    4. '[…]
    Achtung, C&P-Fehler.

    Anstatt alle Eigenschaften per Hand in die Person reinzudonnern, wäre das ein Fall für DataBinding.

    VB.NET-Quellcode

    1. If p.SaveDetails(True) = True Then
    dazu nur: Boolean-Vergleiche mit True sind überflüssig.

    Silentwolf schrieb:

    wenn man eben Geburtsdatum eintragen möchte kann man ja nicht einfach nur das datum reinschreiben oder?
    Doch.

    Könnte man in Deine MaskedTextBox auch AA-BB-:-)) reinschreiben?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Silentwolf schrieb:

    Hab ich gemacht und ja jetzt geht auch diese nicht schneller das stimmt erst nach dem Build da geht es etwas schneller...
    Geht es mit beiden Controls nach und vor dem Build Vorgang ähnlich schnell oder gibt es da entscheidende Unterschiede? Ich habe die Vermutung das da was anderes ausbremst als irgend ein Control.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Guten Morgen,
    Danke mal Euch beiden für die Rückmeldung!
    Also das mit DataBinding ist wohl auch das was EDR mit den Videos FourViews aufgezeigt hat oder?

    Nun wenn das so ist ich finde das ja alles gut und toll nur ich verstehe nicht wie ich das zusammen mit einer Access Datenbank erledigen kann.
    Also EDR macht das ja mit einen neuen Dataset und erstellt die Tabellen per Hand... aber wenn man nun eine Access Datenbank schon hat und verwenden möchte wie wird das dann gemacht?

    Man sieht unzählige Filmchen wie man eine Datenbank in eine Anwendung einbinden kann aber wie das nun geschehen soll mit Klassen damit man eben eine etwas umfangreichere Anwendung richtig aufbaut und nicht
    tausend gleiche nur wenig abweichende SQL statements zu haben da wird es schwierig.
    Dann findet man wieder welche die eben dann gar nicht gut sind aber ein Leihe wie ich es nun noch bin kennt da halt auch nicht die Gefahr dahinter ...


    Geht es mit beiden Controls nach und vor dem Build Vorgang ähnlich schnell oder gibt es da entscheidende Unterschiede? Ich habe die Vermutung das da was anderes ausbremst als irgend ein Control.

    Na ob das zu Anfang auch war kann ich nicht mehr sagen. Weiß nicht ob ich ein build zuvor gemacht hatte.
    Aber jetzt finde ich das es bei beiden Controls ähnlich langsam bzw. schnell..

    Nachtrag...
    Nachtrag...

    Also zuvor hatte ich ja eine Klasse nicht jetzt von mir erstelle eben von VB.Toolbox!

    die sah eben so aus wie auch im ersten Post von mir gesendet.

    VB.NET-Quellcode

    1. Imports System.Data.OleDb
    2. Public Class DBControl
    3. 'CREATE Your DB Connection
    4. Private DBCon As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;" &
    5. "Data Source =MyDatabase.accdb;Jet OLEDB:Database Password= MyPassword")
    6. 'PREPARE DB COMMAND
    7. Private DBCmd As OleDbCommand
    8. 'DB DATA
    9. Public DBDA As OleDbDataAdapter
    10. Public DBDT As DataTable 'Anstatt Datatable as writem by vb.tutorial
    11. 'QUERY PARAMETERS
    12. Public Params As New List(Of OleDbParameter)
    13. 'QUERY STATISTICS
    14. Public RecordCount As Integer
    15. Public Exeption As String
    16. Public Sub ExecQuery(Query As String)
    17. 'RESET QUERY STATS
    18. RecordCount = 0
    19. Exeption = ""
    20. Try
    21. 'OPEN A CONNECTION
    22. DBCon.Open()
    23. 'CREATE DB COMMAND
    24. DBCmd = New OleDbCommand(Query, DBCon)
    25. 'LOAD PARAMS INTO DB COMMAND
    26. Params.ForEach(Sub(p) DBCmd.Parameters.Add(p))
    27. 'CLEAR PRARAMS LIST
    28. Params.Clear()
    29. 'EXECUTE COMMAND & FILL DATATABLE
    30. DBDT = New DataTable
    31. DBDA = New OleDbDataAdapter(DBCmd)
    32. RecordCount = DBDA.Fill(DBDT)
    33. Catch ex As Exception
    34. Exeption = ex.Message
    35. End Try
    36. 'CLOSE YOUR CONNECTION
    37. If DBCon.State = ConnectionState.Open Then DBCon.Close()
    38. End Sub
    39. 'INCLUDE QUERY & COMMAND PARAMETERS
    40. Public Sub AddParam(Name As String, Value As Object)
    41. Dim NewParam As New OleDbParameter(Name, Value)
    42. Params.Add(NewParam)
    43. End Sub
    44. End Class


    Wäre
    das eine "Korrekte" Vorgehensweise? Und wenn ja oder auch nein was muss
    oder sollte hier verbessert werden? Auch ein Dataset anlegen oder
    zusätzlich im Code beinhalten?

    Hoffe ich darf hier so viel Code reinposten hat jetzt ja nicht genau mit diesen "thread" zu tun.

    Danke für Eure Tips Und Tricks :)

    CodeTags korrigiert ~VaporiZed

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „VaporiZed“ ()