A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Always. 中级黑马   /  2013-9-22 12:57  /  1658 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 haxyek 于 2013-9-22 13:08 编辑

练习:用户界面中进行登录判断,输错三次禁止登录,用数据库记录errortimes
  1.        private void Incerrortimes() //错误次数加1(当密码错误的时候)
  2.         {
  3.             using (SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=E:\我的第一个mdf解决\登录判断\Database1.mdf;Integrated Security=True;User Instance=True"))
  4.             {
  5.                 conn.Open();
  6.                 using (SqlCommand updatecmd = conn.CreateCommand())
  7.                 {
  8.                     updatecmd.CommandText = "update T_Users Set errortimes=errortimes+1 where Username=@UN";
  9.                     updatecmd.Parameters.Add(new SqlParameter("UN", txtusername.Text));
  10.                     updatecmd.ExecuteNonQuery();

  11.                 }
  12.             }

  13.         }
  14.         private void Reseterrortimes() //将错误次数置0
  15.         {
  16.             using (SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=E:\我的第一个mdf解决\登录判断\Database1.mdf;Integrated Security=True;User Instance=True"))
  17.             {
  18.                 conn.Open();
  19.                 using (SqlCommand updatecmd = conn.CreateCommand())
  20.                 {
  21.                     updatecmd.CommandText = "update T_Users Set errortimes=0 where Username=@UN";
  22.                     updatecmd.Parameters.Add(new SqlParameter("UN", txtusername.Text));
  23.                     updatecmd.ExecuteNonQuery();

  24.                 }
  25.             }

  26.         }
  27.         private void btnLogin_Click_1(object sender, EventArgs e)
  28.         {
  29.             using (SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=E:\我的第一个mdf解决\登录判断\Database1.mdf;Integrated Security=True;User Instance=True"))
  30.             {
  31.                 conn.Open();

  32.                 using (SqlCommand cmd = conn.CreateCommand())
  33.                 {
  34.                     cmd.CommandText = "select * from T_Users where Username=@UN";
  35.                     cmd.Parameters.Add(new SqlParameter("UN", txtusername.Text));
  36.                     using (SqlDataReader reader = cmd.ExecuteReader())
  37.                     {
  38.                         if (reader.Read())
  39.                         {
  40.                             int errorTimes = reader.GetInt32(reader.GetOrdinal("errortimes"));//通过GetOrdinal获得errortimes所在的列值,这一行的表达式表示errortimes所在列的值
  41.                             if (errorTimes >= 3)
  42.                             {
  43.                                 MessageBox.Show("登录错误次数过多,禁止登录!"); //当errorTimes >= 3的时候,此时会禁止登录,退出方法
  44.                                 Reseterrortimes(); //当下次再执行的时候,errorTimes里边的值还是上次程序执行之后留下来的值,所示不调用 Reseterrortimes();这个方法的时候,程序的errortimes仍是原值,即会一直执行 MessageBox.Show("登录错误次数过多,禁止登录!");
  45.                                 return;
  46.                             }
  47.                             string dbpass = reader.GetString(reader.GetOrdinal("Password"));
  48.                             if (dbpass == txtpassword.Text)
  49.                             {
  50.                                 MessageBox.Show("登录成功");
  51.                                 Reseterrortimes();
  52.                             }
  53.                             else
  54.                             {
  55.                                 Incerrortimes();
  56.                                 MessageBox.Show("密码错误"); //如果密码错误,则应该把错误次数加1
  57.                             }
  58.                         }
  59.                         else
  60.                         {
  61.                             MessageBox.Show("用户名不存在");            
  62.                         }
  63.                     }
  64.                 }
  65.             }
  66.         }   
复制代码
值得注意的地方:
1.在同一个连接中,如果SqlDataReader没有关闭,也就是说在读的过程中,是不能执行Update之类的语句。所以不能够直接在 MessageBox.Show("密码错误")执行的地方添加errortimes加1的语句。应该再写一个方法进行另外一次连接,此时只需要在执行errortimes加1的时候直接调用方法名即可。

2.当登录成功的时候,也就是说执行MessageBox.Show("登录成功")之后,应该让我们的errortimes置0。

3.当执行MessageBox.Show("登录错误次数过多,禁止登录!")的时候,此时errortimes>=3了,退出方法。当下次再执行的时候,errorTimes里边的值还是上次程序执行之后留下来的值,此时应该调用 Reseterrortimes();若是不调用,程序的errortimes仍是原值,即会一直执行 MessageBox.Show("登录错误次数过多,禁止登录!");



评分

参与人数 1技术分 +1 收起 理由
曹伟 + 1

查看全部评分

3 个回复

倒序浏览
值得学习ing!
回复 使用道具 举报

嘻嘻。
回复 使用道具 举报
连接字符串在多个方法中使用最好单独提取出来.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马