1

我在尝试创建登录表单时遇到问题,但是 else 语句似乎被忽略了。

如何编写此代码提取,以便在将不正确的数据放入文本框中时显示消息框?(所有数据库均已正确设置)。

try
{
    sc.Open();
    SqlDataReader myReader = null;
    SqlCommand myCommand = new SqlCommand("select * from StudentRecords where ID = '" + txtBoxUsername.Text + "' ", sc); //where ID = '" + txtBoxUsername.Text + "' and DOB = '" + textBoxPassword.Text + "'
    myReader = myCommand.ExecuteReader();

    while (myReader.Read())
    {
        if (txtBoxUsername.Text == (myReader["ID"].ToString()) && textBoxPassword.Text == (myReader["DOB"].ToString()))
        {
            LoginSuccessForm loginfrm = new LoginSuccessForm();
            loginfrm.Show();
            this.Hide();
        }
        else if (txtBoxUsername.Text != (myReader["ID"].ToString()) || textBoxPassword.Text != (myReader["DOB"].ToString()))
        {
            MessageBox.Show("Incorrect Password and/or Username", "Error");
            break;
        }

    }
    sc.Close();
}

我曾尝试将消息框放在 while 循环之外,但这并不能以预期的方式工作。(下面的 try 方法是一个问题,我没有包含它以节省空间)。

话虽如此,它似乎也只选择了数据库中的第一个用户。任何线索或指导将不胜感激!

4

1 回答 1

4

您不需要遍历结果,因为您只期望最多一行。我会这样做:

using (var cmd = sc.CreateCommand()) {
   cmd.CommandText = "select 1 from Students where Username=.. and Password= ..";
   if (cmd.ExecuteScalar() != null) {
      // username and password matched a user
   }
   else {
      // no match 
   }
}

ExecuteScalar返回第一行的第一列,如果没有结果,则返回 null。

如果这是一个真实的项目,您需要使用它SqlParameters来避免 SQL 注入漏洞,并查看散列/加盐而不是存储纯文本密码。

于 2013-04-29T00:14:26.777 回答