ADO.NET复习总结(5)--工具类SqlHelper 实现登录
工具类SqlHelper
即:完成常用数据库操作的代码封装
一、基础知识
1、每次进行操作时,不变的代码:
(1)连接字符串;
(2)往集合存值;
(3)创建连接对象、命令对象;
(4)打开连接;
(5)执行命令
2、每次操作时,变化的代码:
(1)sql语句;
(2)参数

3、配置文件(关于配置这篇文章讲的挺详细的:https://www.cnblogs.com/programsky/p/4592141.html)
好处:修改方便;
维护成本降低,修改程序不需要重新编译。


代码为:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings>
<add name="dbtest" connectionString="server=.;database=dbtest;uid=sa;pwd=123"/>
</connectionStrings>
</configuration>
二、开始封装
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace t1_UserLogin
{
public static partial class SqlHelper
{
private static string connStr = ConfigurationManager.ConnectionStrings["dbtest"].ConnectionString; //执行查询:select返回多行多列
public static SqlDataReader ExecuteReader (string sql, params SqlParameter[] ps)//SqlParameter[] ps=new SqlParameter[];
{
SqlConnection conn = new SqlConnection(connStr);
SqlCommand cmd = new SqlCommand(sql, conn);
if (ps.Length > )
{
cmd.Parameters.AddRange(ps);
} conn.Open();
//使用SqlDataReader时,连接必须是打开的;设置此参数后,关闭SqlDataReader时会自动关闭使用的连接
return cmd.ExecuteReader(CommandBehavior.CloseConnection);
} //执行查询:select返回首行首列
public static object ExecuteScalar(string sql, params SqlParameter[] ps)
{
using (SqlConnection conn = new SqlConnection(connStr))
{
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.Parameters.AddRange(ps); conn.Open();
return cmd.ExecuteScalar();
}
}
//执行操作:insert,update,delete
public static int ExecuteNonQuery(string sql, params SqlParameter[] ps)
{
using (SqlConnection conn = new SqlConnection(connStr))
{
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.Parameters.AddRange(ps); conn.Open();
return cmd.ExecuteNonQuery();
}
}
}
}
三、实现登录
用户连接三次登录失败,则锁定15分钟,15分钟之后才可以再使用
实现简单登录
MD5加密:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks; namespace t1_UserLogin
{
public static partial class Md5Helper
{
public static string Encrypt(string pwd)
{
MD5 md5 = MD5.Create(); //将字符串转换成字符数据:指定编码
byte[] pwd2 = Encoding.UTF8.GetBytes(pwd); byte[] pwd3 = md5.ComputeHash(pwd2); StringBuilder sb=new StringBuilder("");
for (int i = ; i < pwd3.Length; i++)
{
sb.Append(pwd3[i].ToString("x2").ToLower());
}
//0-255
//00-ff 10=>16 07
return sb.ToString();
}
}
}
1、登录代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using t1_UserLogin; namespace login
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void btnLogin_Click(object sender, EventArgs e)
{
string sql = "select userpwd from userinfo where username=@name";
SqlParameter p = new SqlParameter("@name", txtName.Text);
object pwd = SqlHelper.ExecuteScalar(sql, p);
if(pwd==null)
{
MessageBox.Show("用户名错误");
}
else if (pwd.ToString().Equals(Md5Helper.Encrypt(txtbwd.Text)))
{
MessageBox.Show("登录成功");
}
else
{
MessageBox.Show("密码错误");
}
}
}
}
2、登录代码:(锁定15分钟)
(1)登录逻辑(重要)

(2)数据库

(3)初级代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using t1_UserLogin; namespace login
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void btnLogin_Click(object sender, EventArgs e)
{
#region 锁定15分钟 string sql = "select count(*) from userinfo where username=@name";
SqlParameter p = new SqlParameter("@name", txtName.Text); int count = Convert.ToInt32(SqlHelper.ExecuteScalar(sql, p));
if (count > )
{
sql =
"select count(*) from userinfo where username=@name and errorcount>=3 and datediff(Minute,errortime,getdate())<=15";
SqlParameter p11 = new SqlParameter("@name", txtName.Text);
count = Convert.ToInt32(SqlHelper.ExecuteScalar(sql, p11));
if (count > )
{
MessageBox.Show("账户已被锁定");
}
else
{
//当前未被锁定
sql = "select count(*) from userinfo where username=@name and userpwd=@pwd";
SqlParameter p12 = new SqlParameter("@name", txtName.Text);
SqlParameter p2 = new SqlParameter("@pwd", Md5Helper.Encrypt(txtbwd.Text));
count = Convert.ToInt32(SqlHelper.ExecuteScalar(sql, p12, p2));
if (count > )
{
sql = "update userinfo set errorcount=0 where username=@name";
SqlParameter p13 = new SqlParameter("@name", txtName.Text);
SqlHelper.ExecuteNonQuery(sql, p13);
MessageBox.Show("成功");
}
else
{
//出错,更新次数与时间
sql = "update userinfo set errorcount=errorcount+1,errortime=getdate() where username=@name";
SqlParameter p14 = new SqlParameter("@name", txtName.Text);
SqlHelper.ExecuteNonQuery(sql, p14);
MessageBox.Show("密码错误");
}
}
}
else
{
MessageBox.Show("用户不存在");
} #endregion }
}
}
3、登录代码:(锁定15分钟)-——————优化
(1)逻辑*(重要)

(2)代码优化
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using t1_UserLogin; namespace login
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void btnLogin_Click(object sender, EventArgs e)
{
#region 锁定15分钟-优化 string sql = "select errorcount,errortime,userpwd from userinfo where username=@name";
SqlParameter p = new SqlParameter("@name", txtName.Text); using (SqlDataReader reader = SqlHelper.ExecuteReader(sql, p))
{
if (reader.Read())
{
//当前用户名存在
int errorCount = Convert.ToInt32(reader["errorCount"]);
double errorTime1 = ;
//如果单元格返回空值,使用DBNull.Value进行判断
if (reader["ErrorTime"] != DBNull.Value)
{
DateTime errorTime = Convert.ToDateTime(reader["errorTime"]);
errorTime1 = (DateTime.Now - errorTime).TotalMinutes;
}
string pwd1 = reader["userPwd"].ToString();
string pwd2 = Md5Helper.Encrypt(txtbwd.Text);
if (errorCount >= )
{
//超过3次
if (errorTime1 <= )
{
//过时
MessageBox.Show("锁定");
}
else
{
int count1 = ;
if (pwd1.Equals(pwd2))
{
count1 = ;
MessageBox.Show("成功");
}
else
{
count1 = ;
MessageBox.Show("密码错误");
}
//字符串拼接
sql = "update userinfo set errorCount=" + count1 + ",errortime=getdate() where username=@name";
p = new SqlParameter("@name", txtName.Text);
SqlHelper.ExecuteNonQuery(sql, p);
}
}
else
{
//不足三次
if (errorTime1 <= )
{
int count1 = ;
if (pwd1.Equals(pwd2))
{
count1 = ;
MessageBox.Show("成功");
}
else
{
count1 = errorCount + ;
MessageBox.Show("密码错误");
}
sql = "update userinfo set errorCount=" + count1 + ",errortime=getdate() where username=@name";
p = new SqlParameter("@name", txtName.Text);
SqlHelper.ExecuteNonQuery(sql, p); }
else
{
int count1 = ;
if (pwd1.Equals(pwd2))
{
count1 = ;
MessageBox.Show("成功");
}
else
{
count1 = ;
MessageBox.Show("密码错误");
}
sql = "update userinfo set errorcount=" + count1 + ",errortime=getdate() where username=@name";
p = new SqlParameter("@name", txtName.Text);
SqlHelper.ExecuteNonQuery(sql, p);
}
}
}
else
{
MessageBox.Show("用户名不存在");
}
} #endregion }
}
}
ADO.NET复习总结(5)--工具类SqlHelper 实现登录的更多相关文章
- SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 后端篇(五): 数据表设计、使用 jwt、redis、sms 工具类完善注册登录逻辑
(1) 相关博文地址: SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 前端篇(一):搭建基本环境:https://www.cnblogs.com/l-y-h/p ...
- 制作ado开发辅助工具类SqlHelper
public static class SqlHelper { //通过配置文件获取连接字符创 private static readonly string constr = Configuratio ...
- vs工具类SQLhelper参考
参考 https://www.cnblogs.com/liyangLife/p/5036636.html
- 利用JDBC工具类 模拟用户登录!
一.建库 设置 id为主键并自增! 二.定义登录接口 package com.aaa.dao; public interface IDengDao { /* 1.定义一个登陆的接口,参数是name 和 ...
- PHP文件上传,下载,Sql工具类!
PHP文件上传,下载,Sql工具类! 对文件大小,文件类型 同名覆盖 中文转码的操作,可直接使用 前台 upload.html <!DOCTYPE html> <html> & ...
- 4 多表代替密码之Hill 密码_1 矩阵工具类
在说明Hill加密之前要先复习线性代数的知识,主要是关于矩阵的一些运算和概念. 一.矩阵的逆: 定义方阵M的逆矩阵应该满足M*M^-1==I,其中I是单位矩阵,比如: 但是这个地方是对英文字母进行加密 ...
- 基于Dapper二次封装了一个易用的ORM工具类:SqlDapperUtil
基于Dapper二次封装了一个易用的ORM工具类:SqlDapperUtil,把日常能用到的各种CRUD都进行了简化封装,让普通程序员只需关注业务即可,因为非常简单,故直接贴源代码,大家若需使用可以直 ...
- 【转载】微软官方提供的Sqlserver数据库操作帮助类SQLHelper类
在.NET平台中,C#语言一般使用ADO.NET组件来操作Sqlserver数据库,通过ADO.NET组件可以实现连接数据库.查询数据集.执行SQL语句以及关闭数据库连接等操作,为此网上有很多开发者自 ...
- C#工具类:使用SharpZipLib进行压缩、解压文件
SharpZipLib是一个开源的C#压缩解压库,应用非常广泛.就像用ADO.NET操作数据库要打开连接.执行命令.关闭连接等多个步骤一样,用SharpZipLib进行压缩和解压也需要多个步骤.Sha ...
随机推荐
- python中星号的意义(**字典,*列表或元组)
传递实参和定义形参(所谓实参就是调用函数时传入的参数,形参则是定义函数是定义的参数)的时候,你还可以使用两个特殊的语法:*.** . 调用函数时使用* ,** test(*args)中 * 的作用:其 ...
- Java源码解读(一)——HashMap
HashMap作为常用的一种数据结构,阅读源码去了解其底层的实现是十分有必要的.在这里也分享自己阅读源码遇到的困难以及自己的思考. HashMap的源码介绍已经有许许多多的博客,这里只记录了一些我看源 ...
- python实现二分查找算法
二分查找算法也成为折半算法,对数搜索算法,一会中在有序数组中查找特定一个元素的搜索算法.搜索过程是从数组中间元素开始的 如果中间元素正好是要查找的元素,则搜索过程结束:如果查找的数大于中间数,则在数组 ...
- IIS Express总结
IIS Express可以说是.NET web开发者必用的服务器,日日夜夜都和它打交道.一直以来,除了遇到什么点什么问题,很少会去关注过它. 今天看到以前转载的一篇博客,就再次温故下,主要包含IIS ...
- angular4.0常用依赖汇总
Routes 路由配置 Router 路由跳转 ActivatedRoute 路由参数 FormsModule 表单配置(在app.module.ts中注入在imports下) EventEmitte ...
- Java学习笔记12(面向对象五:构造方法、this再探)
在开发中,经常需要在创建对象的同时明确对象对的属性值, 比如一个Person对象创建时候就应该有age和name等属性 那么如何做到在创建对象的同时给对象的属性初始化值呢? 这里介绍构造方法: 1.构 ...
- python爬虫下载文件
python爬虫下载文件 下载东西和访问网页差不多,这里以下载我以前做的一个安卓小游戏为例 地址为:http://hjwachhy.site/game/only_v1.1.1.apk 首先下载到内存 ...
- Windows数据库编程接口简介
数据库是计算机中一种专门管理数据资源的系统,目前几乎所有软件都需要与数据库打交道(包括操作系统,比如Windows上的注册表其实也是一种数据库),有些软件更是以数据库为核心因此掌握数据库系统的使用方法 ...
- windows 驱动开发入门——驱动中的数据结构
最近在学习驱动编程方面的内容,在这将自己的一些心得分享出来,供大家参考,与大家共同进步,本人学习驱动主要是通过两本书--<独钓寒江 windows安全编程> 和 <windows驱动 ...
- vim保存时提示: 无法打开并写入文件
命名内容已经写入,但是不知怎的就是没法保存,估计是权限不足的问题. 切换到root用户,进行了同样的操作,发现没有该问题了. 经验教训:编辑配置文件时,记得切换到root用户进行编辑.