2016-03-30 7 views
-1

Ich habe eine winforms-Anwendung, die einen Benutzer anmeldet, indem überprüft wird, ob ihre Benutzerberechtigungen, Benutzername und Kennwort alle vor dem Anmelden übereinstimmen. Die Datenbank hat derzeit nur drei Benutzer zu Testzwecken.C# Ausführen von SQL-Abfrage in Backgroundworker

Das Problem, das mir bevorsteht, ist, wenn ich versuche, mich einzuloggen, friert das Programm für mindestens 30 Sekunden ein, bevor ich mich einlogge. Ich habe überall gesucht, um eine Lösung zu finden. Ich habe einen Backgroundworker ausprobiert, aber das funktioniert auch nicht für mich; vielleicht benutze ich es falsch.

Dies ist der Code verwendet

frmLogins.cs

private void btnLogin_Click(object sender, EventArgs ev) 
{ 
    try 
    { 
     SqlDataAdapter sda = new SqlDataAdapter("Select count(*) from Logins where Username='" + txtUserName.Text + "' and Password='" + txtPassword.Text + "' and Type='" + cbType.Text + "'", scon); 
     DataTable dt = new DataTable(); 
     sda.Fill(dt); 

     if (dt.Rows[0][0].ToString() == "1") 
     { 
      sda1 = new SqlDataAdapter("Select Type from Logins where Username='" + txtUserName.Text + "' and Password='" + txtPassword.Text + "'", scon); 
      dt1 = new DataTable(); 
      sda1.Fill(dt1); 

      //Check if user matches with admin then log them in 
      if (dt1.Rows[0][0].ToString() == "Admin") 
      { 
       lblMessage.Text = "Logging Successful!"; 
       SnackBarTimer(); 

       Hide(); 
       AdminForm admin = new AdminForm(); 
       admin.Show(); 
      } 

      //Check if user matches with secretary then log them in 
      if (dt1.Rows[0][0].ToString() == "Secretary") 
      { 
       lblMessage.Text = "Logging Successful!"; 
       SnackBarTimer(); 

       Hide(); 
       frmMain main = new frmMain(); 
       main.Show(); 
      } 

      //Check if user matches with employee then log them in 
      if (dt1.Rows[0][0].ToString() == "Employee") 
      { 

      } 
      lblMessage.Text = "Logging In..."; 
      SnackBarTimer(); 
     } 

    } 
    catch (Exception ex) 
    { 
     lblMessage.Text = ex.Message; 
     SnackBarTimer(); 
    } 
    finally 
    { 
     scon.Close(); 
    } 
} 
+2

Haben Sie festgestellt, was 30er Jahre dauert? Hast du eine Analyse gemacht und es zeigt auf deine SQL? – AlG

+0

Scheint so, dass SQL nicht langsam sein sollte, es sei denn, Sie haben Millionen von Benutzern und keinen Index für Benutzername oder Passwort (selbst dann 30s ist sehr hoch). Einige Gedanken: 1) Sie benötigen keine DataTable, um die Existenz eines Datensatzes zu überprüfen; Verwenden Sie 'ExecuteScalar' - 2) Sie können den Typ in der ersten Abfrage auswählen, anstatt erneut zu fragen, um den Typ zu erhalten, 3) Holen Sie sich einen anständigen Profiler (oder schlimmstenfalls debuggen Sie es, manuelle Zeitmessung der Anrufe), um sicherzustellen, dass Sie wissen, was Engpass ist. Ich wette, es ist irgendwo in 'SnackBarTimer()' –

+2

BTW. Jemand kann Ereignis löschen Ihre Datenbank mit SQL-Injection-Angriff. Verwenden Sie KEINE Zeichenfolge verketten, SQL-Abfrage erstellen! –

Antwort

0

ich die Verzögerung nicht entfernen konnte anmelden, jedoch habe ich herausgefunden, wie man richtig die Background so jetzt die Form doesn implementieren nicht mehr einfrieren. Ich fügte auch eine Fortschrittsleiste hinzu, um eine Form des Fortschritts zu zeigen.

Login-Button Click Event:

private void btnLogin_Click(object sender, EventArgs ev) 
    { 
     // 
     //If background worker busy, show snackbar and login after 
     // 
     if (!bgw.IsBusy) 
     { 
      pnlSnackBar.Visible = true; 
      lblMessage.Text = "Logging In...Please wait"; 
      SnackBarTimer(); 
      bgw.RunWorkerAsync(); 
     }    
    } 

Background:

private void bgw_DoWork(object sender, DoWorkEventArgs e) 
    { 
     try 
     { 
      cmd = new SqlCommand("Select Type from Logins where Username='@user' and Password='@pass'", scon); 

      cmd.Parameters.AddWithValue("@user", txtUserName.Text); 
      cmd.Parameters.AddWithValue("@pass", txtPassword.Text); 

      sda1 = new SqlDataAdapter(cmd); 
      dt1 = new DataTable(); 
      sda1.Fill(dt1); 
     } 
     catch (Exception ex) 
     { 
      //pnlSnackBar.Visible = true; 
      lblMessage.Text = ex.Message; 
      SnackBarTimer(); 
     } 
    } 

Background Abgeschlossen:

private void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     try 
     { 
      if (dt1.Rows.Count == 1) 
      { 
       if (dt1.Rows[0][0].ToString() == "Admin") 
       { 
        LoginInfo.UserID = txtUserName.Text; 
        Hide(); 
        AdminForm admin = new AdminForm(); 
        admin.Show(); 
       } 

       if (dt1.Rows[0][0].ToString() == "Secretary") 
       { 
        LoginInfo.UserID = txtUserName.Text; 
        Hide(); 
        frmMain main = new frmMain(); 
        main.Show(); 
       } 

       if (dt1.Rows[0][0].ToString() == "Employee") 
       { 
        LoginInfo.UserID = txtUserName.Text; 
        Hide(); 
        EmployeeForm employee = new EmployeeForm(); 
        employee.Show(); 
       } 
      } 

     } 
     catch (Exception ex) 
     { 
      pnlSnackBar.Visible = true; 
      lblMessage.Text = ex.Message; 
      SnackBarTimer(); 
     } 
    } 

Fortschritt geändert:

private void bgw_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     metroProgressSpinner.Value = e.ProgressPercentage; 
    }