2016-03-30 14 views
-1

Kullanıcı oturum açma, kullanıcı adı ve parola girişlerinin eşleşip eşleşmeden önce eşleşip eşleşmediğini kontrol ederek bir kullanıcı oturum açan bir winform uygulaması var. Veritabanının şu anda yalnızca test amacıyla üç kullanıcısı var.C# Arka plan çalışmasında sql sorgusu çalıştır

Karşılaştığım sorun, giriş yapmayı denediğimde, program giriş yapmadan önce en az 30 saniye donuyor. Bir çözüm bulmak için her yeri aradım. Ancak bir arka plan çalışmayı denedim, bu da benim için işe yaramıyor; belki yanlış kullanıyorum.

Bu

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

30'ların neyi aldığını belirlediniz mi? Bir analiz yaptınız ve SQL'inize işaret ediyor mu? – AlG

+0

Milyonlarca kullanıcıya sahip değilseniz ve kullanıcı adı veya parola üzerinde dizin olmadıkça (30s bile çok yüksekse) SQL yavaş olmamalıdır. Bazı düşünceler: 1) Bir kaydın varlığını kontrol etmek için bir DataTable'a ihtiyacınız yoktur; 'ExecuteScalar' işlevini kullanın - 2) türünü almak için sorguyu sorgulamak yerine, ilk sorgudaki türü seçebilirsiniz, 3) Neyin iyi olduğunu öğrenmek için iyi bir profil oluşturucu (veya en kötü hata ayıklama, çağrıları manuel olarak zamanlama) elde etme darboğazdır. Bahse girerim 'SnackBarTimer() ' –

+2

BTW'de bir yerdedir. Birisi SQL Injection saldırısını kullanarak veritabanınızı silebilir. Sql sorgusu oluşturarak dize birleştirme kullanmayın! –

cevap

0

ben lag kaldıramadı giriş için kullanılan kod, ancak düzgün şimdi formu doesn backgroundworker nasıl uygulanacağı anladım Artık donuyor. Ayrıca bazı ilerlemeyi göstermek için bir ilerleme çubuğu ekledim.

Girişi Düğme tıklayın Etkinlik:

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(); 
     }    
    } 

BackgroundWorker:

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(); 
     } 
    } 

BackgroundWorker Tamamlandı:

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(); 
     } 
    } 

İlerleme Değişti:

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