Erste Verbindung zu Access-Datenbank dauert deutlich länger als folgende

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

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Erste Verbindung zu Access-Datenbank dauert deutlich länger als folgende

    Hallo,

    ich habe eine Login-Maske und sobald man auf den login-Button drückt, wird eine Verbindung zur Datenbank hergestellt und die Eingabe wird überprüft.
    Der erste Login-Versuch, also die Zeit zwischen Button_Click und Fehlermeldung dauert Verhältnismäßig lange (ca 2 Sekunden), alle weiteren Versuche gehen blitzschnell (weit unter 1 Sekunde). Dabei ist die Art der Falscheingabe egal.

    Wieso dauert der erste Versuch länger und was kann ich dagegen tun?

    Der Code, der bei Button_Click ausgeführt wird ist folgender:

    VB.NET-Quellcode

    1. Private Sub login()
    2. Dim i As Integer = 0
    3. Dim tmpHash As String = ""
    4. Dim tmpSalt As String = ""
    5. cmd.CommandText = "SELECT txt_passworthash, txt_passwortsalt FROM benutzer WHERE txt_anmeldename = '" & txtUser.Text & "';"
    6. Try
    7. con.Open()
    8. reader = cmd.ExecuteReader
    9. Do While reader.Read
    10. i += 1
    11. If Not DBNull.Value.Equals(reader("txt_passworthash")) Then tmpHash = reader("txt_passworthash") Else tmpHash = ""
    12. If Not DBNull.Value.Equals(reader("txt_passwortsalt")) Then tmpSalt = reader("txt_passwortsalt") Else tmpSalt = ""
    13. Loop
    14. reader.Close()
    15. con.Close()
    16. If i = 1 Then
    17. 'Bilden des Passwort-Hashs und Überprüfung
    18. 'Login oder Fehlermeldung
    19. 'Arbeiten nur mit den lokalen Variablen
    20. Else
    21. 'Fehlermeldung
    22. End If
    23. Catch ex As Exception
    24. If con.State = ConnectionState.Open Then con.Close()
    25. End Try
    26. End Sub
    Ich denke weil beim 1 Versuch erstmals eine Verbindung aufgebaut wird. Zudem werden alle Daten geladen. Beim 2ten Versuch sind diese Daten noch im Zwischenspeicher oä. Ich denke da kannst du nicht viel machen. 2-3 Sekunden sind ja auch noch im Rahmen. Wenn die Form einfriert würde ich das ganze in einen Backgroundworker oder so packen..

    Danke für die Antwort.

    Ich habe ein einfaches

    VB.NET-Quellcode

    1. Try
    2. con.Open()
    3. con.Close()
    4. Catch ex As Exception
    5. If con.State = ConnectionState.Open Then con.Close()
    6. End Try


    in das Load-Event der Login-Maske gesteckt und siehe da, die erste Anmeldung ist bereits schnell.

    Also hat es tatsächlich etwas mit dem ersten Verbindungsaufbau zu tun.

    Ist es sinnvoll, dieses erste Öffnen und Schließen der Verbindung in einem BackGroundWorker zu machen um so ein schnelleres Laden der Form zu ermöglich,
    oder verursacht das mehr Probleme, als es löst?
    Habe es jetzt mit der Parameter-Methode umgesetzt.
    Aber kannst du mir erklären in wie weit die Methode anders ist?

    Ich habe das jetzt so verstanden, dass der Text aus den Textboxen als Parameter an das Command übergeben werden und an den ensprechenden Stellen eingefügt werden.
    In wie fern schützt das besser vor sql-injection-Angriffen?

    Wäre für eine Erklärung dankbar :)