正在尝试创建登录页
本文关键字:登录 创建 | 更新日期: 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");
当然,这会使之前的事情变得毫无意义。但是,知道问题是什么以及如何纠正它们仍然很好,所以为了完整起见,我将保留完整的答案。
其他一些注意事项很重要,但与您的问题没有直接关系。。。
- 您的代码容易受到SQL注入攻击。您将希望研究使用参数化查询,而不是像那样串联字符串值。从本质上讲,该代码将用户输入视为数据库上的可执行代码,允许用户为应用程序编写自己的代码
- 请不要以纯文本形式存储用户密码。这一点的重要性怎么强调都不为过。密码的原始文本永远不能从存储器中读取。相反,存储密码的散列。关于这个主题还有很多东西要读
- 查看
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注入攻击。