这里使用了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. [WPF][ListBox]鼠标拖拽多选,(Shift Key、Ctrl Key多选有效)(转)

    <ListBox Name="listBox" SelectionMode="Extended"> <ListBox.Resources> ...

  2. iOS 力学动画生成器UIKit Dynamics 之碰撞效果讲解

    UIKit Dynamic是iOS7 新增的一组类和方法,可赋予UIView逼真的行为和特征,不需要写动画效果那些繁琐的代码,让开发人员能够轻松地改善应用的用户体验.一共有6个可用于定制UIDynam ...

  3. LeetCode 4Sum 4个数之和

    题意:这是继2sum和3sum之后的4sum,同理,也是找到所有4个元素序列,满足他们之和为target.以vector<vector<int>>来返回,也就是二维的,列长为4 ...

  4. 工作中碰到的css问题解决方法

    好久都没来这写东西了,都长草了.刚解决的两个小问题,先记下来 textarea横向没有滚动条加上 wrap="off"这个属性 英文单词不断行加上这个 word-break:bre ...

  5. javascript:理解try...catch...finally

    以前,我一直喜欢用console.log(do some thing)去执行输出的类型和值,想马上看到弹出的信息,就会直接在浏览器alert()一下,这些是基础知识. 稍微复杂一点点,就要用到判断语句 ...

  6. Tarjan在图论中的应用(二)——用Tarjan来求割点与割边

    前言:\(Tarjan\) 求割点和割边建立在 \(Tarjan\)算法的基础之上,因此建议在看这篇博客之前先去学一学\(Tarjan\). 回顾\(Tarjan\)中各个数组的定义 首先,我们来回顾 ...

  7. 在C++类中使用dllimport和dllexport导出,

    在Windows平台下: 您可以使用dllimport或dllexport属性声明C ++类.这些形式意味着导入或导出整个类.以这种方式导出的类称为可导出类. 以下示例定义可导出的类.导出其所有成员函 ...

  8. Virtuabox 虚拟机克隆方法

    起初我觉得直接复制一个.vdi 虚拟硬盘再挂上去就可以了,没想到 Virtualbox居然提示UUID重复,看起来就是有点像com生成的那种ID, 查了一下,才知道原来不能这么用 可以通过Vritua ...

  9. python读取文件指定行

    import linecache file=open('3_2.txt','r') linecount=len(file.readlines()) linecache.getline('3_2.txt ...

  10. python之enumerate

    http://eagletff.blog.163.com/blog/static/116350928201266111125832/一般情况下,如果要对一个列表或者数组既要遍历索引又要遍历元素时,可以 ...