本帖最后由 haxyek 于 2013-9-22 13:08 编辑
练习:用户界面中进行登录判断,输错三次禁止登录,用数据库记录errortimes- private void Incerrortimes() //错误次数加1(当密码错误的时候)
- {
- using (SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=E:\我的第一个mdf解决\登录判断\Database1.mdf;Integrated Security=True;User Instance=True"))
- {
- conn.Open();
- using (SqlCommand updatecmd = conn.CreateCommand())
- {
- updatecmd.CommandText = "update T_Users Set errortimes=errortimes+1 where Username=@UN";
- updatecmd.Parameters.Add(new SqlParameter("UN", txtusername.Text));
- updatecmd.ExecuteNonQuery();
- }
- }
- }
- private void Reseterrortimes() //将错误次数置0
- {
- using (SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=E:\我的第一个mdf解决\登录判断\Database1.mdf;Integrated Security=True;User Instance=True"))
- {
- conn.Open();
- using (SqlCommand updatecmd = conn.CreateCommand())
- {
- updatecmd.CommandText = "update T_Users Set errortimes=0 where Username=@UN";
- updatecmd.Parameters.Add(new SqlParameter("UN", txtusername.Text));
- updatecmd.ExecuteNonQuery();
- }
- }
- }
- private void btnLogin_Click_1(object sender, EventArgs e)
- {
- using (SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=E:\我的第一个mdf解决\登录判断\Database1.mdf;Integrated Security=True;User Instance=True"))
- {
- conn.Open();
- using (SqlCommand cmd = conn.CreateCommand())
- {
- cmd.CommandText = "select * from T_Users where Username=@UN";
- cmd.Parameters.Add(new SqlParameter("UN", txtusername.Text));
- using (SqlDataReader reader = cmd.ExecuteReader())
- {
- if (reader.Read())
- {
- int errorTimes = reader.GetInt32(reader.GetOrdinal("errortimes"));//通过GetOrdinal获得errortimes所在的列值,这一行的表达式表示errortimes所在列的值
- if (errorTimes >= 3)
- {
- MessageBox.Show("登录错误次数过多,禁止登录!"); //当errorTimes >= 3的时候,此时会禁止登录,退出方法
- Reseterrortimes(); //当下次再执行的时候,errorTimes里边的值还是上次程序执行之后留下来的值,所示不调用 Reseterrortimes();这个方法的时候,程序的errortimes仍是原值,即会一直执行 MessageBox.Show("登录错误次数过多,禁止登录!");
- return;
- }
- string dbpass = reader.GetString(reader.GetOrdinal("Password"));
- if (dbpass == txtpassword.Text)
- {
- MessageBox.Show("登录成功");
- Reseterrortimes();
- }
- else
- {
- Incerrortimes();
- MessageBox.Show("密码错误"); //如果密码错误,则应该把错误次数加1
- }
- }
- else
- {
- MessageBox.Show("用户名不存在");
- }
- }
- }
- }
- }
复制代码 值得注意的地方:
1.在同一个连接中,如果SqlDataReader没有关闭,也就是说在读的过程中,是不能执行Update之类的语句。所以不能够直接在 MessageBox.Show("密码错误")执行的地方添加errortimes加1的语句。应该再写一个方法进行另外一次连接,此时只需要在执行errortimes加1的时候直接调用方法名即可。
2.当登录成功的时候,也就是说执行MessageBox.Show("登录成功")之后,应该让我们的errortimes置0。
3.当执行MessageBox.Show("登录错误次数过多,禁止登录!")的时候,此时errortimes>=3了,退出方法。当下次再执行的时候,errorTimes里边的值还是上次程序执行之后留下来的值,此时应该调用 Reseterrortimes();若是不调用,程序的errortimes仍是原值,即会一直执行 MessageBox.Show("登录错误次数过多,禁止登录!");
|