这个C#登录表单逻辑出了什么问题?

时间:2015-04-19 08:16:28

标签: c# sql-server logic

我在构建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的消息框。

它有什么不对吗?

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)

没有冒犯,但真正的答案是一切

  • 您对表格中的所有内容使用nvarchar(255)列 用户名很少超过15个字符,密码通常在4到6个字符之间。您可以安全地使用nvarchar(20)作为用户名和密码,并使用Admin的位列。
  • 你的专栏名称不好。 UserName,Password和Admin是大多数数据库中的保留字。我的建议是使用表名作为列名的前缀:Login_UserNameLogin_PasswordLogin_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

(这与您当前的表格一致)