这里使用了SqlHelper,简化程序

  自己写一个SqlHelper,把数据库的连接等都写到里面去。

  首先把连接字符串添加到配置文件里去,右键解决方案-->添加新建项-->选择应用程序配置文件

  添加一个下字段,红色部分为新添加的代码,name字段一定要写,下面的使用就是靠这个关键字

 <?xml version="1.0"?>
<configuration>
<connectionStrings>
4 <add name="dbconn"
5 connectionString="Data Source=.;Initial Catalog=Test1;User ID=sa;Password=123456"/>
6
7 </connectionStrings>

</configuration>

  在sqlHelper类中添加一个变量,并定义函数

  private static string conStr = ConfigurationManager.ConnectionStrings["dbConn"].ConnectionString;

   public static DataTable ExecuteDataTable(string sql, params SqlParameter[] parameters)
{
using (SqlConnection conn = new SqlConnection(conStr))
{
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = sql;
cmd.Parameters.AddRange(parameters);
DataSet dataset = new DataSet();
SqlDataAdapter apdater = new SqlDataAdapter(cmd);
apdater.Fill(dataset);
return dataset.Tables[];
}
}
}

  这些操作只是把代码给提出来,不用每次使用都去写下所有代码。

  然后就是函数响应了,非常简洁

   private void btn_Login_Click(object sender, RoutedEventArgs e)
{
if (tb_UserID.Text.Length <= )
{
MessageBox.Show("请输入用户名");
return;
}
if (pwdPassword.Password.Length <= )
{
MessageBox.Show("请输入密码");
return;
} DataTable table = SqlHelper.ExecuteDataTable("select * from USERINFO where UserID=@user", new SqlParameter("@user", tb_UserID.Text)); if (table.Rows.Count <= )
{
MessageBox.Show("用户不存在");
return;
}
//要对不可能发生的情况进行做处理,断言 Assert
else if (table.Rows.Count > )
{
throw new Exception("用户名重复!");
} DataRow row = table.Rows[];
string dbPassword = row["Password"].ToString();
long id = (long)row["ID"];//获取ID,这是数据库新增加的一个标识字段,没有实际意义,但可以用来数据判断
int errorTimes = (int)row["ErrorTimes"];//获取错误次数
if (errorTimes >= )
{
MessageBox.Show("输入次数过多,用户已锁定");
return;
}
if (dbPassword != pwdPassword.Password)
{
//把登录用户的错误次数加一
SqlHelper.ExecuteNonQuery("update USERINFO set ErrorTimes=ErrorTimes+1 where ID=@id"
,new SqlParameter("@id",id)); MessageBox.Show("密码错误!");
}
else
{
MessageBox.Show("登录成功!");
}
}

  感觉这样一写,比上个程序简单很多,bug也要少很多。

ADO之密码验证--3次错误就锁定『改进』的更多相关文章

  1. ADO之密码验证--3次错误就锁定

    这个程序是那vs2010下写的,C#语言.数据库是sql server 2008 首先在数据库中新建一个数据库Test1,在数据库中新建一个表用来保存用户名和密码USERINFO, CREATE TA ...

  2. 【WCF】使用“用户名/密码”验证的合理方法

    我不敢说俺的方法是最佳方案,反正这世界上很多东西都是变动的,正像老子所说的——“反(返)者,道之动”.以往看到有些文章中说,为每个客户端安装证书嫌麻烦,就直接采用把用户名和密码塞在SOAP头中发送,然 ...

  3. WCF 安全性之 自定义用户名密码验证

    案例下载 http://download.csdn.net/detail/woxpp/4113172 客户端调用代码 通过代理类 代理生成 参见 http://www.cnblogs.com/woxp ...

  4. wordpress密码生成与登录密码验证

    一.研究wordpress时wordpess的密码密码生成与登录密码验证方式很重要 WordPress密码已成为整合的首要目标,如何征服整合,就得了解WordPress密码算法. WordPress系 ...

  5. [c/c++] programming之路(24)、字符串(五)——字符串插入,字符串转整数,删除字符,密码验证,注意事项

    1.将字符串插入到某位置(原字符串“hello yincheng hello cpp hello linux”,查找cpp,找到后在cpp的后面插入字符串“hello c”) 需要用到strstr字符 ...

  6. 如何在主Form出现之前,弹出密码验证From,Cancel就退出程序,Ok后密码正确才出现主Form

    如何在主Form出现之前,弹出密码验证From,Cancel就退出程序,Ok后密码正确才出现主Form本文地址 :CodeGo.net/5175478/ ----------------------- ...

  7. WCF服务安全控制之netTcpBinding的用户名密码验证【转】

    选择netTcpBinding WCF的绑定方式比较多,常用的大体有四种: wsHttpBinding basicHttpBinding netTcpBinding wsDualHttpBinding ...

  8. WCF用户名密码验证方式

    WCF使用用户名密码验证 服务契约 namespace WCFUserNameConstract { [ServiceContract] public interface IWcfContract { ...

  9. 第一百五十节,封装库--JavaScript,表单验证--密码验证

    封装库--JavaScript,表单验证--密码验证 效果图 html <div id="reg"> <h2 class="tuo">& ...

随机推荐

  1. 系统装更新补丁出现“正在此计算机上搜索更新”,有时等待N长时间也没有反应

    系统装更新补丁出现“正在此计算机上搜索更新”,有时等待N长时间也没有反应 管理员身份运行 net stop wuauserv net stop CryptSvc ren %windir%\system ...

  2. linux 命令——27 chmod

    chmod命令用于改变linux系统文件或目录的访问权限.用它控制文件或目录的访问权限.该命令有两种用法. 一种是包含字母和操作符表达式的文字设定法: 另一种是包含数字的数字设定法. Linux系统中 ...

  3. [Rails学习之路]Rails路由配置

    如果是使用Rails的默认约定,那么几乎是零配置. 但有些时候,我们可能不得不(或者更喜欢)进行一些特殊的配置. 其实Rails在路由功能中也有很丰富的配置选项. routes.rb文件中靠前的规则优 ...

  4. Spring,FetchType.LAZY和FetchType.EAGER什么区别?

    1.FetchType.LAZY:懒加载,加载一个实体时,定义懒加载的属性不会马上从数据库中加载. 2.FetchType.EAGER:急加载,加载一个实体时,定义急加载的属性会立即从数据库中加载. ...

  5. 【洛谷4011】孤岛营救问题(状压SPFA)

    点此看题面 大致题意: 有一个\(N*M\)的四联通迷宫,相邻两个可能互通,可能有一扇门,也可能有一堵墙.对于第\(i\)类的门,你需要有第\(i\)类的钥匙才可以通过.问你从\((1,1)\)到达\ ...

  6. 如何让图片相对于上层DIV始终保持水平、垂直都居中

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. python之列表推导、迭代器、生成器

    http://blog.chinaunix.net/uid-26722078-id-3484197.html 1.列表推导 看几个例子,一切就明白了. #!/usr/bin/python number ...

  8. IBM MQ Explore使用

    一,版本说明: 系统:win10.MQ:V9.04 二.关于帮助文档: 1.读了差不多一大半,个人感觉说明的比较生僻,应该是直译过来的.但是还是可以从这里面学一下基本的操作. 2.对于一些基本的操作, ...

  9. 51nod——1086、1257背包问题V2(多重背包二进制拆分转01) V3(分数规划+二分贪心)

    V3其实和dp关系不大,思想挂标题上了,丑陋的代码不想放了.

  10. .NET中变量生存期

    Web窗体后台 cs 文件中,创建类作用域的变量,在关闭页面的时候并不会消失,当 IIS 站点被关闭的时候,才会调用这个变量的析构函数 但是好像也不肯定在关闭站点才会析构,应该是外层对象析构的时候才会 ...