繁体   English   中英

C#在后台工作者中执行sql查询

[英]C# Execute sql query in backgroundworker

我有一个 winforms 应用程序,它通过在登录前检查用户权限、用户名和密码是否匹配来登录用户。数据库目前只有三个用户用于测试目的。

我面临的问题是,每当我尝试登录时,程序都会在登录前冻结至少 30 秒。我到处搜索以找到解决方案。 我试过一个后台工作人员,但是,这对我也不起作用; 也许我用错了。

这是用于登录的代码

登录名.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();
    }
}

我无法消除延迟,但是我想出了如何正确实施后台工作人员,因此现在表单不再冻结。 我还添加了一个进度条来显示某种形式的进度。

登录按钮点击事件:

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

后台工作者:

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

后台工作完成:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM