Search code examples
c#winformsbackgroundworker

C# Execute sql query in backgroundworker


I have a winforms application that logs in a user by checking to see if their user privileges, username and password all match before logging in. The database currently only has three users for testing purposes.

The problem I'm facing is, whenever I attempt to log in, the program freezes for at least 30 seconds before logging in. I've searched everywhere to find a solution. I've tried a backgroundworker, however, that doesn't work for me either; maybe I'm using it wrong.

This is the code used to login

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

Solution

  • I couldn't remove the lag, however I figured out how to properly implement the backgroundworker so now the form doesn't freeze up anymore. I also added a progressbar to show some form of progress.

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

    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 Completed:

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

    Progress Changed:

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