C# 和 SQL 服务器:表的条件语句
C# and SQL Server : conditional statement for tables
我有一个使用管理员和员工登录的程序。我在 SQL 服务器中有两个 table,名为 Admin
和 Employee
。
我只有一个登录名window。我有两种形式 AdminForm
和 EmpForm
。输入用户名和密码时,我想读取两个table。
- 如果用户名和密码属于table
Admin
,则显示AdminForm
- 但是当用户名和密码属于table
Employee
时,它会显示EmpForm
我是 SQL 服务器的新手。无论如何有可能吗?截至目前,这是我的代码:
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
{
}
}
}
}
}
您需要 2 个 sql 查询,这些查询采用参数用户名和密码,一个查询 return admin 对象,另一个查询 return object employee 如果插入的参数正确,否则它们 return null.
尝试用这两个查询的结果初始化 Admin 和 Employee 的对象。
比试
if(admin != null)
打开 AdminForm。
else if(employee != null)
打开 EmpForm。
else
- 显示消息不正确的用户名 or/and 密码。
Soner Gö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)
然后你就有了区分行的方法....如果你得到2行你就可以做出决定了。 EmployeeKey 和 AdminKey(无论您的 PK 名称是什么)必须是相同的数据类型。 (还有 LastName 和 FirstName,如果所有数据类型都匹配,您只能 UNION/UNION ALL。
.......
话虽如此…………您 "mixed" 有很多顾虑。创建一个 returns 某种具有必要值的 POCO 对象的 DataLayer。 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
}
}
分离关注点会好一些。 Google "C# Layers" 更多讨论。
正如其他人所说,这不是处理用户名/密码的正确方法。但是你的问题的答案是使用联合,比如:
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 "))
架构错误。将两个 table 组合成一个 Users
table,并使用一个额外的列指示用户属于哪个角色。
我使用了管理员和员工的权限并对其进行了编码。谢谢你的想法!有需要的可以参考下面的代码。 别忘了加密您的密码。
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);
}
}
}
}
我有一个使用管理员和员工登录的程序。我在 SQL 服务器中有两个 table,名为 Admin
和 Employee
。
我只有一个登录名window。我有两种形式 AdminForm
和 EmpForm
。输入用户名和密码时,我想读取两个table。
- 如果用户名和密码属于table
Admin
,则显示AdminForm
- 但是当用户名和密码属于table
Employee
时,它会显示EmpForm
我是 SQL 服务器的新手。无论如何有可能吗?截至目前,这是我的代码:
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
{
}
}
}
}
}
您需要 2 个 sql 查询,这些查询采用参数用户名和密码,一个查询 return admin 对象,另一个查询 return object employee 如果插入的参数正确,否则它们 return null.
尝试用这两个查询的结果初始化 Admin 和 Employee 的对象。 比试
if(admin != null)
打开 AdminForm。
else if(employee != null)
打开 EmpForm。
else
- 显示消息不正确的用户名 or/and 密码。
Soner Gö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)
然后你就有了区分行的方法....如果你得到2行你就可以做出决定了。 EmployeeKey 和 AdminKey(无论您的 PK 名称是什么)必须是相同的数据类型。 (还有 LastName 和 FirstName,如果所有数据类型都匹配,您只能 UNION/UNION ALL。
.......
话虽如此…………您 "mixed" 有很多顾虑。创建一个 returns 某种具有必要值的 POCO 对象的 DataLayer。 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
}
}
分离关注点会好一些。 Google "C# Layers" 更多讨论。
正如其他人所说,这不是处理用户名/密码的正确方法。但是你的问题的答案是使用联合,比如:
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 "))
架构错误。将两个 table 组合成一个 Users
table,并使用一个额外的列指示用户属于哪个角色。
我使用了管理员和员工的权限并对其进行了编码。谢谢你的想法!有需要的可以参考下面的代码。 别忘了加密您的密码。
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);
}
}
}
}