Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正在尝试创建登录页_C#_Sql_.net_Database_Login - Fatal编程技术网

C# 正在尝试创建登录页

C# 正在尝试创建登录页,c#,sql,.net,database,login,C#,Sql,.net,Database,Login,我正在尝试创建一个登录页面,您可以在其中输入用户名和密码。它会在数据库中查询您输入的信息,如果它在数据库中,它会将我登录到程序中。如果不正确,它将显示一条消息,说明信息不正确 这是我到目前为止所拥有的 private void okButton_Click(object sender, RoutedEventArgs e) { try { SqlConnection UGIcon = new SqlConnection(); UGIcon.Con

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

这是我到目前为止所拥有的

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;
因此,只需删除此引用:

userText.Equals(dr["stUsername"].ToString())
第三,列引用不正确。请注意如何在SQL查询中定义列:

SELECT User(Username, '') AS Username, User(Password,'') AS Password ...
该列称为Username,而不是stUsername:

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

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

其他一些重要但与你的问题不直接相关的笔记

您的代码易受攻击。您需要研究使用参数化查询,而不是像那样连接字符串值。基本上,这段代码的作用是将用户输入视为数据库上的可执行代码,允许用户为您的应用程序编写自己的代码。 请不要以纯文本形式存储用户密码。这一点的重要性怎么强调都不为过。密码的原始文本不应从存储器中读取。而是存储密码的散列。在这个问题上有很多问题。 在处理完资源后,查看并处理它们。
您仍然面临SQL注入攻击。

能否更具体地说明它是如何不起作用的?当您在调试器中单步执行它时,哪里会出错?另外,请注意,以纯文本形式存储用户密码是一个众所周知的坏主意。密码的原始文本永远不应该是可读的。相反,将其存储为单向散列值。然后,当用户登录时,对提供的密码进行散列并比较散列。这是针对学校项目的。我们基本上只需要证明我们可以从数据库中提取数据,所以我们现在不太担心安全性。否则我会很担心的security@Travis当前位置学校项目是在低压环境中展示自己能力的绝佳机会。不要低估产生比您的同行更好的结果的价值:如果它返回一行,它将始终为true userText.Equalsdr[stUsername]。ToString,因为它是where条件。@特拉维斯:我在代码中发现了另一个错误,并相应地更新了我的答案。用于从dr对象中提取数据的列引用不正确。@BARM:正确的观点。如果找到任何行,则不需要任何条件。您能在回答中详细说明此代码修复了什么问题吗?@David您能详细说明它没有修复的问题吗?你测试过这个吗?“你否决了吗?”大卫买了一个元音。它修复了该语法错误,因为它不需要该语句。如果该用户名和密码在表中,则计数将大于0。如果不是,则计数为零。这就是验证用户名和密码所需的全部内容。@David,至少在他们复制粘贴时是这样。直到你复制了我的答案,你的答案才起作用。哦,你没有“复制”确切地说,你使用了一种效率较低的HasRows语法。这是一个逻辑错误,我的回答中没有出现,直到我向你们解释清楚,你们才意识到。如果您无法从检查中判断代码的作用,那么这就是您的问题。选择count*,其中a和b是最基本的语句之一。列名是用户名和密码。实际上,我需要解释一下,sql将返回username=xtUsername.Text+'和Password='+txtPassword.Password的行数。
userText.Equals(dr["Username"].ToString())
if (dr.HasRows)
    MessageBox.Show("OK");
else
    MessageBox.Show("Error");
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");
}