C#在成功登录后加载主窗体

本文关键字:加载 窗体 登录 成功 | 更新日期: 2023-09-27 18:25:42

我有两个表单,即登录和主表单。我希望在成功登录后,关闭登录页面并加载主表单。但我面临的问题是,每当我输入无效的用户名和密码时,主表单仍然会出现。

我正在接受SQL Server 2008数据库中的登录消息(登录成功或失败)作为字符串

我尝试使用以下代码

  1. 代码:

    public Form1()
    {
         FrmLogin frm = new FrmLogin();
         frm.ShowDialog();
         InitializeComponent();
    }
    
  2. 代码:

    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        FrmLogin frm = new FrmLogin();
        if (frm.ShowDialog() == DialogResult.OK)
        {
            Application.Run(new Form1());
        }
        else
        {
            Application.Exit();
        }
    }    
    

登录表单按钮代码:

private void button1_Click(object sender, EventArgs e)
{
    OleDbConnection conn = new OleDbConnection("File Name=E:''Vivek''License Manager''License Manager''login.udl");
    try
    {
        conn.Open();
        OleDbCommand cmd = new OleDbCommand("checkuser",conn);
        cmd.CommandType = CommandType.StoredProcedure;
        OleDbParameter p1=new OleDbParameter("userid",username.Text);
        OleDbParameter p2 = new OleDbParameter("password",password.Text);
        cmd.Parameters.Add(p1);
        cmd.Parameters.Add(p2);
        var returnParameter = cmd.Parameters.Add("@ReturnVal",OleDbType.VarChar,50);
        returnParameter.Direction = ParameterDirection.ReturnValue;
        cmd.ExecuteNonQuery();
        // Retrieve the return value
        string result = returnParameter.Value.ToString();
        MessageBox.Show(result);
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }     
    conn.Close();
}

存储过程

ALTER proc [dbo].[usercheck]
                   (@userid varchar(20),
                     @password varchar(20))
                     as
                     begin
                     if exists(select userid,password from users where userid=@userid and password=@password)
                     return 0
                     else 
                     return 1
                     end

但不幸的是,上述代码似乎都不起作用。我在这里从其他人提出的问题中找到了上面的代码片段,但它们对我不起作用

有人能帮我纠正一下吗?

感谢

C#在成功登录后加载主窗体

这是因为你做错了,

1.)这是Form1的构造函数,每当创建表单时都会执行此代码,因此一旦显示Form1,就会显示FrmLogin表单。

public Form1()
{
    FrmLogin frm = new FrmLogin();
    frm.ShowDialog();
    InitializeComponent();
}

2.)这是Windows窗体应用程序的输入方法,当您按F5运行项目时会执行此方法。在这里,您正在创建FrmLogin,只是检查用户是否按OK然后显示Form1。这是正确的轨道,但你可能没有检查任何凭据。。。

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    FrmLogin frm = new FrmLogin();
    if (frm.ShowDialog() == DialogResult.OK)
    {
        Application.Run(new Form1());
    }
    else
    {
        Application.Exit();
    }

试试这个:

您的Program.cs:

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    LogonForm form = new LogonForm();
    if (form.ShowDialog() != DialogResult.OK)
    {
        //Handle authentication failures as necessary, for example:
        Application.Exit();
    }
    else
    {
        Application.Run(new Form2());
    }
}

您的LogonForm:

private void Login()
{
    if (CheckCredentials())
    {
        this.DialogResult = DialogResult.OK;
    }
    else
    {
        MessageBox.Show("Please enter correct credentials and try again!");
    }
}
private void BtnLogin_Click(object sender, EventArgs e)
{
    Login();
}

编辑:

如果您使用的是SQL Server 2008,则应该使用System.Data.SqlClient而不是System.Data.OleDb

这是更新后的代码:

private bool CheckCredentials()
{
    bool result = false;
    using (SqlConnection conn = new SqlConnection(connectionString))
    using (SqlCommand cmd = new SqlCommand("usercheck", conn))
    {
        conn.Open();
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.Add("@userid", username.Text);
        cmd.Parameters.Add("@password", username.Text);
        using (SqlDataReader reader = cmd.ExecuteReader())
        {
            if (reader.HasRows)
            {
                reader.Read();
                result = reader.GetBoolean(0);
            }
        }
    }
    return result;
}