C# 登录表单,如何在一个登录表单中使用3个表登录?
我正在使用visual studio 2019在windows窗体应用程序(.net framework)和C#中为我的windows应用程序创建登录页 我的登录页面有两个用户名和密码文本框,一个登录按钮和注册按钮,用于切换到注册表单,每个控件上都有一些必需的字段验证 我使用的是SQL Server 2014,其中有三个表,分别是Student、Admin和Coordinator,每一个表都有列显示其详细信息,例如用户ID、用户名、密码、电子邮件、年龄、性别、地址和联系人 我想做的是,当用户按下submit按钮时,它会检查student表中的用户名和密码,如果没有,它会检查协调员,然后是管理员。如果其中任何一个中都没有,则会显示登录失败的错误 我在页面上放置了一个SQLCommand,它从student表中提取用户名和密码,其中用户名和密码等于textboxs文本 我是否需要为每个表的页面添加3个sqlcommands?或者需要为每个用户创建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、用户名、密码、电子邮件、年龄、性别、地址和联系人 我想做的是,当用户按下
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
应该只是一个连接表