我已将名为Data的SQL数据库连接到visual studio C#中的Windows窗体应用程序,该数据库包含一个名为Login的表。
表格显示如下:
以下是数据在我的表格中的显示方式的图像链接,所以基本上我将拥有用户名,密码和角色(我有两种类型的角色,这意味着用户是管理员或客户端):
我已经创建了一个名为Login的登录表单,用户可以从数据库输入用户名和密码,这些用户名和密码将被带到我称为AdminMenu的表单中。我还制作了一个名为MenuForm的表单,我希望用户在登录时可以将其角色定位为客户端。
问题是我只进行了登录,以便所有用户在登录时都会被定向到AdminMenu,即使他们的角色不是管理员。有人可以调整我的代码,以便具有Client角色的用户在登录时将被定向到MenuForm,而具有Admin角色的用户将被定向到AdminMenu表单。
这是我的登录表单代码:
private void button2_Click(object sender, EventArgs e)
{
this.Close();
}
private void button3_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|Data.mdf;Integrated Security=True");
SqlDataAdapter sda = new SqlDataAdapter("Select Role from Login Where UserName='" + textBox1.Text + "' and Password='" + textBox2.Text + "' ",con);
DataTable dt = new System.Data.DataTable();
sda.Fill(dt);
if(dt.Rows.Count == 1)
{
this.Hide();
AdminMenu ss = new AdminMenu();
ss.Show();
}
}
private void Login_Load(object sender, EventArgs e)
{
}
}
}
答案 0 :(得分:1)
可以说这里没有充分的理由在这里使用DataAdapter,你应该更好地防止注入攻击,你可能想要考虑密码腌制,并且可能需要考虑表格育儿,但根据你的代码,以下内容应该有效:
// ...
if(dt.Rows.Count == 1)
{
switch (dt.Rows[0]["Role"] as string)
{
case "Admin":
{
this.Hide();
AdminMenu ss = new AdminMenu();
ss.Show();
break;
}
case "Client":
{
this.Hide();
MenuForm mf = new MenuForm();
mf.Show();
break;
}
default:
{
// ... handle unexpected roles here...
break;
}
}
}
否则你可以在没有适配器的情况下执行命令:
var cmd = conn.CreateCommand();
cmd.CommandText = "Select Role from Login Where UserName=@user and Password=@password";
var up = cmd.CreateParameter();
up.ParameterName="@user";
up.Value = textBox1.Text;
cmd.Parameters.Add(up);
var pp = cmd.CreateParameter();
pp.ParameterName="@password";
pp.Value = textBox2.Text;
cmd.Parameters.Add(pp);
var role = cmd.ExecuteScalar() as string;
// further processing... - role will be null if user not found