我在构建 C# 登录系统时遇到问题,首先我有一个包含以下列的数据库表:-
UserName(nvarchar(255)),
Password(nvarchar(255)),
Admin(nvarchar(255))
以下是表中存储的信息:-
admin, 123, true
user, 123, false
我制作了一个名为 (AuthenticateUsers) 的 C# 方法来处理 SQL Server 中的登录存储过程,并且它工作正常。
这是:-
public static DataTable AuthenticateUsers()
{
DataTable DT = new DataTable();
string SqlConnStr = globals.ServerConnStr;
SqlConnection SqlConn = new SqlConnection(SqlConnStr);
try
{
SqlConn.Open();
SqlCommand cmd = new SqlCommand("AuthenticateUsers", SqlConn);
cmd.CommandType = CommandType.StoredProcedure;
SqlDataAdapter Adpt = new SqlDataAdapter(cmd);
Adpt.Fill(DT);
SqlConn.Close();
}
finally
{
SqlConn.Close();
}
return DT;
}
这是存储过程:-
ALTER PROCEDURE [dbo].[AuthenticateUsers]
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
SELECT * FROM Login
END
这是登录 Windows 表单代码:
private void button1_Click(object sender, EventArgs e)
{
DataTable dt = GlobalClasses.Data.AuthenticateUsers();
DataRow dr = dt.Rows[0];
try
{
if (dr["UserName"].ToString() == UsernameTxtBox.Text
&& dr["Password"].ToString() == PasswordTxtBox.Text
&& dr["Admin"].ToString() == "true")
{
MessageBox.Show("Hello Admin");
}
else if (dr["UserName"].ToString() == UsernameTxtBox.Text
&& dr["Password"].ToString() == PasswordTxtBox.Text
&& dr["Admin"].ToString() == "false")
{
MessageBox.Show("Hello Normal User");
}
else
{
MessageBox.Show("Get Away");
}
}
}
问题是第一个和最后一个 if
语句正常工作,但是第二个 if
语句根本不起作用,我做了一个断点
就从 if 语句 2
跳到了 if 语句 3
的消息框。
有什么问题吗?
最佳答案
无意冒犯,但真正的答案是一切。
- 您对表中的所有内容使用 nvarchar(255) 列。
用户名很少超过 15 个字符,密码通常在 4 到 6 个字符之间。您可以安全地使用 nvarchar(20) 作为用户名和密码,并使用 Bit 列作为Admin
。 - 你的列名不好。用户名、密码和管理员是大多数数据库中的保留字。我的建议是使用表名作为列名的前缀:
Login_UserName
、Login_Password
、Login_Admin
。 - 您正在将密码以纯文本形式保存在数据库中。密码只能以加密方式保存。
- 您正在使用存储过程将表中的所有数据选择回 C# 代码。您应该做的是将用户的输入作为参数传递给存储过程,并仅将您需要的数据返回到您的 C# 程序。
正确的存储过程看起来更像是这样:
ALTER PROCEDURE [dbo].[AuthenticateUsers]
(
@UserName nvarchar(255),
@Password nvarchar(255)
)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
SELECT Admin
FROM Login
WHERE UserName = @UserName
AND Password = @Password
END
(这与您当前的表格一致)
关于c# - 这个 C# 登录表单逻辑有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29727478/