正在尝试创建登录页

本文关键字:登录 创建 | 更新日期: 2023-09-27 18:25:10

我正在尝试创建一个登录页面,您可以在其中输入用户名和密码。它会在数据库中查询您键入的信息,如果它在数据库中,它会将我登录到程序中。如果没有,它将显示一条消息,说明信息不正确。

这是我迄今为止所拥有的。

private void okButton_Click(object sender, RoutedEventArgs e)
{
    try
    {
        SqlConnection UGIcon = new SqlConnection();
        UGIcon.ConnectionString = "XXXXXXXXX; Database=XXXXXXXX; User Id=XXXXXXX; password=XXXXXXXXX";
        UGIcon.Open();
        SqlCommand cmd = new SqlCommand("SELECT User(Username, '') AS Username, User(Password,'') AS Password, FROM User WHERE Username='"
            + txtUsername.Text + "' and Password='" + txtPassword.Password + "'", UGIcon);
        SqlDataReader dr = cmd.ExecuteReader();
        string userText = txtUsername.Text;
        string passText = txtPassword.Password;
        while (dr.Read())
        {
            if (this.userText(dr["stUsername"].ToString(), userText) &&
                this.passText(dr["stPassword"].ToString(), passText))
            {
                MessageBox.Show("OK");
            }
            else
            {
                MessageBox.Show("Error");
            }
        }
        dr.Close();
        UGIcon.Close();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

但是,唯一的问题是它根本不起作用。我也不确定我是否有正确的语句来查询数据库。我在"this.userText"上也遇到了一个错误。

{  
    if (this.userText(dr["stUsername"].ToString(), userText) &&   
        this.passText(dr["stPassword"].ToString(), passText))
    {  

对于我得到的错误,它告诉我WPF不包含它的定义

我有点不确定如何修复和进行,因为这是我第一次不得不这样做。但我认为我有一个不错的开始。

正在尝试创建登录页

这个结构有几个问题:

this.userText(dr["stUsername"].ToString(), userText)

首先,userText不是一个函数,它是一个局部变量。因此,我甚至不确定通过将其作为函数调用来尝试做什么。你只是想比较变量吗?像这样的东西?:

this.userText.Equals(dr["stUsername"].ToString())

其次,错误是告诉您对象不包含userText的定义,因为它没有。当你这样做时:

this.userText

您专门在对象本身上寻找一个名为userText类级别成员。但是您的变量是函数的本地变量:

string userText = txtUsername.Text;

因此,只需删除this参考:

userText.Equals(dr["stUsername"].ToString())

第三,列引用不正确。注意如何在SQL查询中定义列:

SELECT User(Username, '') AS Username, User(Password,'') AS Password ...

该列称为Username,而不是stUsername:

userText.Equals(dr["Username"].ToString())

编辑:@Blam在一条评论中提出了一个很好的观点,这表明代码中存在逻辑错误。如果查询没有返回任何结果,while循环将永远不会执行。因此不会显示任何消息。你可以用HasRows:之类的东西来检查结果

if (dr.HasRows)
    MessageBox.Show("OK");
else
    MessageBox.Show("Error");

当然,这会使之前的事情变得毫无意义。但是,知道问题是什么以及如何纠正它们仍然很好,所以为了完整起见,我将保留完整的答案。


其他一些注意事项很重要,但与您的问题没有直接关系。。。

  1. 您的代码容易受到SQL注入攻击。您将希望研究使用参数化查询,而不是像那样串联字符串值。从本质上讲,该代码将用户输入视为数据库上的可执行代码,允许用户为应用程序编写自己的代码
  2. 请不要以纯文本形式存储用户密码。这一点的重要性怎么强调都不为过。密码的原始文本永远不能从存储器中读取。相反,存储密码的散列。关于这个主题还有很多东西要读
  3. 查看using块,以便在处理完资源后对其进行处置
SqlCommand cmd = new SqlCommand("SELECT count(*)  FROM User WHERE Username='"
    + txtUsername.Text + "' and Password='" + txtPassword.Password + "'", UGIcon);
Int32 rowsRet = (Int32)cmd.ExecuteScalar();
if(rowsRet > 0)
{
    MessageBox.Show("OK");
}
else
{
    MessageBox.Show("Error");
}

您仍然面临SQL注入攻击。