![](/img/trans.png)
[英]C# & SQL Server - insert into different tables (if/case statement)
[英]C# and SQL Server : conditional statement for tables
我有一个使用管理员和员工登录的程序。 我在SQL Server中有两个表,分别为Admin
和Employee
。
我只有一个登录窗口。 我有两种形式AdminForm
和EmpForm
。 输入用户名和密码后,我要阅读两个表。
Admin
,则它将显示AdminForm
Employee
,它将显示EmpForm
我是SQL Server的新手。 反正有可能吗? 到目前为止,这是我的代码:
private void btnLogin_Click(object sender, EventArgs e)
{
using (var connect = sqlcon.getConnection())
{
using (SqlCommand cmd = new SqlCommand("SELECT * FROM administrator WHERE username = @username AND password = @password"))
{
cmd.Connection = connect;
connect.Open();
cmd.Parameters.Add("@cusername", SqlDbType.Char).Value = tbUsername.Text;
cmd.Parameters.Add("@cpassword", SqlDbType.Char).Value = tbPassword.Text;
using (SqlDataReader re = cmd.ExecuteReader())
{
if (re.Read())
{
}
else
{
}
}
}
}
}
模式错误。 将两个表合并为一个Users
表,并在表中增加一列,以表明用户属于哪个角色。
您需要2个sql查询,它们使用参数用户名和密码,如果插入的参数正确,则一个查询返回admin的对象,另一个查询返回对象employee,否则返回null。
尝试使用这两个查询的结果初始化Admin和Employee的对象。 比测试
if(admin != null)
打开AdminForm。 else if(employee != null)
打开EmpForm。 else
-显示消息错误的用户名或密码。
SonerGönül正确地尝试使用带有或不带有盐的哈希来不以明文形式存储密码。
您的查询可以像这样工作:
Select [EntityType] =1 , SurrogateKey = EmployeeKey, LastName, FirstName from dbo.Employee where (blah blah blah)
UNION ALL
Select [EntityType] = 2, SurrogateKey = AdminKey, LastName, FirstName from dbo.Admin where (blah blah blah)
然后,您将有一种方法来区分行...。如果可以退回两行,则可以做出决定。 EmployeeKey和AdminKey(无论您的PK名称是什么)都必须是相同的数据类型。 (以及LastName和FirstName,如果所有数据类型都匹配,则只能UNION / UNION ALL。
..............
话虽如此……..您已经“混合”了许多担忧。 创建一个DataLayer,它返回某种具有必要值的POCO对象。 button_click和SqlConnection不应使用相同的代码。
pubic class LoginResult()
{
public int EntityType {get;set;}
public int SurrogateKey {get;set;}
public string LastName{get;set;}
public string FirstName{get;set;}
}
public interface IAccountManager
{
LoginResult AttemptLogin (string userName, string password)
}
public class IAccountManager() : IAccountManager
{
public LoginResult AttemptLogin (string userName, string password)
{
// put your SqlConnection/SqlReader code here
// do not put any "logic" "if checks" etc....the concern here is to only create the object
}
}
分开关注点要好一些。 谷歌“ C#层”的更多讨论。
正如其他人所说,这不是正确的用户名/密码方式。 但是,您的问题的答案将是使用联合,例如:
using (SqlCommand cmd = new SqlCommand("SELECT 1 as IsAdmin, *
FROM administrator
WHERE username = @username AND password = @password
UNION ALL
SELECT 0 as IsAdmin, *
FROM employees
WHERE username = @username AND password = @password "))
我使用了管理员和员工的权限并将其编码。 感谢您的所有想法! 如果有人需要它,请参考以下代码。 不要忘记加密密码。
private void btnLogin_Click(object sender, EventArgs e)
{
using (var connect = sqlcon.getConnection())
{
using (SqlCommand cmd = new SqlCommand("SELECT rights FROM employee WHERE username = @username AND password = @password"))
{
cmd.Connection = connect;
connect.Open();
cmd.Parameters.Add("@username", SqlDbType.Char).Value = tbUsername.Text;
cmd.Parameters.Add("@password", SqlDbType.Char).Value = tbPassword.Text;
//SqlDataReader re = cmd.ExecuteReader();
string aeRights = (string)cmd.ExecuteScalar();
if (aeRights == "1")
{
frmAdmin frmA = new frmAdmin();
frmA.Show();
this.Hide();
}
else if (aeRights == "2")
{
frmEmp frmE = new frmEmp();
frmE.Show();
this.Hide();
}
else if (string.IsNullOrEmpty(aeRights))
{
MessageBox.Show("Invalid username or password! Please try again", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.