今天,如愿以偿完成了用户登录的编写,可实现限制用户的登录次数,本段代码设置为在用户连续三次登陆错误后,限制其登录,并获取本机时间,使其一分钟后进行登录。
using System;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Configuration;
using System.Data.SqlClient;
namespace 复习_用户登录
{
public partial class Form1 : Form
{
string strcon = string.Empty;
public Form1()
{
InitializeComponent();
}
private void btnLogin_Click(object sender, EventArgs e)
{
//从app.config文件中获取节点的name属性为strcon的connectionString的值,也就是获取对应的连接字符串
strcon = ConfigurationManager.ConnectionStrings["sqlstr"].ConnectionString;
DataTable dt = GetDatetable();
int error = GetError();
if (error >= 3)
{
DateTime errortime = GetErrortime();
TimeSpan span = DateTime.Now.Subtract(errortime);
double min = span.TotalMinutes;
if (min < 1)
{
MessageBox.Show("您已经三次登录失败,账户已被锁定,请一分钟后再次登陆,或到柜台解锁!");
return;
}
else
{
error = 0;
UpdateErrors(error);
}
}
//根据datatable对象中的数据的行数来判断用户输入的是否正确
if (dt.Rows.Count <= 0)
{
error++;
UpdateErrors(error);
UpdatErrortime();
MessageBox.Show("请输入正确的用户名或密码!");
}
else
{
MessageBox.Show("登录成功!");
}
}
//获取数据库中用户最后输入错误的时间
private DateTime GetErrortime()
{
SqlConnection sqlcnn = new SqlConnection(strcon);
SqlCommand sqlcmm = new SqlCommand();
sqlcmm.CommandText = "select errortime from T_User where UserName=@name";
sqlcmm.Parameters.AddWithValue("@name", txtUserName.Text);
sqlcmm.Connection = sqlcnn;
sqlcnn.Open();
object obj = sqlcmm.ExecuteScalar();
return Convert.ToDateTime(obj);
}
//在数据库中,更新用户输入错误的时间
private void UpdatErrortime()
{
SqlConnection sqlcnn = new SqlConnection(strcon);
SqlCommand sqlcmm = new SqlCommand();
sqlcmm.CommandText = "update T_User set errortime=@errortime where UserName=@name";
sqlcmm.Parameters.AddWithValue("@errortime",DateTime.Now);
sqlcmm.Parameters.AddWithValue("@name", txtUserName.Text);
sqlcmm.Connection = sqlcnn;
sqlcnn.Open();
sqlcmm.ExecuteNonQuery();
}
//在数据库中,更新用户输入错误的次数
private void UpdateErrors(int error)
{
SqlConnection sqlcnn = new SqlConnection(strcon);
SqlCommand sqlcmm = new SqlCommand();
sqlcmm.CommandText = "update T_User set error=@error where UserName=@name";
sqlcmm.Parameters.AddWithValue("@error",error);
sqlcmm.Parameters.AddWithValue("@name", txtUserName.Text);
sqlcmm.Connection = sqlcnn;
sqlcnn.Open();
sqlcmm.ExecuteNonQuery();
}
//获取数据库中用户输入错误的次数
private int GetError()
{
SqlConnection sqlcnn = new SqlConnection(strcon);
SqlCommand sqlcmm = new SqlCommand();
sqlcmm.CommandText = "select error from T_User where UserName=@name";
sqlcmm.Parameters.AddWithValue("@name", txtUserName.Text);
sqlcmm.Connection = sqlcnn;
sqlcnn.Open();
object obj = sqlcmm.ExecuteScalar();
if (DBNull.Value.Equals(obj) == true)
{
return 0;
}
else
{
return Convert.ToInt32(obj);
}
}
private DataTable GetDatetable()
{
//建立了程序到数据库的连接,好比铺设了一条水管
SqlConnection sqlcnn = new SqlConnection(strcon);
//存储要像数据库管理系统发送的一条sql语句
SqlCommand sqlcmm = new SqlCommand();
//指明要像哪个数据库发送sql语句
sqlcmm.Connection = sqlcnn;
sqlcmm.CommandText = "select * from T_User where UserName=@username and Password=@password";
//使用用户输入的内容替换sql语句中@username和@password占位符
//sqlcmm.Parameters.Add(new SqlParameter("@username", txtUserName.Text));
//sqlcmm.Parameters.Add(new SqlParameter("@password", txtPassword.Text));
/*最新的方式,内部还是调用了sqlcmm,parameter,add方法*/
sqlcmm.Parameters.AddWithValue("@username", txtUserName.Text);
sqlcmm.Parameters.AddWithValue("@password", txtPassword.Text);
//数据适配器,向数据库发送命令
SqlDataAdapter adapter = new SqlDataAdapter(sqlcmm);
//内存中的表格,用来存储从数据库中返回的数据
DataTable dt = new DataTable();
adapter.Fill(dt);
sqlcmm.Dispose();
//关闭连接
//sqlcnn.Close();
//释放资源
sqlcnn.Dispose();
return dt;
}
}
}