使用sql数据库的C#登录屏幕不工作

使用sql数据库的C#登录屏幕不工作,c#,sql,if-statement,string-comparison,sqldatareader,C#,Sql,If Statement,String Comparison,Sqldatareader,我有一个简单的登录屏幕,当用户单击登录按钮时,它应该运行sql查询来搜索username==username文本框和password==password文本框所在的行。我的代码的这一部分工作得很好 但是,当我尝试运行if语句时,它将打开一个新表单并关闭登录表单,它会出错,即使我添加了一些消息框来检查语句是否正确 有什么想法吗 登录按钮: private void btnLogin_Click(object sender, EventArgs e) { try

我有一个简单的登录屏幕,当用户单击登录按钮时,它应该运行sql查询来搜索username==username文本框和password==password文本框所在的行。我的代码的这一部分工作得很好

但是,当我尝试运行if语句时,它将打开一个新表单并关闭登录表单,它会出错,即使我添加了一些消息框来检查语句是否正确

有什么想法吗

登录按钮:

private void btnLogin_Click(object sender, EventArgs e)
    {
        try
        {
            string connection = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\DebenhamsProjectOfficeDatabase.mdf;Integrated Security=True;User Instance=True";
            SqlConnection cn = new SqlConnection(connection);
            cn.Open();
            string userText = txtUsername.Text;
            string passText = txtPassword.Text;
            SqlCommand cmd = new SqlCommand("SELECT ISNULL(Username, '') AS Username, ISNULL(Password,'') AS Password FROM Users WHERE Username='" + userText + "' and Password='" + passText + "'", cn);

            SqlDataReader dr = cmd.ExecuteReader();

            while (dr.Read())
            {
                MessageBox.Show(userText + " / " + dr["Username"].ToString());
                MessageBox.Show(passText + " / " + dr["Password"].ToString());
                if (dr["Username"].ToString() == userText && dr["Password"].ToString() == passText)
                {
                    this.Hide();
                    Dashboard dashboard = new Dashboard();
                    dashboard.ShowDialog();
                    this.Close();
                }
                else
                {
                    MessageBox.Show("Invalid Username or Password");
                }
            }
            dr.Close();
            cn.Close();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }
登录尝试:


根据以下答案和注释中的建议,代码已更正为以下内容(使用sql命令中的sql参数):

检查sql返回时,尝试在其末尾添加trim()

dr[“Username”].ToString().trim()
dr[“Password”].ToString().trim()

有时数据库会存储您看不见的额外空间

检查sql返回时,尝试在其末尾添加trim()

dr[“Username”].ToString().trim()
dr[“Password”].ToString().trim()


有时数据库会存储您看不见的额外空间

试试这个:我想它会管用的

SqlCommand cmd = new SqlCommand("SELECT * FROM Users WHERE Username='" + userText.toString() + "' and Password='" + passText.toString() + "'", cn);

        SqlDataReader dr = cmd.ExecuteReader();
        if (dr.Read())
        {
            MessageBox.Show(username + " / " + usertext);
            MessageBox.Show(password + " / " + passtext);
            this.Hide();
            Dashboard dashboard = new Dashboard();
            dashboard.ShowDialog();
            this.Close();
        }
        else
        {
                MessageBox.Show("Invalid Username or Password");
        }

简单地试试这个:我认为它会起作用

SqlCommand cmd = new SqlCommand("SELECT * FROM Users WHERE Username='" + userText.toString() + "' and Password='" + passText.toString() + "'", cn);

        SqlDataReader dr = cmd.ExecuteReader();
        if (dr.Read())
        {
            MessageBox.Show(username + " / " + usertext);
            MessageBox.Show(password + " / " + passtext);
            this.Hide();
            Dashboard dashboard = new Dashboard();
            dashboard.ShowDialog();
            this.Close();
        }
        else
        {
                MessageBox.Show("Invalid Username or Password");
        }


尝试使用Trim()fn一旦完成此操作,请尝试放置'where 1=1;--在密码lolHi NickB中,您可以将这样的条件从if(dr[“Username”].ToString()==userText&&dr[“password”].ToString()==passText)更改为if(dr[“Username”.tostrim().Equals(userText.Trim())&&dr[“password”].tostrim().Trim().Equals(passText.Trim())@AMR..不是一个有用的评论..但那是hilarious@AMR…确实是..试着使用Trim()fn一旦你开始工作,试着在密码中输入'where 1=1;--Lohi NickB你能把这样的条件从if(dr[“Username”].ToString()==userText&&dr[“password”].ToString()==passText)改为if(dr[“Username”.ToString().Trim()吗.Equals(userText.Trim())和&dr[“Password”].ToString().Trim().Equals(passText.Trim())@AMR。。这不是一个有用的评论。。但那是hilarious@AMR .. 事实上,我选择了这个作为答案@NickB6@PradipKT请不要忽略有关SQL注入和保存密码存储的注释。ling.s的答案显示了一个更好的解决方案(尽管没有处理SQL注入和存储问题)。@mrab我同意他应该集中精力学习如何使用SQL参数。这个程序,如果一个真正的公司登录,只是等待被黑客。尽管如此,我还是回答了他的问题:-)这不会被公司使用,哈哈,这是一个大学项目。他们需要服用一些严重的药物才能让我接近他们的现场代码。另外,我绝不是developerCheers@AMR,非常感谢您抽出时间。我将检查并添加它。选择此作为答案@NickB6@PradipKT请不要忽略有关SQL注入和保存密码存储的注释。ling.s的答案显示了一个更好的解决方案(尽管没有处理SQL注入和存储问题)。@mrab我同意他应该集中精力学习如何使用SQL参数。这个程序,如果一个真正的公司登录,只是等待被黑客。尽管如此,我还是回答了他的问题:-)这不会被公司使用,哈哈,这是一个大学项目。他们需要服用一些严重的药物才能让我接近他们的现场代码。另外,我绝不是developerCheers@AMR,非常感谢您抽出时间。我将检查这个并添加它。