2016-03-30 10 views
-1

ログインする前にユーザ特権​​、ユーザ名、パスワードがすべて一致するかどうかをチェックしてユーザをログインさせるwinformsアプリケーションがあります。C#バックグラウンドワーカーでsqlクエリを実行

私が直面している問題は、ログインしようとすると、ログインする前にプログラムが少なくとも30秒間フリーズします。私はどこでも解決策を探すために検索しました。しかし、私はバックグラウンドワーカーを試してみましたが、どちらも私にとってはうまくいきません。多分私はそれを間違って使用しています。

これは私がしかし、私はきちんとので、今のフォームはdoesnのBackgroundWorkerのを実装する方法を考え出し、ラグを削除できませんでした

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

あなたは何が30sを取っているのか判断しましたか?あなたは分析をして、あなたのSQLを指していますか? – AlG

+0

何百万人ものユーザーがいて、ユーザー名やパスワードに索引がない(30秒も非常に高い)場合を除き、SQLは遅くならないようです。いくつかの考え:1)レコードの存在をチェックするためにDataTableは必要ありません。 'ExecuteScalar'を使用する - 2)タイプを取得するために再度クエリするのではなく、最初のクエリでタイプを選択できます。3)適切なプロファイラを取得します(最悪の場合はそれをデバッグして手動で呼び出します)。ボトルネックは。私はそれが 'SnackBarTimer()' –

+2

BTWのどこかにあると賭けています。 SQLインジェクション攻撃を使用してデータベースを削除することができます。 SQLクエリを作成する文字列連結を使用しないでください! –

答えて

0

にログインするために使用するコードですもはや凍りつくことはない。プログレスバーを追加して、何らかの進歩を示しました。

ログインボタンクリックイベント:

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が完了:

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

進捗状況が変更:

private void bgw_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     metroProgressSpinner.Value = e.ProgressPercentage; 
    } 
関連する問題