我在构建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
语句根本不起作用,我创建了一个breakpoint
,它刚刚从if statement 2
跳过{1}}到if statement 3
的消息框。
它有什么不对吗?
答案 0 :(得分:1)
我认为第二个“if”在所有3个条件中都不会“真实”。
我建议你观察每种情况的布尔答案。
你也可以在开头设置3个布尔变量,看看你从每个条件得到的布尔答案。
答案 1 :(得分:1)
您获取所有行但只检查查询的第一行
dt.Rows[0]
并且因为你的第一行是:
admin, 123, true
这个条件:
dr["Admin"].ToString() == "false"
总是假的。如果您想要对用户进行身份验证,您应该只为那些管理员用户提供表单:
SELECT * FROM Login where Admin = true
假设数据库中只有一个管理员(否则你应该改变你的逻辑并迭代遍历行或使用常规查询而不是存储过程)
private void button1_Click(object sender, EventArgs e)
{
DataTable dt = GlobalClasses.Data.AuthenticateUsers();
try
{
for(var i=0; i < dt.Rows.Count ; i++){
var dr = dt.Rows[i];
if (dr["UserName"].ToString() == UsernameTxtBox.Text
&& dr["Password"].ToString() == PasswordTxtBox.Text ){
if (dr["Admin"].ToString() == "true"){
MessageBox.Show("Hello Admin");
}
else
{
MessageBox.Show("Hello Normal User");
}
}
else
{
MessageBox.Show("Get Away");
}
}
}
}
答案 2 :(得分:1)
没有冒犯,但真正的答案是一切。
Admin
的位列。Login_UserName
,Login_Password
,Login_Admin
。正确的存储过程看起来更像是这样:
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
(这与您当前的表格一致)