C# 登录表单,如何在一个登录表单中使用3个表登录?

C# 登录表单,如何在一个登录表单中使用3个表登录?,c#,sql-server,windows,visual-studio,winforms,C#,Sql Server,Windows,Visual Studio,Winforms,我正在使用visual studio 2019在windows窗体应用程序(.net framework)和C#中为我的windows应用程序创建登录页 我的登录页面有两个用户名和密码文本框,一个登录按钮和注册按钮,用于切换到注册表单,每个控件上都有一些必需的字段验证 我使用的是SQL Server 2014,其中有三个表,分别是Student、Admin和Coordinator,每一个表都有列显示其详细信息,例如用户ID、用户名、密码、电子邮件、年龄、性别、地址和联系人 我想做的是,当用户按下

我正在使用visual studio 2019在windows窗体应用程序(.net framework)和C#中为我的windows应用程序创建登录页

我的登录页面有两个用户名和密码文本框,一个登录按钮和注册按钮,用于切换到注册表单,每个控件上都有一些必需的字段验证

我使用的是SQL Server 2014,其中有三个表,分别是Student、Admin和Coordinator,每一个表都有列显示其详细信息,例如用户ID、用户名、密码、电子邮件、年龄、性别、地址和联系人

我想做的是,当用户按下submit按钮时,它会检查student表中的用户名和密码,如果没有,它会检查协调员,然后是管理员。如果其中任何一个中都没有,则会显示登录失败的错误

我在页面上放置了一个SQLCommand,它从student表中提取用户名和密码,其中用户名和密码等于textboxs文本

我是否需要为每个表的页面添加3个sqlcommands?或者需要为每个用户创建3个登录表单

我的代码可以工作,但它只是检查管理表,而不是协调表和学生表 有更好的方法吗

private void btnLogin_Click(object sender, EventArgs e)
        {
            try
            {
                bool valid = true;
                if (string.IsNullOrEmpty(uName.Text) || string.IsNullOrEmpty(password.Text))
                {
                    MessageBox.Show("Please! Enter Username and Password.", "Login Form", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    valid = false;
                }
                if (valid)
                {
                    String UserType = null;
                    SqlCommand cmd = new SqlCommand("Select usertype from Admin where UserName = '" + uName.Text + "' and Password = '" + password.Text + "' ", con);
                    SqlDataReader dr = cmd.ExecuteReader();
                    Boolean records = dr.HasRows;

                    if (records)
                    {

                        while (dr.Read())
                        {
                            UserType = dr[0].ToString();
                        }

                        if (UserType.Equals("Admin"))
                        {

                            MessageBox.Show("Admin Just Logged In, Welcome!", "Login Form", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            frmAdmin frmA = new frmAdmin();
                            frmA.Show();
                            this.Hide();

                        }
                    }

                    else
                    {
                        MessageBox.Show("Login Failed!", "User Login Form", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                    dr.Close();
                }
            }

            catch (Exception ex)
            {
                MessageBox.Show("Login Failed!" + ex);
            }
        }

我认为您需要1个表而不是3个表。您可以将此表称为用户表。 对于管理员、用户、协调员等角色,您可以创建另一个类似UserRoles的表。 (这将使您无需为每个传入角色创建其他表)

因此,如果用户存在或不存在,您可以检查一个表。 请保持密码散列,并阅读有关SQL注入的信息

用户表

身份证件 用户类型ID 用户名 1. 1. admin@noemail.com 1. 2. coordinator@noemail.com 1. 3. student@noemail.com
这不是我所知道的最好的方法。
但现在解决问题的最快方法是使用组合框或一些单选按钮,询问用户您的角色和使用用户选择

--抱歉,我是新手,我无法对此发表评论,但想提供帮助--

警告:您的代码存在严重缺陷,因为它受到SQL注入的影响。尝试将您的用户名设置为
”或1=1--你会对发生的事情感到惊讶。你必须解决这个问题。此外,您的代码强烈暗示您正在存储纯文本密码。永远不要那样做。散列并添加密码。将3个表中的凭据提取到自己的凭据表中,将其他3个表链接到凭据表,然后仅对该表进行检查。可能会在凭证表中添加一个角色列,以便于区分用户的角色。照@Larnu说的做。我想这对你来说只是一个实验/学习过程,但我非常同意Larnu的观点。从一开始,至少让自己意识到为什么这些事情是不好的,这对你是有好处的(请查看“OWASP top 10”)@Ralf听起来这应该是一个答案吗?:)使用SQL连接:我将使用SQL SE4Server Management Studio测试连接,以获得正确的语法。然后将查询字符串放入c#。是的,你说得对,但在我的例子中,我使用数据网格视图以3种形式分别显示这3个用户。这就是为什么我不能用一张桌子。否则,我必须为每个用户类型使用3个登录表单。外键能用吗,把3张桌子连起来?我不知道也许我问错了。编写一个可以过滤用户类型的SQL脚本是如此简单。我为你做了这个样品。在SQL数据库中,如果将用户名保留为唯一键,则可以确定登录用户的角色。如果您保持登录用户角色(即admin),则可以编写业务逻辑,根据用户的授权级别填充数据网格。(即管理员有一个查看所有用户的级别)您还需要一个
Role
表,
UserRole
应该只是一个连接表