数据库查询的一般写法:从登陆验证小案例中得到的一些启示和经验

这几天做了一个登陆验证的案例,主要功能就是:用户输入密码进行登陆,如果输错密码三次则15分钟内不能登陆。

这个案例确实不复杂,但是其中的逻辑第一次理解确实很别扭。

从这个小案例中,我得到了几个启示,并打算以后写类似的程序都执行此标准

  1.该项目中,和sql有关的操作统统放到SqlHelper中 ---所有相同的操作都应该单独定义成一个助手类。

  2.该项目中,使用了参数化查询有效防止了sql注入漏洞 ---所有关于查询的并且值由用户输入的sql语句,一律不准用字符串拼接

  3.该项目中,判断用户是否存在的办法是使用SqlDataReader读取数据,然后判断dr.HasRows ---
这样做简便了查询,而且将整行的值取出,其他数据可以被另外代码使用

从这个项目中,我学到了这几点新知识

  1.比较数据库中存储的时间和当前的时间相差多少分钟、多少小时、多少天……都可以使用dateDiff函数。而不需要将它取出来用.NET的DateTime类来处理(利用TimeSpan=DateTime-DateTime)

  2.用户密码输错三次15分钟后的业务逻辑

窗体文件:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data;
using System.Data.SqlClient;

namespace 密码输错三次15分钟后重试
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void btnLogin_Click(object sender, EventArgs e)
{
if (String.IsNullOrWhiteSpace(txtUserName.Text)
|| String.IsNullOrWhiteSpace(txtPassWord.Text))
{
MessageBox.Show("输入有误!");
return;
}

using (SqlConnection conn = new SqlConnection("server=.;database=WebSite;uid=sa;pwd=123456"))
{
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "select *,datediff(minute, uLastErrTime,getdate()) from UserInfo where [email protected]";
cmd.Parameters.Add(new SqlParameter("@name", txtUserName.Text.Trim()));

conn.Open();
//使用using对SqlDataReader进行资源管理
using (SqlDataReader dr = cmd.ExecuteReader())
{

if (dr.HasRows)
{
dr.Read();

if (dr.GetInt32(5) > 15)
{
//重置uErrTimes
SqlHelper.ResetErrTimes(dr.GetInt32(0));
}

//加上这句话,可以解决结果集不同步的情况
//判断次数只能在时间小于15分钟的情况下才能进行
if (dr.GetInt32(5) <= 15)
{
if (dr.GetInt32(3) >= 3)
{
MessageBox.Show("密码错误已三次,请在15分钟后登陆!");
return;
}
}

if (String.Equals(dr.GetString(2), txtPassWord.Text.Trim()))
{
MessageBox.Show("登陆成功!");
}
else
{
MessageBox.Show("密码错误,登陆失败");
//更新错误次数
SqlHelper.UpdateErrTimes(dr.GetInt32(0));
//记录错误时间
SqlHelper.RecordErrTime(dr.GetInt32(0));
}

}
else
{
MessageBox.Show("不存在此账户!");
return;
}
}

}
}
}
}
}

SQlHelper.cs助手类


//文件:SqlHelper.cs
//作者:Me
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Windows.Forms;

namespace 密码输错三次15分钟后重试
{
/// <summary>
/// 包含各种对数据库的操作
/// </summary>
class SqlHelper
{
/// <summary>
/// sql链接字符串
/// </summary>
private static string sqlStr = "server=.;database=WebSite;uid=sa;pwd=123456";

/// <summary>
/// 更新错误次数
/// </summary>
/// <param name="id"></param>
public static void UpdateErrTimes(int id)
{
using (SqlConnection conn = new SqlConnection(sqlStr))
{
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "update UserInfo set uErrTimes=uErrTimes+1 where [email protected]";
cmd.Parameters.Add(new SqlParameter("@id", id));
try
{
conn.Open();
cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
MessageBox.Show("数据库失败!" + ex.Message);
}
}
}

}

/// <summary>
/// 重置错误次数
/// </summary>
/// <param name="id"></param>
public static void ResetErrTimes(int id)
{
using (SqlConnection conn = new SqlConnection(sqlStr))
{
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "update UserInfo set uErrTimes=0 where u[email protected]";
cmd.Parameters.Add(new SqlParameter("@id", id));
try
{
conn.Open();
cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
MessageBox.Show("数据库失败!" + ex.Message);
}
}
}
}

/// <summary>
/// 记录错误时间
/// </summary>
/// <param name="id"></param>
public static void RecordErrTime(int id)
{
using (SqlConnection conn = new SqlConnection(sqlStr))
{
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "update UserInfo set uLastErrTime=getdate() where [email protected]";
cmd.Parameters.Add(new SqlParameter("@id", id));

try
{
conn.Open();
cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
MessageBox.Show("数据库失败!" + ex.Message);
}
}
}
}

}
}

数据库查询的一般写法:从登陆验证小案例中得到的一些启示和经验,布布扣,bubuko.com

时间: 2024-10-06 06:03:40

数据库查询的一般写法:从登陆验证小案例中得到的一些启示和经验的相关文章

黑马day05 session实现登陆&amp;注销小案例

本案例主要使用session实现登录与注销的功能. 1.登录页面 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title&g

session应用----登录验证小案例

1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <% 3 String path = request.getContextPath(); 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+requ

爆料:为什么Entity Framework不能进行跨数据库查询

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 在上篇随笔中提到"对于跨数据库查询,我们没有找到通过LINQ to Entities实现的方法".后来仔细想想,从理论来讲,实现跨数据库查询应该不难啊,与非跨数据库查询相比,只是多了个数据库名,比如下面的非跨数据库查询语句: SELE

iBatis.Net(C#)数据库查询

引用请注明http://www.cnblogs.com/13590/archive/2013/03/14/2958735.html  摘要:查询是数据库SQL语言的核心,本文介绍了通过iBatis.Net对数据库的简单查询.条件查询.动态查询和多表查询. 关键词:iBatis.Net:动态查询:多表查询:数据映射 查询是数据库SQL语言的核心,SQL语言只提供唯一一个用于数据库查询的语句,即SELECT语句.用于表达SQL查询的SELECT语句是功能最强也是最复杂的SQL语句.而在实际的项目开发

【Java EE 学习第70天】【数据采集系统第二天】【数据加密处理】【登陆验证】【登陆拦截器】【新建调查】【查询调查】

一.数据加密处理 这里使用MD5加密处理,使用java中自带加密工具类MessageDigest. 该类有一个方法digest,该方法输入参数是一个字符串返回值是一个长度为16的字节数组.最关键的是需要将这个16位的字节数组转换成为32位的字符串,转换方法是使用位移+与运算.将高四位移到低四位&0X0F得到一个字符,直接使用该值&0X0F得到一个字符,这样一个8bit的字节就能够拆成2个字符.最终16Byte就能够转换成为32个字符. 1 package com.kdyzm.utils;

原生PHP和MYSQL练习登陆验证和查询数据到表格

直接上代码吧 <?php header("Content-type: text/html; charset=utf-8"); //数据量链接 $conn=mysqli_connect("127.0.0.1",'bc',"HGEAfZdSbaXHD5NA",'test'); //需求一 // 登陆验证密码 function checkuser($conn,$username,$password) { $res=0; $sql="se

python操作mysql数据库小程序,用户登陆验证

已经建立一个mysql数据库school,里面包含一个表userinfo,表里有3个字段,分别为user_id,username,passwd,即序号(自增字段),用户名,密码. 已经该数据库中存放了若干用户的帐户信息,现在要求用python编写一段小程序,实现由用户输入自己的用户名和密码,完成登陆验证,输入正确的帐号, 显示"welcome",非正确的帐号,显示"failed log in" import pymysql conn = pymysql.connec

shiro(二)自定义realm,模拟数据库查询验证

自定义一个realm类,实现realm接口 package com; import org.apache.shiro.authc.*; import org.apache.shiro.realm.Realm; public class MyRealm implements Realm { /** * 获取当前realm的名称 * @return */ @Override public String getName() { return "MyRealm"; } /** * 判断当前认证

【Java EE 学习第20 天】【使用过滤器实现登陆验证、权限认证】【观察者模式和监听器(使用监听器实现统计在线IP、登录IP 、踢人功能)】

一.使用过滤器实现登录验证.权限认证 1.创建5张表 /*使用过滤器实现权限过滤功能*/ /**创建数据库*/ DROP DATABASE day20; CREATE DATABASE day20; USE DAY20; /*用户表*/ DROP TABLE IF EXISTS USER; CREATE TABLE USER( userid VARCHAR(32) , username VARCHAR(32), userpassword VARCHAR(32), CONSTRAINT pk_us